利用Sulley测试easyftp服务器

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

测试easyftp

这次的目标就是easyftp。直接运行easyftp.exe就能启动FTP服务了。让我们先了解下FTP协议的工作流程。

1、FTP

FTP是一个简单轻便的文件传输协议,被广泛的使用于各种环境中,从Web服务器到网络打印机。FTP服务器默认在端口21上监听客户端发送的命令。现在我们要冒充成FTP客户端,向服务器发送变形过的命令数据,尝试获得服务器的权限。一个FTP服务器既可以设置成不需要密码的匿名访问或者是需要密码的认证访问。FTP认证命令的格式如下:

USER <USERNAME>
PASS <PASSWORD>

一旦客户端传入了有效的用户名和密码后,服务器就会赋予客户端,传输文件,改变目录,查询文件等各种权限。当然USER和PASS命令只是FTP服务器提供的功能中的一个子集,在认证成功后还有很多别的功能,如下。这些新的命令都要加入到我们程序的协议框架(protocol skeleton)中。FTP协议详细的命令,请看rfc959。

CWD - change working directory to DIRECTORY
DELE - delete a remote file FILENAME
MDTM - return last modified time for file FILENAME
MKD - create directory DIRECTORY

2、创建FTP协议框架

 #ftp.py
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")

协议框架完成之后,开始创建Sulley会话,把所有的请求信息连起来,同时启动进程和网络监控代理。

3、Sulley会话

Sulley会话包含了请求数据整合,网络数据包的捕捉,进程调试,崩溃报告,和虚拟机控制。先让我们定义一个会话文件,然后详细的分析每个部分。

#coding=utf-8
from sulley import *
from requests import ftp
# this is our ftp.py file
def receive_ftp_banner(sock):sock.recv(1024)sess = sessions.session(session_filename="D:\\Program Files (x86)\\Sulley\\sulley-master1\\audits\\easyftpserver.session",sleep_time=0.01)
target = sessions.target("192.168.0.100", 21)
target.netmon = pedrpc.client("192.168.0.100",26001)
target.procmon = pedrpc.client("192.168.0.100", 26002)
target.procmon_options = \
{ "proc_name" : "easyftp.exe","stop_commands" : ['net stop "trend serverprotect"'],"start_commands" : ['net start "trend serverprotect"'], 
}# Here we tie in the receive_ftp_banner function which receives
# a socket.socket() object from Sulley as its only parameter
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()
  • receive_ftp_banner()是必须的,因为每个FTP服务器在客户端连接上的时候,都会发送banner(标识)。我们将它和sess.pre_send 绑定起来,这样Sulley发送fuzzing数据前的时候就会先接收FTP banner。
  • 和receive_ftp_banner一样,pre_send也只接收一个由Sulley传递的sock对象。
  • 第一步我们创建一个会话文件,用于记录当前fuzzer的状态,同时控制fuzzing的启动和停止。
  • 第二步定义攻击的目标,包括IP地址和端口号。这里设置成 192.168.0.100端口21(这是我们运行easyftp的主机IP)。
  • 第三步,设置网络监控的端口为26001,IP地址和FTP服务器的地址一样,这个端口用于接受Sulley发出的命令。
  • 第四步,设置调试器监听的端口26002,这个端口用于接收Sulley发出的调试命令。procmon_options选项告诉调试器我们关注的进程是easyftp.exe
  • 第五步,在会话中加入定义好的目标对象。
  • 第六步,将FTP请求指令有序的组织好。先是认证,然后将操作指令和需要的密码成对传入。最后启动Sulley开始fuzzing。

现在我们定义好了会话,组织好了请求指令。只剩下网络和监控脚本的设置了。当这一切都完成的时候,就可以去捕捉我们的猎物了。

4、网络和进程监控

Sulley的优点之一就是能非常好的跟踪fuzz期间的数据交互,以及目标系统的崩溃信息。这样我们就能在第一时间内分析出引起目标崩溃的数据包,然后快速的开发出exploit。
在Sulley的主目录下可以找到 process_monitor.py和network_monitor.py两个脚本,他们分别负责网络监控和进程监控。

python process_monitor.py

