1. 软件简介
PCMan's FTP Server是洪任谕程序员所研发的一套FTP服务器软件。该软件具有体积小、功能简单等特点。建立连接如图1所示:
图1连接说明图
2. 漏洞成因
PCMan's FTP Server 2.0.0版本中存在缓冲区溢出漏洞。远程攻击者可借助USER命令中的长字符串利用该漏洞执行任意代码。通过在recv函数上下断点持续跟踪,发现服务端在接收到登录请求之后,会将收到的信息进行字符串拼接,而在字符串拼接的地方,并未进行长度控制.因此导致缓冲区溢出。
3. 利用过程
3.1 环境搭建
(1) 首先要安装WDK,WDK是WinDbg自带
(2) 安装Python2.7.2
(3) 安装Visual C++ 2008运行库
(4) 安装WinDbg的Python插件”Pykd”(手动安装)
(5) 运行WinDBG开始调试后,输入一下命令(手动安装)
3.2 溢出测试
(1)用Mon2生成一段3000字节长度的测试代码(字符串)用于确定溢出点,3000如图6所示:
4. PoC
首先用windbg的mona2工具生成0x3000大小的有规律数据” A0A1A2A3A4A5A6A7A8A9一直到E0E1E2E3E4E5E6E7E8E9”,然后编写FTP登陆程序给软件传送这段数据,得到溢出偏移值是2002。构建一个的字符串:"USER "(5字节)+垃圾指令(2005字节)+ 跳板指令(4字节)+ shellcode代码(不含0x00,0x0A,0x0D,0x20特殊ASCII)+ "\r\n"(2字节)。demo源代码:有一份能与FTP进行交互的代码才能受控的触发此漏洞。理论上讲,只要我们编写的代码符合RFC959标准,就可以与任何一个FTP服务器进行交互 ,不过FTP客户端的实现非常简单,我们完全没必要去阅读RFC959文档,我们只需作如下几步:
(1) 建立Socket链接,连接目标FTP
(2) 接受FTP服务器的欢迎语
(3) 发送“USER XXXX”登录请求
(4) 接受请求结果(不会走到这一步,此时FTP服务器已被攻击完)
4.1 构造测试
(1)然后打开vs开始编写发送测试数据包 ,
数据包说明图
4.2 jmp esp
(1)查找esp在所有模块中命令
指令说明图
(2)查找esp在kernel32.dll模块中命令
指令说明图
4.3 实现
(2)建立套接字,socket
socket说明图
(3)运行结果,弹出个MessageBox窗口
窗口说明图
5. 结语
漏洞是由于将客户端的命令使用sprintf连上时间日期等信息后储存到局部变量,再写到日志文件中,而没有进行命令长度的检测,导致缓冲区溢出的发生。缓冲区溢出一般是没有进行边界检查,或使用了不安全的函数,避免这个情况能大大提高安全性。
6. 参考资料
[1] 《0day安全:软件漏洞分析技术(第2版)》 王清 著