首页
社区
课程
招聘
[分享][原创]FTPServer的Fuzzing
2021-4-12 13:27 10786

[分享][原创]FTPServer的Fuzzing

2021-4-12 13:27
10786

ftpserver的fuzzing测试

  1. 格式解析
    1.1 FTP协议简介
    FTP采用双连接来进行文件的传输:控制连接用于服务器和客户端之间命令的交互以及响应,而数据连接则用于文件数据的传输。服务端打开用于FTP控制连接的TCP端口21(标准),等待FTP客户端的连接。当客户端需要登陆FTP服务器时,主动打开本地TCP端口21,与服务端建立连接(控制连接)。该连接始终等待客户和服务器之间的通信,将命令从客户端传递到服务器,并传回服务器的应答。每当需要文件传输时,就创建一个数据连接。
    图片描述
    命令和应答在客户和服务器的控制连接上以ASCII码形式传送。以下为常用的FTP命令:
    图片描述
    FTP应答是ASCII码的3位数字,并跟有报文选项:
    125 数据连接已经打开;传输开始。
    200 就绪命令。
    214 帮助报文(面向用户)。
    331 用户名就绪,要求输入口令。
    425 不能打开数据连接。
    452 错写文件。
    500 语法错误(未认可的命令)。
    501 语法错误(无效参数)。
    502 未实现的MODE(方式命令)类型。
    1.2 socketsniff抓包分析
    启动ftpserver.exe后开启socketsnifff,并选定ftpserver进程,开启监听:
    图片描述
    在主机上使用命令ftp 192.168.18.144连接ftpserver,在连接时,ftpserver会收到两个数据包,这个信息可用于构建连接数据包:
    图片描述
    接下来发送命令,因为fuzzing操作时会反复发送命令,所以选取的命令不应对服务器或本机造成改动,pwd或dir属于较好命令。
    图片描述
    发现dir命令发送后,服务端打开了新的数据连接端口用于传输列表内容,所以选取pwd最为方便,且在数据包中直接使用XPWD作为命令行。
    2 Pit编写
    2.1 DataModel
    需要编写“发送用户名——发送密码——发送执行命令”,而且ftp是交互式的,但对于服务端的回答,本测试中无需考虑。
    图片描述
    2.2 StateModel
    FTP是一个连贯的交互过程,所以是output和input的交替。
    图片描述
    2.3 Agent
    同样规定好监视器路径和命令行即可。
    图片描述
    2.4 Test
    最后是测试环节,这里有一个不同,为了使我们的xml具有通用性,这里的Host和Port并不是固定的,而是以参数形式提供。同时变异策略采用Sequential,及peach将按顺序对每个元素使用其所有可用的mutators进行变异。
    图片描述
    3 运行测试ftpserver.exe
    使用命令“peach -DHOST=192.168.18.144 -DPORT=21 ./samples/ftp1.xml Test”
    图片描述
    可以在log文件夹下找到测试出的较多触发漏洞情形:
    图片描述
    选取其中一个打开,查看记录,发现eip被覆盖了,确实有漏洞
    图片描述
    再去查看此时对应的输入
    图片描述
    可以猜测是输入过长导致覆盖了EIP,导致的漏洞点。
    4 编写POC
    利用pwntools编写脚本尝试攻击
    图片描述
    在win7中打开ftpserver.exe,在kali中攻击
    图片描述
    在win7中显示ftpserver.exe停止工作,确认确实触发了漏洞。
    图片描述
    用ollydbg分析也可以发现确实有漏洞点
    图片描述
    5 漏洞点分析
    进行调试:
    单步调试时,在这一句之前EIP显示正常,而此句命令为ADD ESP,100,然后RETN
    图片描述
    但显然此时栈里全是A,ESP+100后到达AAAA区域
    图片描述
    此时再retn,会返回到AAAA中,报错
    图片描述
    在这个大函数外面是00402DE0函数(因为到这里都没有报错)
    图片描述
    用ida查看更清楚
    图片描述
    V8只有0xfc即252,测试一下这个填充长度是否正确
    图片描述
    再进行一步即到“abcd”处,可知长度正确。
    图片描述
    6 编写EXP
    可以看到他会覆盖后续栈帧,如果可以让函数执行栈顶,则可以让他执行我们的函数,所以找到JMP ESP的位置,用这个命令位置作为跳板,在ftpserver.exe板块中没有此操作,可以使用操作ALT+E来搜索其余板块,最终在ntdll模块中找到适配指令,用作jmpesp,地址是77A23B61,如果使用pwntool的p32可以自动调整大小端,如果直接输入,要小端输入。
    图片描述
    单步执行调试,发现确实可以让其跳转到JMP上:
    图片描述
    跳到了JMP上:
    图片描述
    只要让栈顶是我的指令即可,以防万一,使用一些NOP雪橇,下方红框为指令区,使用的是弹框指令来测试漏洞效果。
    图片描述
    要找到这个弹框函数,可以右击“查找->所有模块中名称”,就可以找到弹框函数MessageBoxA的地址,用来作为shellcode的编写地址。
    图片描述
    弹框内容作为参数压栈:
    图片描述
    所以EXP如下:
    图片描述
    测试效果如下:
    图片描述
    如果要看细节弹框位置,可以单步调试如下:
    图片描述
    参考网站:
    https://blog.csdn.net/u012763794/article/details/53291788
    https://baijiahao.baidu.com/s?id=1664388740959677598&wfr=spider&for=pc

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

最后于 2022-2-3 11:19 被kanxue编辑 ,原因:
收藏
点赞5
打赏
分享
最新回复 (5)
雪    币: 12090
活跃值: (15469)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2021-4-12 13:57
2
0
感谢分享
雪    币: 12776
活跃值: (16307)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
有毒 10 2021-4-22 17:06
3
0
师傅方便的话修改一下文章标题吧,《FTPServer的Fuzzing》这种。只是Fuzzing,有些些迷惑
雪    币: 733
活跃值: (1355)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
狐臭 2021-4-23 16:37
4
0
preach这种fuzzer已经生存不下去了,afl有个peach改过去的扩展项目可以试一试
雪    币: 610
活跃值: (3614)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
光刃 3 2023-12-23 19:51
5
0
狐臭 preach这种fuzzer已经生存不下去了,afl有个peach改过去的扩展项目可以试一试
peach完全可以生存下去。
并且peach不依赖代码分析,可以生存的更好。 
我认为peach比afl适用面要广的多。
雪    币: 19485
活跃值: (29158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-12-23 22:49
6
1
感谢分享
游客
登录 | 注册 方可回帖
返回