亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: Sulley fuzzing ftp實(shí)例 [打印本頁(yè)]

作者: lrfgjj2    時(shí)間: 2011-12-22 08:53
標(biāo)題: Sulley fuzzing ftp實(shí)例

 SULLEY

 

 

       Sulley名字來(lái)起源于電影《Monsters》, 一頭毛絨絨的藍(lán)色怪物。下面將要看到的Sulley也是一個(gè)怪物,強(qiáng)大的基于Pythonfuzzing框架的怪物(在這里讓我們感謝他們:Pedram Amini Aaron Portnoy of TippingPoint)。Sulley不僅僅是一個(gè)fuzzer;它還有擁有優(yōu)秀的崩潰報(bào)告,自動(dòng)虛擬化技術(shù)(VMWare automation)。在fuzzing的過(guò)程中你可以在任意時(shí)刻,甚至是目標(biāo)程序崩潰的時(shí)候,從新啟動(dòng)程序到前一刻,繼續(xù)尋找bug之旅。In short, Sulley is badass.

       SulleySPIKE(一款著名的協(xié)議 fuzzing工具,當(dāng)然它是免費(fèi)的)一樣使用了數(shù)據(jù)塊技術(shù),所以生成的數(shù)據(jù)會(huì)更有“智慧”,不在是一群沒(méi)頭沒(méi)腦的蒼蠅。讓我們看看什么是基于塊的fuzzing技術(shù),在生成測(cè)試數(shù)據(jù)前,你必須針對(duì)協(xié)議或者是文件格式,完成一個(gè)數(shù)據(jù)生成的框架,框架里盡可能詳細(xì)的包含了協(xié)議(或者文件格式)的各個(gè)字段,數(shù)據(jù)類型,還有長(zhǎng)度信息,最后生成的測(cè)試數(shù)據(jù)就會(huì)非常有針對(duì)性。讓后把這些測(cè)試數(shù)據(jù)傳遞給負(fù)責(zé)協(xié)議測(cè)試的框架,用于fuzzing。這項(xiàng)技術(shù)最早提出來(lái)的目的就是為了解決網(wǎng)絡(luò)協(xié)議fuzz時(shí)的盲目性。舉個(gè)例子,在網(wǎng)絡(luò)協(xié)議中,一般每個(gè)字段都有長(zhǎng)度記錄,如果我們發(fā)送的測(cè)試數(shù)據(jù)增加了數(shù)據(jù)的長(zhǎng)度,卻沒(méi)有改變長(zhǎng)度記錄,那服務(wù)端程序,就會(huì)根據(jù)長(zhǎng)度記錄,自動(dòng)拋棄多余的數(shù)據(jù),這樣在fuzzing的時(shí)候,就很難找出bug了;趬K的技術(shù)則是負(fù)責(zé)處理這些數(shù)據(jù)塊間的關(guān)系的,讓生成的數(shù)據(jù)更標(biāo)準(zhǔn),而不是像野蠻人。

       接下來(lái)我們會(huì)詳細(xì)的講解Sully,從安裝到使用。先是快速的了解Sulley創(chuàng)建protocol description(協(xié)議描述)的基礎(chǔ)知識(shí)。接著再完成一個(gè)包含,fuzzing框架,包捕獲,以及崩潰報(bào)告的完整的fuzzer。我們fuzzing的目標(biāo)就是WarFTPD,早期的版本存在棧溢出。測(cè)試fuzzer最常見(jiàn)方法就是,用有漏洞的程序喂它,如果它能咬出一個(gè)洞,說(shuō)明你的fuzzer還不傻,如果什么都沒(méi)發(fā)現(xiàn),那洗洗回去睡把。這次我們喂的是個(gè)怪物,如果你還沒(méi)有飼養(yǎng)手冊(cè),可以看看PedramAaron寫的Sulley manual。好了,讓我們繼續(xù)。

      

      

 

9.1           安裝Sulley

 

       在我們深入探索Sulley之前,先得找一頭,栓起來(lái)。大家可以從http://www.nostarch.com/ghpython.htm下載zip打包的Sulley源代碼。(我估計(jì)是眼花,愣是沒(méi)找到,http://sulley.googlecode.com此地有貨)。

       下載完成后,解壓Sulley,在目錄下找到sulley,utilsrequests

