PYTHON SULLEY HACKING War-ftpd

article/2025/10/7 17:19:06

走过路过,不要错过这个公众号哦!

目 的

1

Sulley是一个使用PYTHON编写的模糊测试框架。与其他FUZZING测试软件相比,Sulley兼顾网络抓包,崩溃信息报告生成以及自动化VMWARE管理功能。

本次我们将部署Sulley,并且使用该框架对war-ftpd进行FUZZING测试,使学生快速体验到Sulley的强大之处。

 知识

2

1、 Sulley的安装教程

1. 安装winpcap-4.12.exe。(用于抓取数据包)

2. 安装pcapy-0.10.5.win32-py2.7-winpcap4.1.2.exe(用于为抓包提供python接口)

3. 安装impacket-0.9.11.win32.msi(用于对数据包进行解码和构建)

4. 将sulley-master文件夹下的sulley,utils和requests文件夹放到c:\python27\lib\site-packages\目录下。(sulley核心文件)

5. 将pydbg_master资料中的四个文件夹放到c:\python27\lib\site-packages\目录下。其中utils文件夹和sulley的文件夹会重复,选择合并即可。(sulley使用部分pydbg模块)

6、测试。执行sulley文件夹下的network_monitor.py和process_monitor.py,如果不报错,则安装成功。

2、本次使用两台PC,均需要安装Sulley框架。被测试主机 IP 192.168.85.141, 测试主机  IP 192.168.85.151

具体步骤

3

war-ftpd这款ftp服务器在验证用户登陆时存在缓冲区溢出漏洞,本文我们将带小伙伴们使用Sulley这款Fuzzing测试框架来验证该漏洞的存在。具体思路如下:

1、 创建ftp fuzzing数据表示。

2、 创建网络监视器代理,进程监视器代理,测试。

3、 使用WEB访问监控,查看异常详情信息。

3.1 创建ftp fuzzing数据表示。

从步骤描述中提取到用户信息,ftp登陆漏洞。ftp登陆使用的是USER xxxx PASS xxxx模式来登陆。我们需要构造到的就是关于xxxx的畸形数据,并测试是否能够造成war-ftpd.exe异常。

Sulley中提供了多种数据表示。对于在测试中不需要变换的字符串,使用s_static函数即可。对于一般的需要变换的字符串,则使用s_string。对于像test@test.com这样的字符串,也可以进行细小化分割,可自定义分隔符,比如@符号和.符号,这时候使用的函数为s_delim()。对于分隔符的畸形数据包括重复,替换和删除。

举例来说,如果使用s_string(“hettian”),那么产生的数据包括了诸如”heetianAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA”等畸形数据。

用户在使用的过程中,不需要定义畸形行为,使用系统提供的畸形变换机制已经可以满足正常需求。

为了完成本次测试,我们需要对登陆过程中的账户名和密码进行FUZZING变换。编写ftp.py,内容如下。

首先我们初始化了两个变量user和pass(s_initialize),以供将来sulley框架调用。对于不变的数据使用了s_static,而对于需要变化的数据,则使用了s_string。这样,我们的数据将来可能是 USER hacker-fuzzing PASS hacker-fuzzing.(hacker-fuzzing 表示对应产生的fuzzing数据)。

编写完成后,将ftp.py放置到测试程序(ip 151)c:\python27\lib\site-packages\requests目录下以供将来测试使用。

3.2 创建网络监视器代理,进程监视器代理。

这一部分是Sulley测试框架的核心。测试主机并没有直接对被测试程序进行访问,而是通过中间代理来间接测试。通过进程监视代理可以查看进程的运行情况,网络监视代理又可以记录fuzzing测试过程中产生的流量。网络监视代理被硬编码为端口号26001,进程监视代理被硬编码为端口号26002.

下一步骤在被测试主机上设置(IP141)

1、 查看进程监视代理模块。切换到sulley_tools目录,执行process_monitor.py

