劉煥偉,王軼駿,薛 質(zhì)
(上海交通大學(xué) 網(wǎng)絡(luò)空間安全學(xué)院,上海 200240)
網(wǎng)絡(luò)攻擊流量對(duì)于網(wǎng)絡(luò)安全研究和網(wǎng)絡(luò)防護(hù)設(shè)備的測(cè)試具有重要意義。一方面,可以重放網(wǎng)絡(luò)攻擊流量來(lái)檢測(cè)網(wǎng)絡(luò)防護(hù)設(shè)備的有效性;另一方面,可以根據(jù)攻擊流量編寫合適的網(wǎng)絡(luò)防御規(guī)則。
Metasploit是一個(gè)使用Ruby腳本語(yǔ)言實(shí)現(xiàn)的、開源的滲透測(cè)試框架,是當(dāng)前最流行的滲透測(cè)試框架[1]。Metasploit自帶大量的攻擊腳本,這些腳本的攻擊目標(biāo)涵蓋Windows、Linux、Android、iOS等多種操作系統(tǒng)。同時(shí),Metasploit還提供了多種組件,以支持新攻擊腳本的快速開發(fā)。Metasploit擁有一個(gè)活躍的社區(qū),有眾多安全研究人員為其添加新的攻擊腳本,而這些新的攻擊腳本會(huì)在網(wǎng)絡(luò)上迅速流傳。Metasploit在方便了安全研究人員的同時(shí),也降低了發(fā)起網(wǎng)絡(luò)攻擊的門檻,使得缺乏網(wǎng)絡(luò)安全知識(shí)的“腳本小子”也能造成安全危害。
傳統(tǒng)的攻擊流量提取方法是運(yùn)行真實(shí)的攻擊代碼對(duì)受控靶機(jī)進(jìn)行攻擊,然后抓取網(wǎng)絡(luò)流量。這種方式雖然能獲取準(zhǔn)確的攻擊流量,但是也存在著一些缺點(diǎn)。首先,Metasploit框架中的攻擊腳本的攻擊目標(biāo)范圍廣泛,涵蓋個(gè)人電腦、手機(jī)、物聯(lián)網(wǎng)設(shè)備甚至工業(yè)控制設(shè)備等多種平臺(tái),而為每個(gè)攻擊腳本都搭建受控的靶機(jī)環(huán)境費(fèi)時(shí)費(fèi)力,十分困難。其次,直接抓取攻擊流量難以對(duì)流量中不同部分的屬性進(jìn)行區(qū)分,如哪些是攻擊必需的固定部分,哪些是填充的隨機(jī)部分。這些屬性對(duì)編寫準(zhǔn)確的防御規(guī)則具有重要意義。
符號(hào)執(zhí)行是一種在20世紀(jì)70年代提出的程序分析技術(shù)[2],常用于軟件測(cè)試、漏洞挖掘和程序分析等領(lǐng)域。Ruowen Wang和Peng Ning利用符號(hào)執(zhí)行技術(shù)分析Metasploit中的Ruby攻擊腳本,以獲取可用于對(duì)抗腳本的防御規(guī)則[3]。邱洋和王軼駿實(shí)現(xiàn)了基于符號(hào)執(zhí)行的Python攻擊腳本分析平臺(tái)PyExZ3+[4]。
本研究利用符號(hào)執(zhí)行技術(shù),實(shí)現(xiàn)對(duì)Metasploit中攻擊腳本的快速分析,獲取其對(duì)應(yīng)的攻擊流量。本研究具有以下特點(diǎn):(1)可以在沒有靶機(jī)的情況下運(yùn)行攻擊腳本,獲取其攻擊流量;(2)可以對(duì)攻擊流量的不同部分進(jìn)行標(biāo)記,在保證準(zhǔn)確的前提下,盡量化簡(jiǎn)流量,僅關(guān)注攻擊流量的固定部分;(3)記錄腳本運(yùn)行時(shí)的攻擊狀態(tài)轉(zhuǎn)移,以獲取其發(fā)送攻擊載荷時(shí)的上下文;(4)可同時(shí)探索攻擊腳本中多條執(zhí)行路徑,一次性獲取攻擊腳本針對(duì)所有目標(biāo)的攻擊流量。
Metasploit項(xiàng)目由HD Moore于2003年夏季創(chuàng)立,是目前最流行的滲透測(cè)試框架。它的設(shè)計(jì)盡可能采用模塊化理念,提升了代碼復(fù)用率。Metasploit可分為5個(gè)部分,即基礎(chǔ)庫(kù)、模塊、插件、接口和功能程序。基礎(chǔ)庫(kù)為框架和模塊的開發(fā)提供了基礎(chǔ)功能的支持,如包裝的網(wǎng)絡(luò)套接字、網(wǎng)絡(luò)應(yīng)用協(xié)議客戶端與服務(wù)端的實(shí)現(xiàn)等[5]。模塊是通過Metasploit框架所裝載、集成并對(duì)外提供的最核心滲透測(cè)試功能實(shí)現(xiàn)代碼。按照用途,模塊分為輔助模塊、攻擊模塊、后滲透攻擊模塊、shellcode模塊、空指令模塊和編碼器模塊。本研究的目標(biāo)是通過對(duì)Metasploit中基礎(chǔ)庫(kù)文件進(jìn)行改造,利用符號(hào)執(zhí)行技術(shù),獲取攻擊模塊中攻擊腳本對(duì)應(yīng)的流量。
同一個(gè)漏洞可能存在于多個(gè)版本的應(yīng)用程序中,同一個(gè)應(yīng)用程序也會(huì)有不同的運(yùn)行環(huán)境。因此,同一攻擊腳本會(huì)對(duì)應(yīng)多個(gè)攻擊流量,每個(gè)攻擊流量對(duì)應(yīng)一個(gè)包含漏洞的應(yīng)用程序版本及運(yùn)行環(huán)境。通常,Metasploit框架中的攻擊腳本會(huì)執(zhí)行四個(gè)步驟來(lái)發(fā)起一次攻擊:(1)腳本通過網(wǎng)絡(luò)探測(cè)攻擊目標(biāo)的版本和運(yùn)行環(huán)境;(2)腳本基于探測(cè)結(jié)果和腳本中的知識(shí)庫(kù),判斷目標(biāo)是否存在漏洞,而腳本中的知識(shí)庫(kù)通常是一個(gè)所有可攻擊目標(biāo)相關(guān)信息的列表;(3)腳本針對(duì)此目標(biāo)構(gòu)建特定的攻擊載荷;(4)腳本向目標(biāo)發(fā)送載荷以利用漏洞。
在所有的步驟中,構(gòu)建和發(fā)送攻擊載荷是最重要的。一個(gè)攻擊載荷通??梢苑譃樗膫€(gè)部分:(1)利用漏洞所需的特殊且固定的字節(jié);(2)一段漏洞利用成功后被執(zhí)行的shellcode,Shellcode是攻擊者選擇的一段惡意代碼,通常實(shí)現(xiàn)了建立反向鏈接等惡意功能,Shellcode可以被混淆,通常是變化的;(3)隨機(jī)或者特殊(例如,x86處理器上的NOP指令0)的填充;(4)其他網(wǎng)絡(luò)協(xié)議相關(guān)的字節(jié)。
攻擊載荷發(fā)送時(shí),攻擊目標(biāo)所處的狀態(tài)非常關(guān)鍵。只發(fā)送一個(gè)孤立的攻擊載荷將無(wú)法完成攻擊。部分網(wǎng)絡(luò)協(xié)議或服務(wù)是有狀態(tài)的,這就決定了攻擊過程也是存在狀態(tài)的。對(duì)于某些漏洞,只有在攻擊目標(biāo)處于特定狀態(tài)時(shí)向其發(fā)送攻擊載荷,才能實(shí)現(xiàn)漏洞利用。所以,攻擊腳本在發(fā)送攻擊載荷前會(huì)進(jìn)行一些操作,使攻擊目標(biāo)處于可攻擊狀態(tài)。這些操作與構(gòu)造攻擊載荷無(wú)關(guān),卻是漏洞利用過程中不可缺少的。對(duì)于某些復(fù)雜的漏洞利用,可能會(huì)發(fā)送多個(gè)攻擊載荷。攻擊狀態(tài)轉(zhuǎn)移和發(fā)送攻擊載荷會(huì)交替進(jìn)行,攻擊載荷發(fā)送完成后,可能還需要發(fā)送特殊命令來(lái)觸發(fā)漏洞。如果不考慮攻擊狀態(tài),根據(jù)獲取的攻擊流量進(jìn)行重放時(shí),不能反映真實(shí)的攻擊過程;在編寫防御規(guī)則時(shí),也會(huì)產(chǎn)生大量錯(cuò)誤的網(wǎng)絡(luò)攻擊報(bào)警。完整的攻擊過程如圖1所示。
圖1 攻擊流程
攻擊框架中的腳本可以調(diào)用框架提供的API來(lái)進(jìn)行目標(biāo)探測(cè)、構(gòu)建攻擊載荷等步驟,簡(jiǎn)化攻擊腳本的開發(fā)過程。
圖2所示的代碼片段取自Metasploit攻擊框架中的真實(shí)攻擊腳本ms08_067_netapi.rb。MS-08067漏洞是2008年年底爆出的一個(gè)特大漏洞,存在于當(dāng)時(shí)所有的微軟系統(tǒng)。攻擊者可以利用此漏洞獲得遠(yuǎn)程代碼執(zhí)行權(quán)限[6]。ms08_067_netapi.rb是Metasploit中利用MS08-067漏洞的攻擊腳本。這個(gè)攻擊腳本首先與目標(biāo)建立連接并進(jìn)行登錄(第2~3行),然后探測(cè)目標(biāo)版本(第5行),根據(jù)目標(biāo)版本選擇構(gòu)造攻擊載荷的相關(guān)參數(shù)(第6-10行)并構(gòu)造攻擊載荷(第12~33行),最后向目標(biāo)發(fā)送攻擊腳本。這個(gè)過程中,攻擊調(diào)用了框架API smb_fingerprint來(lái)探測(cè)Samba服務(wù)的版本及運(yùn)行環(huán)境,使用框架API rand_text_alpha生成隨機(jī)的填充字段,使用框架中的API payload.encoded獲取用戶選擇shellcode。
Metasploit中的攻擊腳本示例如下:
1.def exploit
2. connect
3. smb_login
4. # probe target
5. fprint = smb_fingerprint
6. if (fprint['os'] == 'Windows 2000')
7. mytarget = targets[1]
8. elsif
9. ....
10. end
11. # build exploit
12. if mytarget['RetDec']
13. ...
14. elsif mytarget['UseROP']
15. ...
16. else
17. jumper = rand_text_alpha(70)
18. jumper[4, 4] =
19. [mytarget.ret].pack('V')
20. jumper[50, 8] = make_nops(8)
21. jumper[58, 2] = "xebx62"
22. path =
23. ...
24. rand_text_alpha(100) +
25. payload.encoded +
26. ...
27. jumper +
28. 'x00' *2
29. end
30. ...
31. stub =
32. ...
33. path +
34. NDR.long(rand(1024)) +
35. ...
36. # send to trigger the vulnerability
37. dcerpc.call(0x1f, stub, false)
38. # cleanup
39. handler
40. disconnect
41.end
若在沒有相應(yīng)靶機(jī)環(huán)境的情況下運(yùn)行上述ms08_067_netapi.rb攻擊腳本,腳本在建立連接的階段就會(huì)出行異常,從而停止運(yùn)行。
符號(hào)執(zhí)行,即以符號(hào)而不是確切值作為輸入。在正常的程序執(zhí)行過程中,程序以確切值作為輸入,只會(huì)執(zhí)行一條控制流路徑;相反,在符號(hào)執(zhí)行過程中,程序以符號(hào)作為輸入,可以同時(shí)探索在某種輸入下會(huì)執(zhí)行的多條控制流路徑。符號(hào)執(zhí)行的核心思想是允許程序以符號(hào)而不是確切值作為輸入,程序中與輸入有關(guān)的變量表示為符號(hào)的表達(dá)式。當(dāng)程序執(zhí)行到條件分支語(yǔ)句時(shí),會(huì)將進(jìn)入分支的條件送到求解器中進(jìn)行求解。如果有一組解滿足條件,程序就會(huì)進(jìn)入該分支。符號(hào)執(zhí)行需要一個(gè)符號(hào)執(zhí)行引擎來(lái)維護(hù)進(jìn)入當(dāng)前執(zhí)行路徑需要滿足的布爾表達(dá)式和程序中的變量與符號(hào)表達(dá)式或確切值之間的映射關(guān)系。
Ruby編程語(yǔ)言是一種面向?qū)ο蟮摹⒖缙脚_(tái)的腳本語(yǔ)言[7],是Metasploit框架使用的開發(fā)語(yǔ)言。
不同于C語(yǔ)言等編譯型語(yǔ)言,Ruby和Python等解釋型語(yǔ)言需要解釋器才能執(zhí)行。實(shí)現(xiàn)一個(gè)解釋型語(yǔ)言的符號(hào)執(zhí)行引擎有兩種方式:(1)修改語(yǔ)言的解釋器,實(shí)現(xiàn)符號(hào)執(zhí)行引擎;(2)以對(duì)等架構(gòu),即語(yǔ)言庫(kù)的形式實(shí)現(xiàn)符號(hào)執(zhí)行引擎[8]。Joseph P和Daniel Jackson提出了一個(gè)利用對(duì)等架構(gòu)的Ruby符號(hào)執(zhí)行引擎的方法[9]。本文采用以語(yǔ)言庫(kù)的形式實(shí)現(xiàn)符號(hào)執(zhí)行引擎,實(shí)現(xiàn)了一個(gè)輕量級(jí)的Ruby語(yǔ)言符號(hào)執(zhí)行引擎。采用這種方法實(shí)現(xiàn)符號(hào)執(zhí)行引擎需要的代碼量較小,可以適用于各版本的語(yǔ)言解釋器。
本文的目標(biāo)是,對(duì)于給定的Metasploit的攻擊腳本,可以在沒有靶機(jī)環(huán)境的情況下,利用符號(hào)執(zhí)行技術(shù),自動(dòng)化提取其對(duì)應(yīng)攻擊流量,并且標(biāo)注攻擊流量中不同部分的屬性,記錄發(fā)送攻擊流量時(shí)的協(xié)議狀態(tài)轉(zhuǎn)移。
為了達(dá)成上述目標(biāo),對(duì)Metasploit框架進(jìn)行符號(hào)化擴(kuò)展。首先,要實(shí)現(xiàn)一個(gè)針對(duì)Ruby腳本語(yǔ)言的輕量級(jí)符號(hào)執(zhí)行引擎。其次,利用此符號(hào)執(zhí)行引擎對(duì)Metasploit框架進(jìn)行符號(hào)化擴(kuò)展,即對(duì)目標(biāo)探測(cè)API的符號(hào)化,對(duì)攻擊載荷構(gòu)造API的符號(hào)化,對(duì)攻擊狀態(tài)轉(zhuǎn)移API的符號(hào)化。最后,要對(duì)Metasploit的輸出API進(jìn)行劫持,使其把攻擊載荷直接輸出到文件。在圖1的例子中,smb_fingerprint屬于目標(biāo)探測(cè)API,smb_login屬于狀態(tài)轉(zhuǎn)移API。對(duì)Metasploit改造的整體架構(gòu)如圖2所示。
圖2 對(duì)Metasploit改造的架構(gòu)
一個(gè)采用對(duì)等架構(gòu)的輕量級(jí)腳本語(yǔ)言符號(hào)執(zhí)行引擎利用了面向?qū)ο蟮哪_本語(yǔ)言提供的動(dòng)態(tài)派發(fā)原子操作特性。在面向?qū)ο蟮哪_本語(yǔ)言中,包括整型和字符串類型等變量。當(dāng)執(zhí)行如“1+2”等語(yǔ)句時(shí),調(diào)用的其實(shí)是整型的“+”方法??梢岳梅椒ㄖ剌d的方式編寫新的代理類型,以覆蓋整型等類型的原有操作。
對(duì)等架構(gòu)符號(hào)執(zhí)行引擎的架構(gòu)如圖3所示。符號(hào)執(zhí)行引擎是與目標(biāo)程序運(yùn)行在同一進(jìn)程中的一個(gè)庫(kù)。不同于使程序以確切值運(yùn)行,符號(hào)執(zhí)行引擎向程序傳遞符號(hào)(代理)作為輸入。這些代理是特殊的對(duì)象,可以使符號(hào)執(zhí)行引擎觀測(cè)目標(biāo)程序?qū)@些輸入的操作。當(dāng)目標(biāo)程序?qū)σ粋€(gè)代理執(zhí)行操作(例如“+”)時(shí),語(yǔ)言解釋器會(huì)動(dòng)態(tài)將這個(gè)操作發(fā)送給符號(hào)執(zhí)行引擎提供的回調(diào)函數(shù),而這些回調(diào)函數(shù)會(huì)記錄代理輸入如何影響其他變量。當(dāng)目標(biāo)程序遇到與代理有關(guān)的條件分支語(yǔ)句時(shí),符號(hào)執(zhí)行引擎會(huì)再次被調(diào)用,然后符號(hào)執(zhí)行引擎會(huì)將約束條件發(fā)送給SMT(Satisfiability Modulo Theories)求解器來(lái)確定進(jìn)入哪個(gè)分支,以確保每條被探索的路徑都是合理的。
圖3 對(duì)等架構(gòu)
目前,符號(hào)和執(zhí)行僅可以處理?xiàng)l件分支語(yǔ)句,不能處理循環(huán)語(yǔ)句。當(dāng)循環(huán)語(yǔ)句的終止條件與符號(hào)有關(guān)時(shí),符號(hào)執(zhí)行引擎不能獲取足夠的信息進(jìn)行求解。研究總結(jié)發(fā)現(xiàn),攻擊腳本的代碼長(zhǎng)度一般較短,執(zhí)行路徑較為簡(jiǎn)單,只有極少的攻擊腳本中循環(huán)次數(shù)會(huì)與輸入有關(guān)。所以,即便不處理循環(huán)語(yǔ)句,符號(hào)執(zhí)行引擎仍能處理大部分攻擊腳本。
簡(jiǎn)單的Ruby語(yǔ)言代理對(duì)象和表達(dá)式的示例如下:
1.defSymblicObject
2. defmethod_missing(meth, *args)
3. Exp.new(meth, [self] + args)
4. end
5. def+(other)
6. Exp.new(:add, [self, other])
7. end
8. def==(other)
9. pid = fork()
10. if pid then
11. returntrue
12. else
13. returnfalse
14. end
15. end
16.end
17.classExp<SymblicObject
18. definitialize(rator, rands)
19. @rator = rator
20. @rands = rands
21. end
22.end
當(dāng)程序?qū)Ψ?hào)執(zhí)行“+”操作時(shí),不會(huì)生成一個(gè)確切的值,而是產(chǎn)生一個(gè)表達(dá)式,使程序中與符號(hào)有關(guān)的變量都表示成符號(hào)的表達(dá)式。當(dāng)程序執(zhí)行“==”操作時(shí),程序可以fork出兩個(gè)進(jìn)程,分別進(jìn)入不同的分支。實(shí)際實(shí)現(xiàn)中會(huì)引入SMT求解器,對(duì)路徑約束條件進(jìn)行求解。如果條件滿足,才會(huì)進(jìn)入分支,以去掉不可達(dá)分支。
本研究的求解器基于Z3求解器[10]。Z3求解器是微軟公司開源的一款求解器,對(duì)整型符號(hào)求解支持得較為完善。本研究擴(kuò)展了其對(duì)字符串符號(hào)類型的求解能力,目前僅支持有限的字符串操作,如相等、包含、前綴、后綴等布爾操作和追加、子串等操作。
攻擊載荷的本質(zhì)是一串字節(jié)流,可以用字符串類型表示。為了表示字符串,字符串符號(hào)采用以下表示:
<sym_string,content=[(o,c)…],label=xxx,length=yyy>
其中,content是一個(gè)列表,每個(gè)元素表示為(o,c),其中o為在字符串中的偏移,c為內(nèi)容;label表示字符串的屬性,可以使rand_text、shellcode等;length是字符串的長(zhǎng)度。
符號(hào)執(zhí)行引擎還會(huì)記錄所有的約束條件,將約束條件與流量相關(guān)聯(lián),以確定獲取的攻擊流量屬于哪個(gè)攻擊目標(biāo)。
2.3.1 目標(biāo)探測(cè)API符號(hào)化擴(kuò)展
目標(biāo)探測(cè)API是Metasploit中用來(lái)探測(cè)攻擊目標(biāo)版本即運(yùn)行環(huán)境的API,如用來(lái)探測(cè)Samba服務(wù)版本即運(yùn)行環(huán)境的smb_fingerprint。
正常運(yùn)行時(shí),目標(biāo)探測(cè)API會(huì)與攻擊目標(biāo)進(jìn)行交互,通過目標(biāo)返回的結(jié)果,返回目標(biāo)版本和運(yùn)行環(huán)境,其返回值通常是字符串類型或者整型。對(duì)這類API進(jìn)行符號(hào)化擴(kuò)展時(shí),省略其與攻擊目標(biāo)的交互,使其直接返回整型或字符串型的代理對(duì)象。
當(dāng)腳本需要根據(jù)目標(biāo)探測(cè)API判斷目標(biāo)是否含有漏洞或構(gòu)造相應(yīng)版本的攻擊載荷時(shí),符號(hào)執(zhí)行引擎會(huì)遍歷所有可能的分支,從而獲得所有攻擊目標(biāo)版本對(duì)應(yīng)的攻擊載荷。
2.3.2 攻擊載荷生成API符號(hào)化擴(kuò)展
攻擊載荷生成API是Metasploit中用來(lái)生成攻擊載荷的API,如生成隨機(jī)填充的rand_text_alpha。
這類API通常不需要網(wǎng)絡(luò)交互,其返回值一般是字節(jié)流。這些API可以分成以下兩類:(1)返回長(zhǎng)度固定但內(nèi)容隨機(jī)字節(jié)流的API,如rand_text_alpha(N)可以返回長(zhǎng)度為N但內(nèi)容隨機(jī)的一段字符串;(2)攻擊者選擇的內(nèi)容和長(zhǎng)度都可變的API,如payload()會(huì)根據(jù)攻擊者的選擇返回一段shellcode,這段shellcode的功能可能是建立一個(gè)反向連接,也可能是竊取某個(gè)密碼,其長(zhǎng)度和內(nèi)容都是不確定的。
使用帶標(biāo)簽的字符串類型符號(hào)對(duì)這類API進(jìn)行擴(kuò)展。帶標(biāo)簽的字符串類型符號(hào)有兩個(gè)屬性——字符串的長(zhǎng)度和描述其性質(zhì)的標(biāo)簽。它的性質(zhì)可以是rand_text、payload、nop_padding等,用于描述API的返回值在攻擊載荷中的作用。如果API返回字符串的長(zhǎng)度是已知的,則其長(zhǎng)度屬性是確切值;若長(zhǎng)度與其他符號(hào)有關(guān),則表示為符號(hào)的表達(dá)式。例如,對(duì)于rand_text_alpha(50)可以使其返回“<SymString,content=null,label=rand_text,length=50>”
2.3.3 攻擊狀態(tài)轉(zhuǎn)移API符號(hào)化
攻擊狀態(tài)轉(zhuǎn)移API是Metasploit改變攻擊狀態(tài)的API。在攻擊過程中,攻擊目標(biāo)的狀態(tài)基本等同于攻擊狀態(tài),如smb_login會(huì)使Samba服務(wù)變?yōu)橐呀?jīng)登陸的狀態(tài)。
這類API會(huì)與目標(biāo)進(jìn)行網(wǎng)絡(luò)交互,一般沒有返回值或有布爾類型的返回值。對(duì)于這類API的符號(hào)化擴(kuò)展的重點(diǎn)在于記錄其在攻擊流程中的調(diào)用順序。記錄可以表示為<編號(hào),函數(shù)名>的格式,其中編號(hào)保存在一個(gè)全局變量中,初始值為0。每次狀態(tài)轉(zhuǎn)移API被調(diào)用時(shí),先產(chǎn)生一條調(diào)用記錄,然后將編號(hào)加1。例如,圖1的攻擊腳本的狀態(tài)轉(zhuǎn)移API如下所示:
<0,connect>
<1,smb_login>
2.3.4 輸出API劫持
在完成構(gòu)造攻擊載荷后,攻擊腳本會(huì)通過網(wǎng)絡(luò)向目標(biāo)發(fā)送攻擊載荷進(jìn)行漏洞利用。為了獲取完整的攻擊載荷,劫持發(fā)送攻擊載荷的輸出API。
劫持從網(wǎng)絡(luò)層到應(yīng)用層的所有輸出API,改變輸出API的功能,使其將數(shù)據(jù)保存到文件里,而不是發(fā)送到網(wǎng)絡(luò)上,這樣就能獲取完整的攻擊流量。
為了維護(hù)攻擊流量的上下文信息,將輸出到本地文件中的攻擊流量與攻擊狀態(tài)轉(zhuǎn)移記錄和路徑約束記錄相關(guān)聯(lián)。
為了證明本文提出的攻擊流量提取方法是可行的,選取多個(gè)Metasploit中的攻擊腳本進(jìn)行測(cè)試。其中,圖1所示的攻擊腳本產(chǎn)生的攻擊流量如下:
1.<sym_string, content=null, label=rand_text,length=7>
2.
3.<sym_string, content=null, label=rand_text,length=100>
4.<sym_string, content=null, label=shellcode,length=null>
5.....
6.ABCDEFG
7.x08x04x02x00
8.xb0x1cx1fx00
9.<sym_string, content=[
10.(4, xb0x1cx1fx00),
11.(50, <sym_string, content=null, label=nop,length=8),
12.(58, xebx62)],
13.label=rand_text, length=70>
14.x00x00
15.<sym_string, content=null, label=rand_text,length=4>
16.
17.x61x00x00x00x00x00x00x00
18.(50, <sym_string, content=null, label=nop,length=8),
19.(58, xebx62)],
20.label=rand_text, length=70>
21.x00x00
22.<sym_string, content=null, label=rand_text,length=4>
23.
24.x61x00x00x00x00x00x00x00
為了方便與描述,對(duì)攻擊流量進(jìn)行分行。第7行和第8行所示的“x08x04x02x00”和”xb0x1cx1fx00”是利用Windows 2000操作系統(tǒng)上ms-08-067漏洞所需的固定字段。第4行表示長(zhǎng)度和內(nèi)容都可變的shellcode。第3行表示長(zhǎng)度為100的隨機(jī)字符串。第9~13行表示長(zhǎng)度為70的隨機(jī)字符串,但是與第3行不同,這個(gè)隨機(jī)字符串的某些子字符串是固定的。第9~13行表示的字符串content列表中的每一個(gè)元素表示這個(gè)字符串的一個(gè)子串,如第10行的(4,xb0x1cx1fx00)表示字符串偏移4位置的子字符串是“xb0x1cx1fx00”。
使用傳統(tǒng)的流量抓取方法提取此攻擊腳本針對(duì)Windows 2000目標(biāo)的攻擊流量,與使用符號(hào)執(zhí)行方法獲取的攻擊流量在語(yǔ)義上是匹配的,但本文對(duì)攻擊流量的表示方法更適合編寫相應(yīng)的防御規(guī)則。
本研究首先對(duì)當(dāng)前最流行的攻擊框架Metasploit進(jìn)行分析與研究,歸納了框架的整體架構(gòu),對(duì)框架提供的API進(jìn)行分類,總結(jié)了攻擊腳本的執(zhí)行步驟和攻擊流量的組成。其次,研究針對(duì)Ruby語(yǔ)言的符號(hào)執(zhí)行,利用對(duì)等架構(gòu)實(shí)現(xiàn)了一個(gè)輕量級(jí)的Ruby符號(hào)執(zhí)行引擎。最后,利用符號(hào)執(zhí)行技術(shù)對(duì)Metasploit攻擊框架進(jìn)行改造。對(duì)給定的攻擊腳本,可以在沒有靶機(jī)環(huán)境的情況下,提取相應(yīng)的攻擊流量,并標(biāo)記攻擊流量不同部分的屬性,記錄發(fā)送攻擊載荷時(shí)的目標(biāo)狀態(tài)。
下一步的研究工作可以從以下兩個(gè)方向展開:
(1)完善符號(hào)執(zhí)行引擎。目前的符號(hào)執(zhí)行引擎仍然存在不足,一是缺少對(duì)字符串的相關(guān)操作,尤其是涉及正則表達(dá)式操作的求解器;二是當(dāng)循環(huán)語(yǔ)句的結(jié)束條件與符號(hào)有關(guān)時(shí),符號(hào)執(zhí)行引擎不能正確處理循環(huán)。
(2)對(duì)Metasploit進(jìn)行更全面的改造。本研究為了驗(yàn)證文中提出的攻擊流量提取方法,對(duì)Metasploit中部分網(wǎng)絡(luò)協(xié)議的API進(jìn)行了改造。將來(lái)可以對(duì)更多的網(wǎng)絡(luò)協(xié)議API進(jìn)行改造,以支持更多的攻擊腳本。