文件夾,然后復(fù)制到C:\Python25\Lib\site-packages\目錄下。這些就是Sulley的核心。接下來(lái)安裝其他依賴的文件。

       第一個(gè)WinPcap,一款開(kāi)源的輕便簡(jiǎn)潔的網(wǎng)絡(luò)庫(kù),用于windows平臺(tái)下的包捕捉。有搞過(guò)嗅探的同學(xué),對(duì)這東西應(yīng)該是非常熟悉了,建議搞滲透的都去看看它的手冊(cè),大餅級(jí)別的黑客利器。Winpcap被廣泛的應(yīng)用與各種網(wǎng)絡(luò)工具,入侵檢測(cè)系統(tǒng)。Sulley使用它捕捉網(wǎng)絡(luò)數(shù)據(jù)。下載地址:http://www.winpcap.org/install/bin/WinPcap_4_0_2.exe。

       接下來(lái)安裝兩個(gè)python庫(kù):pcapy impacket,,和上面的WinPcap庫(kù)配合。它們都由CORE Security提供。PcapyWinPcapPython接口,impacket則負(fù)責(zé)包的解碼和創(chuàng)建。pcap的下載地址http://oss.coresecurity.com/repo/pcapy-0.10.5.win32-py2.5.exe.

       mpacket的下載地址http://oss.coresecurity.com/repo/Impacket-stable.zip。下載完后解壓到 C:\ directory,進(jìn)入目錄執(zhí)行以下命令:

C:\Impacket-stable\Impacket-0.9.6.0>C:\Python25\python.exe setup.py install

      

       一切就緒,主角登場(chǎng)!

 

 

9.2          Sulley primitives

 

       在我們開(kāi)始開(kāi)始對(duì)目標(biāo)動(dòng)手前,必須先定義好所有的building blocks(構(gòu)建塊),這些塊負(fù)責(zé)產(chǎn)生協(xié)議相關(guān)的測(cè)試數(shù)據(jù)。Sulley 提供了所需的各種的數(shù)據(jù)格式,為我們創(chuàng)建簡(jiǎn)單高效的protocol descriptions提供了便利。這些單獨(dú)的數(shù)據(jù)組件叫做primitives(原語(yǔ))。我們先簡(jiǎn)短講解一些fuzz WarFTPD 時(shí)候會(huì)用到的primitives。一旦你理解了如何使用其中一個(gè)primitives,那剩下的就很容易了。

 

9.2.1        Strings

      

       字符串(Strings)是使用最多的primitives。到處都有字符串;用戶名,ip地址,目錄等等。s_string()指令表示添加進(jìn)測(cè)試數(shù)據(jù)的primitives是一個(gè)可fuzz的字符串。s_string()只有一個(gè)參數(shù),就是有效的字符串,用于協(xié)議交互中的正常輸入。比如,你fuzzing一個(gè)email地址:

 

s_string("justin@immunityinc.com")

      

       Sulley會(huì)把justin@immunityinc.com當(dāng)作一個(gè)有效值,然后進(jìn)行各種變形,最后扔給目標(biāo)程序。讓我們看看email地址變成了什么樣。

      

justin@immunityinc.comAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

justin@%n%n%n%n%n%n.com

%d%d%d@immunityinc.comAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

 

9.2.2 Delimiters

      

       Delimiters(定界符),用于將大的字符串分割成曉得容易管理的片段。還是用先前的email地址做例子,用 s_delim()指令能夠?qū)⑺指畛筛嗟?/SPAN>fuzz字符串。

 

s_string("justin")

s_delim("@")

s_string("immunityinc")

s_delim(".",fuzzable=False)

s_string("com")

 

       通過(guò)s_delim(),我們將email地址分成了幾個(gè)子串,并且告訴Sulley,我們?cè)?/SPAN>fuzzing的時(shí)候不使用點(diǎn)(.),但是會(huì)使用@ 。

      

 

 

9.2.3        Static and Random Primitives

 

       s_static()s_random(),顧名思義,第一個(gè)使傳入的數(shù)據(jù)不改變,第二個(gè)使數(shù)據(jù)隨機(jī)的改變。

 

s_static("Hello,world!")

s_static("\x41\x41\x41")

 

       s_random()可以隨機(jī)產(chǎn)生變長(zhǎng)的數(shù)據(jù)。

      

