【网络协议模糊测试实战】使用sulley对PCManFTP进行模糊测试

0x01 准备工作

1、首先需要安装好sulley,具体安装流程可以参考https://blog.csdn.net/u012397189/article/details/76084919

     这篇文章介绍的很详细,按照上面的安装步骤即可安装好sulley

2、准备好两台机器或者安装虚拟机,如果只使用一台机器既作为服务器又作为发送测试用例的机器,那么sulley在windows系统下无法抓到测试用例的报文包。如果此时发生crash,你将不知道这个crash发生在哪个报文处

3、wireshark是必要的,用它来查看发送的报文是什么样的

4、在两台机器(或者本机和虚拟机,以下同)上同时安装好wireshark和sulley

0x02 实验环境

    接下来我将仔细说明一下我的实验的实验环境。

1、我使用虚拟机win7 32位 + 本机win10 64位的环境,在两台机器上分别安装了wireshark以及sulley

2、然后准备好要用的PCManFTP服务器,并且将这个服务器放在虚拟机里面,这个服务器我是从这里下载的:https://download.csdn.net/download/l1028386804/10922577

3、我将本机作为发送测试用例的机器,将虚拟机作为服务器端(IP地址:192.168.255.129)

0x03 sulley脚本编写

from sulley import *

s_initialize("user")
s_static("USER")
s_delim(" ")
s_string("justin")
s_static("\r\n")
s_initialize("pass")
s_static("PASS")
s_delim(" ")
s_string("justin")
s_static("\r\n")
s_initialize("cwd")
s_static("CWD")
s_delim(" ")
s_string("c: ")
s_static("\r\n")
s_initialize("dele")
s_static("DELE")
s_delim(" ")
s_string("c:\\test.txt")
s_static("\r\n")
s_initialize("mdtm")
s_static("MDTM")
s_delim(" ")
s_string("C:\\boot.ini")
s_static("\r\n")
s_initialize("mkd")
s_static("MKD")
s_delim(" ")
s_string("C:\\TESTDIR")
s_static("\r\n")

def receive_ftp_banner(sock):
    sock.recv(1024)

sess = sessions.session(session_filename="C:\\Sulley\\sulley\\audits\\easyftpserver.session",sleep_time=0.01)
target = sessions.target("192.168.225.129", 21)
target.netmon = pedrpc.client("192.168.225.129",26001)
target.procmon = pedrpc.client("192.168.225.129", 26002)
target.procmon_options = \
{
    "proc_name" : "PCManFTPD2.exe",
    "stop_commands" : ['net stop "trend serverprotect"'],
    "start_commands" : ['net start "trend serverprotect"'],
}

sess.pre_send = receive_ftp_banner
sess.add_target(target)
sess.connect(s_get("user"))
sess.connect(s_get("user"), s_get("pass"))
sess.connect(s_get("pass"), s_get("cwd"))
sess.connect(s_get("pass"), s_get("dele"))
sess.connect(s_get("pass"), s_get("mdtm"))
sess.connect(s_get("pass"), s_get("mkd"))
sess.fuzz()

       这个文件名我定为“FtpFuzz.py”,上面一大堆是在定义报文的结构,s_delim(" ")是指该字段是一个分界符,s_string("******")是指该字段是一个字符串,并且以“******”的内容进行变异,s_static("xxx")是指该字段是一个静态字段,xxx的内容在测试用例的生成中不会再变化。在运行前需要在文件中的相应目录下创建好audits目录

       后面的部分则是存放session文件,确定目标服务器ip地址、端口等等内容。最后的部分是使用发送测试用例的顺序,这个顺序应该和协议状态机有关。这个脚本比较简单,如果需要更加复杂的变异功能,请自行再看sulley的文档进行编写。

       这个文件存放在主机,即发送测试用例的机器上。

0x04 模糊测试

接下来就是重头戏模糊测试了

1、在FTP服务器开启FTP服务器

2、在sulley的目录下,应该有两个重要的python文件:“network_monitor.py”和“process_monitor.py”,前者是负责在网络上进行抓包的,后者是监视进程是否crash的,两者相互配合就能知道在进程crash时,到底发了哪个包。这两个文件是在FTP服务器端运行的。

3、运行一下network_monitor.py看看需要哪些参数,注意以下的所有cmd窗口务必使用管理员身份打开

可以看出来最底下的是网络适配器列表,它的ip地址设定的是192.168.225.129,且该适配器的编号为0

参数中最重要的几个参数 -d 用于指定网络适配器,-f 用于过滤报文,-P用于指定抓下来的报文存储在哪里

于是使用如下指令运行该程序(运行前现在c盘新建一个pcaps文件夹):

C:\sulley目录\sulley> python network_monitor.py -d 0 -f "src or dst port 21" -P C:\pcaps

该指令表示在设备0上抓包,过滤出源端口和目的端口为21的报文,将报文存放在C:\pcaps里,运行后得到如下图,表示正在等待测试

4、同样的运行一下process_monitor.py看看需要哪些参数

这里只需要 -c 参数指定crash信息存放的位置以及 -p 来指定目标进程名字即可

从图中可以看到目标进程的名字叫做"PCManFTPD2.exe"

所以我们输入以下指令对目标系统的该进程进行监视:

C:\sulley目录\sulley> python process_monitor.py -c C:\test.crash -p PCManFTPD2.exe

运行后得到

5、接下来,在本机运行之前编写好的测试python文件即可

这是在捕获报文

这是在监视进程

6、可以在服务器端c:\pcaps里看发送和响应的报文

在测试主机端的浏览器中输入127.0.0.1:26000可以查看当前模糊测试进度

最左边一行可以看到其模糊测试用例使得目标程序crash时发送的报文编号,再从pcaps文件夹里去寻找即可,同时点击进去即可发现crash的原因:

7、如果想要重新再进行测试时,需要删除发送测试用例端audits目录里的东西、服务器端pcaps以及c盘下的crash文件

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值