ERR> USAGE: process_monitor.py
<-c|–crash_bin FILENAME> filename to serialize crash bin class to
[-p|–proc_name NAME] process name to search for and attach to
[-i|–ignore_pid PID] ignore this PID when searching for the
target process
[-l|–log_level LEVEL] log level (default 1), increase for more
verbosity
[–port PORT] TCP port to bind this agent to

如下启动进程监控。
python process_monitor.py -c D:\easyftpserver.crash -p easyftp.exe
这里写图片描述

接下来看看network_monitor.py。

ERR> USAGE: network_monitor.py
<-d|–device DEVICE #> device to sniff on (see list below)
[-f|–filter PCAP FILTER] BPF filter string
[-P|–log_path PATH] log directory to store pcaps to
[-l|–log_level LEVEL] log level (default 1), increase for more verbosity
[–port PORT] TCP port to bind this agent to

Network Device List:
[0] {C2E1878A-A59A-4023-A4E5-77EE1ECCEFAE} 192.168.235.1
[1] {11E03B98-5931-490C-8617-EC82C36121B0}
[2] {E23A46F5-E2F9-46B7-B407-6868DF329C54} 192.168.75.1
[3] {554DA01B-6938-4FC5-A3C1-26CA49E8DF3D} 192.168.0.100
[4] {E0887D7D-3247-4896-ABAF-C0CDE3AC9C86}

在这里我们需要使用[3]网络接口。如下启动网络监控。
python network_monitor.py -d 3 -f "src or dst port 21" -P D:\pcaps\
提示:在启动之前必须先建立D:\pcaps目录。
这里写图片描述

一切就绪,开始猎食。

5、fuzzing和Web界面

现在我们启动Sulley,并使用内置的Web界面观察整个fuzz过程。
python ftp_session.py
输出如下:
这里写图片描述
如果输出是这样的,说明一切正常。Sulley正在繁忙的工作着。现在让我们看看Sulley的web界面,它会提供更多信息。
用浏览器打开http://127.0.0.1:26000,将看到类似图的结果。
这里写图片描述

不断的刷新浏览器就能看到当前fuzzing的进程,以及正在使用的请求和测试用例导致的崩溃信息。点击test case的数字,就会看到详细的崩溃信息,崩溃报告打开如下。
这里写图片描述
我们已经成功的Crash了easyftp,Sulley也捕捉到了所有相关的信息。我们看到两个测试用例的错误信息都是:当试图从0x021af000读取时,0042d063从线程6008的rep movsd导致访问冲突。
PyDbg崩溃信息格式在灰帽-Python之旅第四章60页的”访问违例处理程序”中有详细的讲解。当程序尝试访问它们没有权限访问的页面的时候或者以一种不合法的方式访问内存的时候,就会产生访问违例。导致违例错误的范围很广,从内存溢出到不恰当的处理空指针都有可能。从安全角度考虑,每一个访问违例都应该仔细的审查,因为它们有可能被利用。当调试器处理访问违例的时候,需要搜集所有和违例相关的信息,栈框架,寄存器,以及引起违例的指令。接着我们就能够用这些信息写一个利用程序或者创建一个二进制的补丁文件。
那接下来就是开发exploit攻击或者创建补丁修复软件了!

有了这次测试,我们对Sulley的工作方式已经很熟悉了,对于别的fuzzing对象也只要依葫芦画瓢就行了。


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

相关文章

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

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

我的sulley安装过程

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

Fuzzing及Sulley简介

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

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

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

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

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

网络socket编程(c语言)

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

Socket的通信原理和使用

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

linux 网络编程socket

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

什么是socket?socket详解

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

【Python】Socket的简单应用

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

http和socket关系

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

SOCKET函数详解

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

用大白话解释什么是Socket

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

Socket详解

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

Java socket详解

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

Socket的详细介绍

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

Socket到底是什么?

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

什么是Socket?

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

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

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

整数划分(递归方法)

最近讲到了递归&#xff0c;老师布置了一道经典的整数划分问题&#xff0c;浏览了网上很多代码&#xff0c;还是似懂非懂&#xff0c;想找张清晰地展现递归过程的图片也没有&#xff0c;今天想了想&#xff0c;自己画了一张才发现&#xff0c;想完整清晰地表现这个过程确实真的…