s_random("Justin",min_length=6, max_length=256, num_mutations=10)

      

       min_lengthmax_length告訴Sully變形后的數(shù)據(jù)的長(zhǎng)度范圍,num_mutations為可選參數(shù),表示變形的次數(shù),默認(rèn)為25次。

       在我們的例子,使用"Justin"作為源數(shù)據(jù),經(jīng)過(guò)10次變形,產(chǎn)生6-256個(gè)長(zhǎng)度的字符。

      

9.2.4        Binary Data

 

       Binary Data(二進(jìn)制數(shù)據(jù))是數(shù)據(jù)表示中的瑞士軍刀。Sullyey幾乎能處理所有二進(jìn)制數(shù)據(jù)。當(dāng)我們?cè)谔幚硪恍┪粗獏f(xié)議的數(shù)據(jù)包的時(shí)候,你也許只是想看看服務(wù)器是如何回應(yīng)我們生成的這些沒(méi)有意義

的數(shù)據(jù)的,這時(shí)候 s_binary() 就非常有用了

 

s_binary("0x00 \\x41\\x42\\x43 0d 0a 0d 0a")

 

       Sully能識(shí)別出所有這類的數(shù)據(jù),然后像將它們當(dāng)作字符串使用。

 

 

 

9.2.5 Integers

 

       Integers(整數(shù))的應(yīng)用無(wú)處不在,從能看的見(jiàn)的明文數(shù)據(jù),到看不見(jiàn)的二進(jìn)制協(xié)議,以及數(shù)據(jù)長(zhǎng)度,各種結(jié)構(gòu),等等。

       9-1列出了Sulley支持的主要幾種整數(shù)類型。

      

1 byte  – s_byte(), s_char()

2 bytes – s_word(), s_short()

4 bytes – s_dword(), s_long(), s_int()

8 bytes – s_qword(), s_double()

 

Listing 9-1: Sulley支持的整數(shù)類型

      

       所有的整數(shù)表達(dá)式都有幾個(gè)重要的的選項(xiàng)。endian項(xiàng)表示整數(shù)將以什么樣的形式變現(xiàn)出來(lái),是小端- (<) 還是 大端- (>)格式 l默認(rèn)似乎小端。format項(xiàng)有兩個(gè)可選值,asciibinary;代表整數(shù)將被如何使用。舉個(gè)例子,如果你有一個(gè)用ASCII格式 表示是1,用binary表示就是\x31。signed項(xiàng)說(shuō)明整數(shù)是有符號(hào)的還是無(wú)符號(hào)的,這個(gè)選項(xiàng)只有在format指定為ascii后有效,默認(rèn)似乎False。最后一個(gè)有趣的選項(xiàng)是full_range,啟用這個(gè)選項(xiàng)以后,Sulley就會(huì)在一個(gè)很廣的范圍內(nèi)枚舉可能的整數(shù)值。舉個(gè)例子,如果我們傳入的整數(shù)是一個(gè)無(wú)符號(hào)的整數(shù),把full_range設(shè)置成True,這時(shí)候Sulley就會(huì)很智能的測(cè)試邊界值(接近或者超過(guò)最大值,或者接近最小值),無(wú)符號(hào)的最大值是65535Sulley就會(huì)試著使用65534, 65535,  65536

去進(jìn)行測(cè)試。full_range默認(rèn)為False,因?yàn)榭擅杜e的時(shí)間可是很長(zhǎng)的。看看下面的例子。

 

s_word(0x1234, endian=">", fuzzable=False)

s_dword(0xDEADBEEF, format="ascii", signed=True)

 

       第一個(gè)例子,我們?cè)O(shè)置了一個(gè)2字節(jié)大小的值0x1234,并且將表示方式設(shè)置成大端,同時(shí)作為一個(gè)靜態(tài)值。第二個(gè)例子,我們?cè)O(shè)置了一個(gè)4字節(jié)(雙字)大小的值0xDEADBEEF,并且將它作為有符號(hào)的整數(shù),以ASCII形式表現(xiàn)。

 

 

