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

article/2025/10/7 18:17:40

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文件


http://chatgpt.dhexx.cn/article/my1bHPI4.shtml

相关文章

利用Sulley测试easyftp服务器

测试easyftp 这次的目标就是easyftp。直接运行easyftp.exe就能启动FTP服务了。让我们先了解下FTP协议的工作流程。 1、FTP FTP是一个简单轻便的文件传输协议,被广泛的使用于各种环境中,从Web服务器到网络打印机。FTP服务器默认在端口21上监听客户端发…

模糊测试工具Sulley开发指南(2)——与Peach比较

基于已知漏洞的ftp服务器的漏洞挖掘 我们的测试对象是EasyFTP 1.7.0.11,已知漏洞如下(github): 命令个数CWD1LIST1…11 Peach 简介 MichaelW Eddington等人开发的Peach是一个遵守MIT开源许可证的模糊测试框架,最初采用Python语言编写,发布…

我的sulley安装过程

好了,最开始是在freebuf上看到的一个附录上有这个sulley的安装过程,我欣喜若狂。之后才知道这个就是人家的官方文档。 废话不多说。来贴上google安装源路劲:https://github.com/OpenRCE/sulley/wiki/Windows-Installation# 自己在贴出来看看…

Fuzzing及Sulley简介

一、模糊测试(Fuzzing) 1、泛化定义: Fuzzing是一种软件漏洞检测技术,通过提供非预期的、随机的或者错误的数据作为输入来检测软件漏洞,在软件出现崩溃时监视异常结果来找出其存在的潜在漏洞。 2、类比理解 可以将…

模糊测试工具Sulley开发指南(3)——整体介绍

我们开始来讲一些Sulley里面的整体介绍,方便我们能系统地了解Sulley的架构,了解Fuzzing的思路,最后能生成py文件来具体运行fuzzing。这章主要是整体印象,下一章开始会讲具体的模块以及如何写代码。 1.Sulley现在的情况 先说说现在…

模糊测试工具Sulley开发指南(1)——安装Sulley(多图,超详细)

本教程是针对的是windows上面的安装,至于其他系统的安装有时间的话会贴出来,本教程翻译自OpenRCE/Sulley-GitHub-Wiki官网教程,但是里面有一些错误我会更正指出。值得一提是,我是在win10 64位系统下面完成本次安装和运行(64位系统…

网络socket编程(c语言)

一.socket通信简介 Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议,主要利用三元组【ip地址,协议,端口】。 socket起…

Socket的通信原理和使用

目录 一、什么是 Socket? 二、Socket 通信过程 2.1 通信过程介绍 2.2 实现TCP建立连接的三次握手过程 三、 使用Socket进行通信【php】 3.1 PHP中Socket常量和函数介绍 3.2 php实现Socket通信过程 一、什么是 Socket? Socket 的中文翻译过来就是“套接…

linux 网络编程socket

前言 socket(套接字)是linux下进程间通信的一种方式,通常使用C-S(客户端-服务端)的方式通信,它可以是同一主机下的不同进程间通信或者不同主机的进程通信。 socket是夹在应用层和TCP/UDP协议层间的软件抽象…

什么是socket?socket详解

“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。 ——有感于实际编程和开源项目研究。 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时&#xff…

【Python】Socket的简单应用

前言 今天“出差在外”,晚上又琐事缠身,实在也没办法特别沉下心去学什么内容,但还是不希望一天一篇的flag就此倒下,只能多多参考别人的博客浅浅学习一下python的socket应用,后续课内做实验了,学习更深入的…

http和socket关系

一、先说下HTTP网络协议栈 二、连接过程 三、重点来了,TCP套接字编程,也就是所谓的socket 四、通过比较发现http和socket完全是两个不同的概念,http是应用层的,socket是传输层和网络层的,http要基于socket实现。httpcl…

SOCKET函数详解

socket原理 1.socket socket位于应用层和TCP/IP协议通信中间,抽象成一组接口 1.服务端首先初始化Socket(),然后和接口进行绑定bind()和监听listen(),然后调用accept()进行阻塞。 2.客户端初始化socket(),然后调用connect()与服务端进行连接…

用大白话解释什么是Socket

好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 我在去年就学习过Java中Socket的使用,但对于Socket的理解一直都是迷迷糊糊…

Socket详解

“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。 ——有感于实际编程和开源项目研究。 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时&#xff…

Java socket详解

整理和总结了一下经常遇到的问题: 1. 客户端socket发送消息后,为什么服务端socket没有收到? 2. 使用while 循环实现连续输入,是不是就是多线程模式? 3. 对多线程处理机制不是很明白,希望详细讲解…

Socket的详细介绍

文章目录 前言1-Socket出现的原因1.1-Socket出现的背景1.2-Socket解决的问题 2-Socket的组成及关键点2.1-What:什么是Socket?2.2-How: Socket通信实现的步骤2.3-How: Socket编写流程 3-Socket的关键实现3.1-socket()函数创建套接字…

Socket到底是什么?

学习java网络编程一段时间后,突然被问到socket是什么?回答不上来,感觉很尴尬,于是赶紧是查阅资料。 网络由下往上分为 物理层 、数据链路层 、 网络层 、 传输层 、 会话层 、 表现层 和 应用层。 通过初步了解,我知道…

什么是Socket?

一、什么是Socket? 在计算机通信领域,socket 被翻译为“套接字”(套接字主机端口号),它是计算机之间进行通信的一种约定或一种方式。通过 socket这种约定,一台计算机可以接收其他计算机的数据,也…

Socket的学习(一)什么是Socket?

本文参考的是《Socket通信原理》https://www.cnblogs.com/wangcq/p/3520400.html 一、TCP/IP UDP是什么? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集&#xff0c…