DIY个人ftp fuzzer

阅读量150951

|

发布时间 : 2016-09-23 13:04:12

http://p8.qhimg.com/t01ab97e0bce784aeef.jpg

作者: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的测试效果。

http://p8.qhimg.com/t017ba9cf7f8e22b86b.jpg

http://p9.qhimg.com/t01c4349726ada580fc.jpg

当然这个漏洞不能利用,只能造成程序异常退出。

现在我们再看一下挖掘规则的问题。在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。

本文由dog_wangwang原创发布

转载,请参考转载声明,注明出处: https://www.anquanke.com/post/id/84617

安全客 - 有思想的安全新媒体

分享到:微信
+10赞
收藏
dog_wangwang
分享到:微信

发表评论

内容需知
合作单位
  • 安全客
  • 安全客
Copyright © 北京奇虎科技有限公司 三六零数字安全科技集团有限公司 安全客 All Rights Reserved 京ICP备08010314号-66