作者:dog_wangwang
稿费:300RMB(不服你也来投稿啊!)
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
0x00 介绍
本文旨在通过python以及C#构造用户能够自定义,添加或者修改挖掘规则的ftp fuzzer。
现在很多的ftp fuzzer已经由开发者自定义了内部挖掘规则。如果需要加入新的挖掘规则,用户除了自己写一个挖掘器,是否还有其它方法呢?
实现方式:由ftp fuzzer提供接口,用户按照自己的想法写出相应的挖掘规则。
环境:WIn8 vs2013 + python + ironPython
0x01 详概
ftp相关知识这里不介绍,大家可以去看看官方文档。程序整体的界面用c#开发,其中ironPython是为了实现在c#环境下运行python脚本。用python的原因主要基于:1.用户可以专注于挖掘规则的编写,不需要关注界面,以及数据处理问题。2.python简单,快捷,学习进度快。
在C#中调用python文件需要用到ironPython技术。相关资料读者可自行查阅,这里就不过多介绍了。
相关的调用方式:
//c#中调用python脚本
using IronPython.Hosting;
.......
ScriptRuntime pyRuntime = Python.CreateRuntime();
dynamic obj = pyRuntime.UseFile("fuzz.py"); //创建python脚本对象 使用方法:obj.function()
fuzz.py文件包含各种测试命令,脏数据,以及规则。这些都可以由用户修改,添加。
C#调用fuuz.py文件中的函数向ftp服务器发送各种脏数据。
测试之前我们肯定也要看ftp服务是否打开,这里我们用一个简单的函数完成。
def login(ip, port, username, password):
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
connect = s.connect((ip, port))
s.recv(1024)
s.send("user " + username + "rn")
s.recv(1024)
s.send("PASS " + password + "rn")
s.recv(1024)
s.close()
return True;
except:
s.close()
return False;
介绍程序之前我们首先看一下当前常用ftp fuzzer是如何对程序进行测试的。
buffer = 50*'A'
s.send(fuzzcmd[attr] + " " + buffer * 5 + 'rn')
s.send(fuzzcmd[attr] + " " + buffer * 20 + 'rn')
s.send(fuzzcmd[attr] + " " + buffer * 40 + 'rn')
s.send(fuzzcmd[attr] + " " + buffer * 100 + 'rn')
s.send(fuzzcmd[attr] + " " + buffer * 200 + 'rn')
来源:《0day安全软件漏洞分析技术》
fuzzcmd是一个包含ftp命令的数组,如“cd” "dir"等等。
我们定义一个overFuzz()函数,来完成这个功能。
def overFuzz(ip, port, username, password, attr)
按照这种方式,ftp服务器接收到的数据如果造成溢出,程序将直接崩溃掉,程序崩溃掉之后,数据自然是发送不到ftp服务器的,我们可以按照这个依据来判断程序是否含有漏洞。
attr = "标志位" + "脏数据"
c#判断attr其中的标志位是否为“true”,如果为“true”,则后面的脏数据则为造成程序崩溃的数据,可以供用户后面分析调试。
可利用的漏洞我们用这种方法测试,而不能利用,只能造成程序异常退出的漏洞我们将采用另外一种规则。在fuzz.py中,我们定义了dDosString[], dDosChar[]两个数组,用户有自己的想法,也完全可以修改这两个变量。测试方式和前面的overfuzz一样。
现在我们用某个ftp服务程序测试一下。这是其中关于ddos的测试效果。
当然这个漏洞不能利用,只能造成程序异常退出。
现在我们再看一下挖掘规则的问题。在fuzz.py文件中,现在我们定义了几个重要的变量。
fuzzcmd[] //包含ftp命令
buffer = 50*'a'
dDosString[] //例如'%%%n'
dDosChar[] //例如'%', ''等
这几个变量的值由用户决定。在文章开头,我们说过新的挖掘规则怎么添加?我们完全可以仿照overFuzz这个函数重新写一个,恩,我们试一下。观察一下我们发送数据的格式。
s.send(fuzzcmd[attr] + " " + buffer * 5 + 'rn')
发送的数据都是像这样的:
cd aaaaaaaaaaaaaaaaaaaaaaaaa 'rn'
这也是大多数此类fuzz程序通用的格式,现在有一种新的方式,且程序中招率还不低,我测试了市面上大多ftp服务端程序,其中部分程序在处理以下数据的时候,将直接退出。
s.send(fuzzcmd[attr] + " " + buffer * 5) //命令后面加字符串 不添加'rn'
s.send(fuzzcmd[attr])//命令后面不加字符串 不添加'rn'
虽然只是后面有没有'rn'的问题,但是很多ftp服务端程序依然没有处理此种数据的能力。
(其实你也可以尝试把'rn'删除,添加或者在两个'rn'中添加其它数据,有惊喜!)
如:
'cd' + 'a'*500 + 'rn' + 'a'*500 + 'rn' //'rn'可以修改成其它类似的数据
0x02 总结
文章只是介绍了ftp fuzzer的小部分知识,还有很多东西文中都没有提到,包括ftp的基础知识,溢出的相关知识。这些读者都可以自己去查找相关资料,当然,这也不是本文关注的重点。希望大家能够发挥各自脑洞,不要让现有的资料或者规则局限思维方式。在ftp漏洞挖掘中,就我所知道的,挖掘ftp漏洞至少还有一种规则。文章中介绍的fuzzer其貌不全,但是在添加了大多数规则的时候,测试效果还是较好的。大多ftp服务端程序或多或少都有问题。希望大家能在这个简单模型的基础上,打造一个功能强大的ftp fuzzer。
发表评论
您还未登录,请先登录。
登录