9.2.6        Blocks and Groups

 

       Blocks()Groups()Sulley提供的強(qiáng)大的組織工具。Blocks將獨(dú)立的primitives組裝成一個(gè)的有序的塊。Groups 中包含了一些特定的primitives,一個(gè)Group和一個(gè)Block結(jié)合后,每次fuzzer調(diào)用Block的時(shí)候,都會(huì)將Group中的數(shù)據(jù)循環(huán)的取出,組成不同的Block。

       下面就是一個(gè)使用塊和組 fuzzing HTTP的例子。

 

# import all of Sulley's functionality.

from sulley import *

# this request is for fuzzing: {GET,HEAD,POST,TRACE} /index.html HTTP/1.1

# define a new block named "HTTP BASIC".

s_initialize("HTTP BASIC")

# define a group primitive listing the various HTTP verbs we wish to fuzz.

s_group("verbs", values=["GET", "HEAD", "POST", "TRACE"])

# define a new block named "body" and associate with the above group.

if s_block_start("body", group="verbs"):

# break the remainder of the HTTP request into individual primitives.

    s_delim(" ")

    s_delim("/")

    s_string("index.html")

    s_delim(" ")

    s_string("HTTP")

    s_delim("/")

    s_string("1")

    s_delim(".")

    s_string("1")

    # end the request with the mandatory static sequence.

    s_static("\r\n\r\n")

# close the open block, the name argument is optional here.

s_block_end("body")

 

       程序一開(kāi)始我們就定義了一個(gè)叫 verbs的組,其中包含了所有HTTP請(qǐng)求類型。之后定義了一個(gè)叫body的塊,并且和verbs組綁定。這意味著,以后Sulley每次調(diào)用body內(nèi)的變形數(shù)據(jù)的時(shí)候,都會(huì)循環(huán)的獲取(GET, HEAD, POST, TRACE)5種請(qǐng)求方式,這樣一來(lái),一次body內(nèi)的變形就相當(dāng)于產(chǎn)生5個(gè)不同的body。

       到目前為止,我們已經(jīng)講解完了Sulley的基礎(chǔ)知識(shí)。當(dāng)然Sulley不僅僅如此,還有數(shù)據(jù)解碼,校驗(yàn)和計(jì)算,長(zhǎng)度自動(dòng)處理等等。想深入學(xué)習(xí)的同學(xué)可以看Pedram寫的Fuzzing: Brute Force Vulnerability Discovery (Addison-Wesley, 2007),一本綜合了Sulleyfuzzing相關(guān)技術(shù)的好書,F(xiàn)在該開(kāi)始對(duì)WarFTPD下手了。我們要先創(chuàng)建自己的primitive集合,然后將它們傳給負(fù)責(zé)構(gòu)建測(cè)試的框架內(nèi)。

 

 

 

9.3 獵殺 WarFTPD

 

       在我們已經(jīng)學(xué)會(huì)了如何使用Sulley primitives創(chuàng)建protocol description(協(xié)議說(shuō)明)之后,F(xiàn)在可以拿個(gè)東西試試手了。這次的目標(biāo)就是WarFTPD 1.65。問(wèn)題出在USERPASS命令身上,向他們傳遞過(guò)長(zhǎng)的數(shù)據(jù),就會(huì)引發(fā)棧溢出。這種漏洞很典型,出現(xiàn)問(wèn)題的地方結(jié)構(gòu)也很清晰,作為入手的case再好不過(guò)。先從ftp://ftp.jgaa.com/pub/products/Windows/WarFtpDaemon/1.6_Series/ward165.exe下載程序。在當(dāng)前目錄解壓子之后,直接運(yùn)行warftpd.exe就能啟動(dòng)FTP服務(wù)了。在使用Sulley書寫協(xié)議說(shuō)明之前,讓我們先了解下FTP協(xié)議的工作流程。

 

9.3.1        FTP   101

 

       FTP是一個(gè)簡(jiǎn)單輕便的文件傳輸協(xié)議,被廣泛的使用于各種環(huán)境中,從Web服務(wù)器到網(wǎng)絡(luò)打印機(jī)。FTP服務(wù)器默認(rèn)在端口21上監(jiān)聽(tīng)客戶端發(fā)送的命令,F(xiàn)在我們要冒充成FTP客戶端,向服務(wù)器發(fā)送變形過(guò)的命令數(shù)據(jù),嘗試獲得服務(wù)器的權(quán)限。如果你順利完成了WarFTPDfuzzer, 別忘了用它去尋找新的倒霉蛋。

       一個(gè)FTP服務(wù)器既可以設(shè)置成不需要密碼的匿名訪問(wèn)或者是需要密碼的認(rèn)證訪問(wèn)。因?yàn)?/SPAN>WarFTPD的漏洞出在USERPASS命令上,所以我們就假定服務(wù)區(qū)使用認(rèn)證訪問(wèn)。FTP認(rèn)證命令的格式如下:

 