-c参数:当目标测试程序发生异常时,所有现场信息都会记录到指定的文件中,等到测试结束之后我们可以从该文件中提取处所有的异常报告。

-p参数:进程代理需要指定目标测试程序的进程名,这样,进程代理通过进程名就可以找到该进程的PID值,从而起到监控的作用。

-port参数 指定进程代理监听端口。该端口是测试程序与进程代理的通信端口。默认设置26002,一般情况下我们无须修改。

 

进程监视模块运行在与目标测试程序war-ftpd.exe相同的系统下。根据我们的需要,若将异常文件定义为c:\war-ftpd.crash.那么在被测试系统上,则此脚本填充的参数如下图所示:

执行完成之后,下方列出了参数详情列表。可以看出,通过此项设置,远程测试程序可以与进程监控代理通信,而代理又通过程序名可以找到目标测试程序。这样间接的,就可以实现远程测试程序对目标程序的测试,而且还能记录下来所有的异常信息。当程序执行完毕之后,默认会打开26002端口进行监听。

输入 netstat –ano |find “26002”,可获得执行监听的程序PID。通过使用tasklist /fi “pid eq 1980”即可找到对应的进程名。(1980为对应的PID名,实验中可能不一样)

可以看到,运行着process_monitor.py的python.exe打开了26002端口进行监听。

2、 查看网络监控模块。切换到sulley目录,执行network_monitor.py

网络监控模块也是一个中间代理。测试程序发过来的数据包被监听到该模块用于记录。

-d参数:因为网络监控模块是对数据包的捕获,因此需要提供一个网络设备。

网络设备可以从最下方的Network Device List中获得。我们需要的是前方的索引号。在本例中,索引为0的网卡ip地址为192.168.85.141。

-f参数:定义了需要过滤的数据包类型,和wireshark的抓包过滤一致,使用的是BPF语法。通过定义该项,可以只记录感兴趣的数据包,以便后期分析整理。

-P参数:定义了将接收到的测试数据包存放在哪里。后面的路径在测试前必须存在。

网络监控模块默认监听端口为26001,这里我们不需要设置。

 

本次测试是针对ftp,因此应该将抓包过滤语法定义为“src or dst port 21”。在测试前,笔者创建了目录c:\war_ftp_pcaps。用于存放截取到的网络数据包。整条命令如下图所示:network_monitor.py –d 0 –f  “src or dst port 21” –P c:\war_ftp_pcaps

这时候,网络监听模块开始等待请求。系统的26001端口也已经被打开。

3、 测试程序的编写,本步骤在测试主机(IP151上运行)

在两个监控程序都已经启动的情况下,我们来完成测试程序的编写,程序命名为ftp_session.py。

Ftp模块是我们在任务一中编写的ftp测试数据表示,它指明了我们将要怎样生成fuzzing数据。所以使用 from requests import ftp导出。

ftp在接入的时候ftp服务器会通过socket发送欢迎信息,我们需要对此进行接收处理,这就是receive_ftp_banner函数要做的是事情。

Session会话是指当程序出现异常并处理后,可以保证接着下一个测试用例进程测试。因此需要有文件记录,本实验中我们把它记录在audits目录下(实验前目录必须存在),文件名为

war2ftpd.session.

Target需要注册的信息有:

目标IP和端口,通过session.target添加

Target.netmon即对应的网络监控代理,通过pedrpc.client添加

Target.procmon即对应的进程监控代理,同样通过pedrpc.client添加。

Target.procmon_options中定义了目标程序名,通过{“proc_name”:”aim_name”}

此时target注册完毕。

 

在session部分,首先将receive_ftp_banner和属性pre_send绑定起来,这样在发送fuzzing数据之前就可以收到ftp欢迎信息。

通过s_get获得对应在ftp中命名的fuzzing变量以产生畸形字符串。

sess.connect()用于组合命令集。我们首先对user账户认证做了单独组合,又将账户和密码混合起来做了一次组合。

在最后使用sess.fuzz()即可开始fuzzing测试。

4、 部署测试环境。

