admin管理员组

文章数量:1537097

基本概念与环境准备

缓冲区溢出:当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被填满从而覆盖了相邻内存区域的数据。可以修改内存数据,造成进程劫持,执行恶意代码,获取服务器控制权限等。

在Windows XP或2k3 server中的SLMail 5.5.0 Mail Server程序的POP3 PASS命令存在缓冲区溢出漏洞,无需身份验证实现远程代码执行。

注意,Win7以上系统的防范机制可有效防止该缓冲区漏洞的利用:DEP。阻止代码从数据页被执行;ASLR,随机内存地址加载执行程序和DLL,每次重启地址变化。

环境准备:SLMail 5.5.0 Mail Server,ImmunityDebugger_1_85_setup.exe,mona.py

安装好环境之后,确认SLMail的端口是否正常开启:


可以看到,25、110、180、8376端口都开放了。

接着查看services.msc:


邮件相关的服务的都开启了。

接着在Immunity Debugger中调用mona.py:先到Immunity Debugger的根目录中找到PyCommands目录,如C:\Program Files\Immunity Inc\Immunity Debugger\PyCommands,然后将mona.py放入该目录中。

接着Kali Linux来ping通SLMail服务器(win 2k3 server)并用nc连接SMTP的25、110端口:



对于未知协议的模糊测试,第一种方法是查看是否有RFC,有的话查看并在用户输入的部分进行测试;第二种是没有RFC指定的协议,可以通过Wireshark来抓包、查看该协议是如何进行指令传输的、命令格式时如何的。


POP3模糊测试(110端口)

可以尝试如上对命令输入大量的数据测试是否存在溢出,一种是nc连接110端口然后手工进行测试,另一种可以用脚本实现。

手工输入大量数据测试:


使用脚本自动化测试,由于各个测试阶段脚本变化不大,在最后再贴上汇合的脚本代码:



测试PASS命令接收到大量数据时是否会溢出

改进脚本,实现不断增大发送的数据量来进行测试:

同时,先开启Immunity Debugger的动态调试,确认监听SLMail的POP3进程:





回到Kali,运行2.py脚本:


发送到2700~2900字节的数据之后,发现程序崩溃了:


41即“A”的ASCII码十六进制值,可以看到几个寄存器都被“A”占满了,其中EIP也是。EIP寄存器存放下一条指令的地址,也就是说下一条指令的地址可以被溢出覆盖。

再到services.msc中查看,POP3服务以及关闭了:


接着重启它即可。

接着确定溢出的大致的字节数范围,改进脚本3.py:


同样溢出了:


接着重启服务,修改3.py脚本中的字节大小为2600再尝试看看:


可以看到程序还是崩溃掉了,但是EIP寄存器的数值并非是发送的“A”的ASCII码,即还没溢出到EIP寄存器上。


找出精确溢出的4个字节

通常找出精确字节的方法有如下两种:

1、二分查找法

2、唯一字串法:

这里为了方便便使用唯一字符串法,其可在Kali Linux的/usr/share/metasploit-framework/tools/exploit/pattern_create.rb脚本中可以生成唯一字符串:


然后将该字符串替换到脚本的buffer中。运行4.py:



可以看到,EIP寄存器的值为39694438。

由于内存地址和通常人们书写的顺序是相反的,即内存低地址放在高位、内存高地址放在低位,因而要将该值调换一下顺序编程我们所认知的顺序表示:

先分割:39 69 44 38,再调换顺序:38 44 69 39,然后查看ASCII码表可知其代表:8Di9

接着到Kali的Metasploit的相同目录/usr/share/metasploit-framework/tools/exploit/下调用与之前那个脚本相对应的脚本文件pattern_offset.rb:


可以看到,精确到了2606的位置,即8Di9之前有2606个字符。

接着修改脚本来验证精确位置是否准确:


本文标签: 缓冲区WindowsSLMail