USER <USERNAME>

PASS <PASSWORD>

 

       一旦客戶端傳入了有效的用戶名和密碼后,服務(wù)器就會(huì)賦予客戶端,傳輸文件,改變目錄,查詢文件等各種權(quán)限。當(dāng)然USERPASS命令只是FTP服務(wù)器提供的功能中的一個(gè)子集,在認(rèn)證成功后還有很多別的功能,如表9-2。這些新的命令都要加入到我們程序的協(xié)議框架(protocol skeleton)中。FTP協(xié)議詳細(xì)的命令,請(qǐng)看rfc959。

 

CWD  <DIRECTORY>   - change working directory to DIRECTORY

DELE <FILENAME>    - delete a remote file FILENAME

MDTM <FILENAME>    - return last modified time for file FILENAME

MKD  <DIRECTORY>   - create directory DIRECTORY

 

Listing   9-2:我們要額外fuzzFTP命令

      

       命令列表雖然不夠詳細(xì),但還擴(kuò)大了測(cè)試的范圍,現(xiàn)在讓我們動(dòng)手把它們寫成protocol description

 

 

9.3.2        創(chuàng)建FTP協(xié)議框架

      

       學(xué)以致用,學(xué)以致用!

 

#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")

      

       protocol skeleton完成之后,讓我們開(kāi)始創(chuàng)建Sulley會(huì)話,把所有的請(qǐng)求信息連起來(lái),同時(shí)啟動(dòng)網(wǎng)絡(luò)嗅探和客戶端調(diào)試。

      

 

 

9.3.3        Sulley會(huì)話

      

       Sulley會(huì)話包含了請(qǐng)求數(shù)據(jù)整合,網(wǎng)絡(luò)數(shù)據(jù)包的捕捉,進(jìn)程調(diào)試,崩潰報(bào)告,和虛擬機(jī)控制。先讓我們定義一個(gè)會(huì)話文件,然后詳細(xì)的分析每個(gè)部分。

 

#ftp_session.py

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="audits/warftpd.session")

target = sessions.target("192.168.244.133", 21)

target.netmon  = pedrpc.client("192.168.244.133", 26001)

target.procmon = pedrpc.client("192.168.244.133", 26002)

target.procmon_options = { "proc_name" : "war-ftpd.exe" }

# 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()是必須的,因?yàn)槊總(gè)FTP服務(wù)器在客戶端連接上的時(shí)候,都會(huì)發(fā)送banner(標(biāo)識(shí))。我們將它和sess.pre_send 綁定起來(lái),這樣Sulley發(fā)送fuzzing數(shù)據(jù)前的時(shí)候就會(huì)先接收FTP banner。和receive_ftp_banner一樣,pre_send也只接收一個(gè)由Sulley傳遞的sock對(duì)象。第一步我們創(chuàng)建一個(gè)會(huì)話文件,用于記錄當(dāng)前fuzzer的狀態(tài),同時(shí)控制fuzzing的啟動(dòng)和停止。第二部定義攻擊的目標(biāo),包括IP地址和端口號(hào)。這里設(shè)置成 192.168.244.133端口21(這是我們運(yùn)行WarFTPD虛擬機(jī)的IP)。第三步,設(shè)置網(wǎng)絡(luò)嗅探的端口為26001,IP地址和FTP服務(wù)器的地址一樣,這個(gè)端口用于接受Sulley發(fā)出的命令。第四步,設(shè)置調(diào)試器監(jiān)聽(tīng)的端口26002,這個(gè)端口用于接收Sulley發(fā)出的調(diào)試命令。procmon_options選項(xiàng)告訴調(diào)試器我們關(guān)注的進(jìn)程是war-ftpd.exe。第六步,在會(huì)話中加入定義好的目標(biāo)對(duì)象。第七步,將FTP請(qǐng)求指令有序的組織好。先是認(rèn)證,然后將操作指令和需要的密碼成對(duì)傳入。最后啟動(dòng)Sulley開(kāi)始fuzzing。

       現(xiàn)在我們定義好了會(huì)話,組織好了請(qǐng)求指令。只剩下網(wǎng)絡(luò)和監(jiān)控腳本的設(shè)置了。當(dāng)這一切都完成的時(shí)候,就可以去捕捉我們的獵物了。

 

 

 