首先在目标主机141上启动:network_monitor.py,process_monitor.py和war-ftpd.exe。

War-ftpd打开之后,点击闪电,打开服务,呈online状态。

接着在测试机151上需要启动:ftp_session.py即可。此时可以看到测试过程:

另一方面,在被测试主机141上,我们可以看到network.py记录了捕获到的数据包。

而process_monitor.py也开启了监控模式。

一小会之后,程序报错。在测试主机151上可以看到下列情况:

同时在141被测试主机上可以看到:

这时候war-ftpd.exe已经退出了。如果想要继续,那么重新打开war-ftpd.exe,开启ftp服务即可接着继续测试。

在实验过程中,如果出现长时间的异常,请关闭所有程序并重新执行操作。由于Sulley提供会话机制,所以整个测试会从上次断掉的地方重新开始。

 

3.3使用WEB访问监控,查看异常详情信息。

1、 一旦测试开始,测试主机(IP151)上会开启一个端口为26000的web服务。输入http://127.0.0.1:26000,可访问该页面。

友好的界面显示了测试过程。Total进度表示总进度,从图中可以看出我们在针对user进行fuzzing测试。两侧的pause按钮和resume按钮可以暂停和继续整个测试过程。

2、 点击testcase序号,进入详情。

可以看到,堆栈被A给填充以至于溢出了。Sulley使用的是pydbg框架,这里的测试报告和我们在pydbg教程中提到的一样。

3、 等到测试结束,或者不再想深入测试的时候,我们需要对现场信息整理。

我们可以看到,这些异常基本上都是同一种类型的异常。也没有必要再多测试几次了。

这时候,回到我们的测试主机(141)上来。网络监听代理已经将所有监听到的数据包都记录在了这里。并且这些数据包的编号和测试编号的大小一致。

如果测试用例比较多怎么办,如何筛选出来造成异常的数据包来重现攻击。Sulley为我们提供了一个工具叫做pcap_cleaner.py。

可以看到参数为 crash文件名和存放数据包的路径名。

我们记录的异常文件名为c:\war-ftpd.crash, 存放的数据包路径为c:\war_ftp_pcaps.

执行之后,我们来看下数据包目录。

可以看到,剩余的都是有效数据包,这些数据包的载荷能够使war-ftpd程序崩溃。

双击任意一个文件,wireshark会载入。我们以2为例。

右键跟随TCP流,查看会话。

可以看到,正是这段恶意填充的畸形数据A导致了缓冲区溢出。

4、 当测试结束之后,web界面无法打开,如果我们需要查看异常信息,可以使用命令行。Sulley提供给我们一个脚本 crashbin_explorer.py.

必选参数:异常文件名,可选参数 –t 异常序号,则显示该异常的详细信息。

输入crashbin_explorer.py c:\war-ftpd.crash.

效果和在web上一致。如果要查看2号的详细信息,后面再添加-t 2即可。由于文件较大,在命令行后加上 >a.txt,即可转存到a.txt中,方便我们查看(crashbin_explorer.py c:\war-ftpd.crash –t 2 >a.txt)

总结

4

本次我们使用Sulley这款Fuzzing测试框架验证了war-ftpd的ftp服务器在验证用户登陆时存在缓冲区溢出漏洞,其实Sulley还有其他的程序,读者可以自己查询下功能。希望本文能给大家带来一些启发,提高自身的实战动手能力。读者切记不要使用这些技术做违法的事情。如读者因此做出危害网络安全的行为后果自负,与合天智汇及本人无关,特此声明。

www.heetian.com

4006-123-731

长按图片,据说只有颜值高的才能识别哦~


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

相关文章

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

0x01 准备工作 1、首先需要安装好sulley,具体安装流程可以参考https://blog.csdn.net/u012397189/article/details/76084919 这篇文章介绍的很详细,按照上面的安装步骤即可安装好sulley 2、准备好两台机器或者安装虚拟机,如果只使用一台机器…

利用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这种约定,一台计算机可以接收其他计算机的数据,也…