9.3.4        網(wǎng)絡(luò)和進(jìn)程監(jiān)控

 

       Sulley的優(yōu)點(diǎn)之一就是能非常好的跟蹤fuzz期間的數(shù)據(jù)交互,以及目標(biāo)系統(tǒng)的崩潰信息。這樣我們就能在第一時(shí)間內(nèi)分析出引起目標(biāo)崩潰的數(shù)據(jù)包,然后快速的開(kāi)發(fā)出exploit

       Sulley的主目錄下可以找到 process_monitor.pynetwork_monitor.py兩個(gè)腳本,他們分別負(fù)責(zé)網(wǎng)絡(luò)監(jiān)控和進(jìn)程監(jiān)控。

      

python process_monitor.py

Output:

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

 

       如下啟動(dòng)進(jìn)程監(jiān)控。

      

python process_monitor.py -c C:\warftpd.crash -p war-ftpd.exe

 

提示:我們已經(jīng)設(shè)置了默認(rèn)的監(jiān)聽(tīng)端口26002,所以不用-p選項(xiàng)。

 

       接下來(lái)看看network_monitor.py。在這之前需要安裝以下的庫(kù):WinPcap 4.0,  pcapy, mpacket。

 

python network_monitor.py

Output:

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] \Device\NPF_GenericDialupAdapter

  [1] {83071A13-14A7-468C-B27E-24D47CB8E9A4}  192.168.244.133

 

       在這里我們需要使用第一個(gè)網(wǎng)絡(luò)接口。如下啟動(dòng)網(wǎng)絡(luò)監(jiān)控。

      

python network_monitor.py -d 1 -f "src or dst port 21" -P C:\pcaps\

 

提示:在啟動(dòng)之前必須先建立C:\pcaps目錄。

 

       一切就緒,開(kāi)始獵食。

      

 

 

9.3.5        fuzzingWeb界面

 

       現(xiàn)在我們啟動(dòng)Sulley,并使用內(nèi)置的Web界面觀察整個(gè)fuzz過(guò)程。

 

python ftp_session.py

 

       輸出如下:

 

[07:42.47] current fuzz path:  -> user

[07:42.47] fuzzed 0 of 6726 total cases

[07:42.47] fuzzing 1 of 1121

[07:42.47] xmitting: [1.1]

[07:42.49] fuzzing 2 of 1121

[07:42.49] xmitting: [1.2]

[07:42.50] fuzzing 3 of 1121

[07:42.50] xmitting: [1.3]

 

       如果輸出是這樣的,說(shuō)明一切正常。Sulley正在繁忙的工作著,F(xiàn)在讓我們看看web界面,它會(huì)提供更多信息。

       用瀏覽器打開(kāi)http://127.0.0.1:26000,將看到類似圖9-1的結(jié)果。

      

Figure 9-1: Sulleyweb界面

 

       不斷的刷新瀏覽器就能看到當(dāng)前fuzzing的進(jìn)程,以及正在使用的primitive。如圖9-1你會(huì)看到正在fuzzing primitiveuser,這個(gè)命令存在漏洞,在不久之后就會(huì)看到如圖9-2的崩潰報(bào)告。

 

 

Figure 9-2: Sulley web 界面顯示的崩潰信息

 

       很好,應(yīng)該說(shuō)非常好!我們已經(jīng)成功的CrashWarFTPD,Sulley也捕捉到了所有相關(guān)的信息。我們看到兩個(gè)測(cè)試用例的錯(cuò)誤信息都是不能反匯編0x5c5c5c5c這個(gè)地址。0x5c就是ASCII字符\,這是由于傳入的\字符過(guò)多,覆蓋了別的內(nèi)存區(qū)域,緊接這影響到EIP。當(dāng)調(diào)試器嘗試反匯編EIP指向的位置的時(shí)候,就會(huì)失敗,因?yàn)?/SPAN>0x5c5c5c5c 不是一個(gè)有效的地址。這意味我們已經(jīng)能夠控制EIP了,那接下來(lái)就是開(kāi)發(fā)exploit了!激動(dòng)嗎?呵呵,可惜這是我們之前就知道的漏洞。不過(guò)有了這次成功的測(cè)試,我們對(duì)Sulley的工作方式已經(jīng)很熟悉了,對(duì)于別的fuzzing對(duì)象也只要依葫蘆畫瓢就行了。Good Luck!

       現(xiàn)在點(diǎn)擊test case的數(shù)字,就會(huì)看到詳細(xì)的崩潰信息。如表9-3

       PyDbg崩潰信息格式在60頁(yè)的"訪問(wèn)違例處理程序"中有詳細(xì)的講解。忘記的返回去看看。

      

 [INVALID]:5c5c5c5c Unable to disassemble at 5c5c5c5c from thread 252

caused access violation

 when attempting to read from 0x5c5c5c5c

CONTEXT DUMP

  EIP: 5c5c5c5c Unable to disassemble at 5c5c5c5c

  EAX: 00000001 (         1) -> N/A

  EBX: 5f4a9358 (1598722904) -> N/A

  ECX: 00000001 (         1) -> N/A

  EDX: 00000000 (         0) -> N/A

  EDI: 00000111 (       273) -> N/A

  ESI: 008a64f0 (   9069808) -> PC (heap)

  EBP: 00a6fb9c (  10943388) -> BXJ_\'CD@U=@_@N=@_@NsA_@N0GrA_@N*A_0_C@

Ct^J_@_0_C@N (stack)

  ESP: 00a6fb44 (  10943300) -> ,,,,,,,,,,,,,,,,,,  cntr User from

                                192.168.244.128 logged out (stack)

  +00: 5c5c5c5c ( 741092396) -> N/A

  +04: 5c5c5c5c ( 741092396) -> N/A

  +08: 5c5c5c5c ( 741092396) -> N/A

  +0c: 5c5c5c5c ( 741092396) -> N/A

  +10: 20205c5c ( 538979372) -> N/A

  +14: 72746e63 (1920233059) -> N/A

disasm around:

0x5c5c5c5c Unable to disassemble

stack unwind:

war-ftpd.exe:0042e6fa

MFC42.DLL:5f403d0e

MFC42.DLL:5f417247

MFC42.DLL:5f412adb

MFC42.DLL:5f401bfd

MFC42.DLL:5f401b1c

MFC42.DLL:5f401a96

MFC42.DLL:5f401a20

MFC42.DLL:5f4019ca

USER32.dll:77d48709

USER32.dll:77d487eb

USER32.dll:77d489a5

USER32.dll:77d4bccc

MFC42.DLL:5f40116f

SEH unwind:

00a6fcf4 -> war-ftpd.exe:0042e38c mov eax,0x43e548

00a6fd84 -> MFC42.DLL:5f41ccfa mov eax,0x5f4be868

00a6fdcc -> MFC42.DLL:5f41cc85 mov eax,0x5f4be6c0

00a6fe5c -> MFC42.DLL:5f41cc4d mov eax,0x5f4be3d8

00a6febc -> USER32.dll:77d70494 push ebp

00a6ff74 -> USER32.dll:77d70494 push ebp

00a6ffa4 -> MFC42.DLL:5f424364 mov eax,0x5f4c23b0

00a6ffdc -> MSVCRT.dll:77c35c94 push ebp

ffffffff -> kernel32.dll:7c8399f3 push ebp

 

 

Listing   9-3:#437 測(cè)試用例 產(chǎn)生的崩潰信息

 

       Sulley的主要應(yīng)用已經(jīng)講解完成了。當(dāng)然這些只是其中的一部分,還有很多很多的東西,需要各位同學(xué),自己去研究,比如崩潰數(shù)據(jù)的過(guò)濾,primitives的圖形化輸出,等等。從今以后,Sulley不再是一頭可怕的怪物,而是我們bug-hunging時(shí)的利器。在我們成功的完成了遠(yuǎn)程服務(wù)的fuzz以后,接下來(lái)然我們fuzz本地的Windows下的驅(qū)動(dòng)程序,這次我們用自己的工具。






歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2