尹譽(yù)衡
(華北計(jì)算技術(shù)研究所, 北京 100089)
互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,不僅使得計(jì)算機(jī)網(wǎng)絡(luò)成為人們工作和生活不可或缺的部分,也使得針對(duì)互聯(lián)網(wǎng)的網(wǎng)絡(luò)攻擊不斷增多[1]。但由于各種原因,如網(wǎng)絡(luò)協(xié)議本身在設(shè)計(jì)和實(shí)現(xiàn)時(shí)比較復(fù)雜,程序的開發(fā)人員使用網(wǎng)絡(luò)協(xié)議進(jìn)行程序處理時(shí)可能會(huì)設(shè)立不合適的假設(shè)前提及進(jìn)行不適當(dāng)?shù)倪壿嬏幚韀2],安全工作者時(shí)常會(huì)發(fā)現(xiàn)與網(wǎng)絡(luò)程序相關(guān)的漏洞。
網(wǎng)絡(luò)程序漏洞種類豐富,難以防御,再加上這類病毒具備依托于網(wǎng)絡(luò)進(jìn)行傳播的特性,所造成的損失也是十分巨大的。2003年,在Windows系統(tǒng)之間散播的沖擊波蠕蟲病毒至少攻擊了全球80%的Windows用戶[3],2007年,被具有強(qiáng)大破壞能力的熊貓燒香病毒感染的個(gè)人用戶高達(dá)幾百萬,惡意攻擊者利用網(wǎng)絡(luò)對(duì)互聯(lián)網(wǎng)上的設(shè)備發(fā)動(dòng)遠(yuǎn)程攻擊,規(guī)模巨大,直接影響到了整個(gè)互聯(lián)網(wǎng)的安危[4]。
為了降低網(wǎng)絡(luò)攻擊對(duì)互聯(lián)網(wǎng)的影響,安全從業(yè)者應(yīng)當(dāng)及時(shí)挖出漏洞,并發(fā)布補(bǔ)丁,保障網(wǎng)絡(luò)世界的安全,這對(duì)互聯(lián)網(wǎng)的良好發(fā)展有著十分深遠(yuǎn)的意義。
本文重點(diǎn)研究了基于Fuzzing的網(wǎng)絡(luò)協(xié)議漏洞挖掘技術(shù),采用對(duì)智能工具Sulley進(jìn)行改進(jìn)的方法,設(shè)計(jì)了變異規(guī)則和系統(tǒng)構(gòu)成,對(duì)FTP協(xié)議進(jìn)行Fuzzing測(cè)試,通過搭建模擬環(huán)境進(jìn)行實(shí)驗(yàn)證明了該方法的有效性。
對(duì)網(wǎng)絡(luò)協(xié)議進(jìn)行分析是網(wǎng)絡(luò)協(xié)議漏洞挖掘中的重要一環(huán)[5],通常采用截獲網(wǎng)絡(luò)通信流量,分析網(wǎng)絡(luò)數(shù)據(jù)包,進(jìn)而分析網(wǎng)絡(luò)協(xié)議,挖掘網(wǎng)絡(luò)協(xié)議漏洞的方法,對(duì)網(wǎng)絡(luò)協(xié)議進(jìn)行漏洞挖掘。其步驟如下。
(1) 獲取測(cè)試目標(biāo)的通信流量。在截獲流量后,可以通過改變輸入過程中的一項(xiàng)或幾項(xiàng)重要參數(shù),發(fā)送給測(cè)試目標(biāo),觀察測(cè)試結(jié)果。這種改變流量的方式對(duì)網(wǎng)絡(luò)協(xié)議結(jié)構(gòu)的分析會(huì)起到很重要的作用,尤其是對(duì)未公開的協(xié)議[6],比如可以通過改變用戶名和密碼等輸入?yún)?shù)來改變流量,從而分析協(xié)議。
(2) 流量分類。在對(duì)流量進(jìn)行分類時(shí),通常會(huì)按照流量的功能不同來對(duì)流量分類。一般來說,基本功能大致相同的函數(shù)所生成的網(wǎng)絡(luò)流量通常會(huì)是比較相似的,所以在進(jìn)行網(wǎng)絡(luò)協(xié)議分析時(shí),是可以按照流量的功能來對(duì)流量進(jìn)行分類的。
(3) 分層分析。TCP/IP協(xié)議中的傳輸層記錄的是端口信息,通常是固定的,可以作為流量識(shí)別的特征,但是P2P類型的軟件,使用端到端的流量傳輸方式,就不能將端口作為識(shí)別特征。不同的軟件在進(jìn)行傳輸?shù)倪^程中通常會(huì)在應(yīng)用層才體現(xiàn)出差別,通過分析應(yīng)用層協(xié)議報(bào)文,獲取流量指紋特征并加以分類,就可以更好地區(qū)別軟件,所以實(shí)際上分析網(wǎng)絡(luò)協(xié)議相當(dāng)于分析應(yīng)用層協(xié)議。
Fuzzing技術(shù)是一種快速有效發(fā)現(xiàn)程序漏洞的方法,通過在程序外部輸入非常規(guī)數(shù)據(jù)引起程序崩潰,并跟蹤程序執(zhí)行輸入的過程,挖掘引發(fā)程序崩潰的漏洞[7]。但是在網(wǎng)絡(luò)協(xié)議漏洞挖掘過程中,如果采用變異的用例生成方法,通常會(huì)面臨測(cè)試用例無法通過校驗(yàn)的情況,從而導(dǎo)致大量的用例無法使用,造成時(shí)間和資源上的浪費(fèi)[8]。目前Fuzzing在漏洞挖掘領(lǐng)域中被廣泛應(yīng)用,比如通過構(gòu)造畸形數(shù)據(jù)的文件對(duì)文件操作軟件進(jìn)行Fuzzing,從而發(fā)現(xiàn)文件操作軟件的漏洞。
與其他的漏洞挖掘方法如代碼審計(jì)、靜態(tài)分析、動(dòng)態(tài)分析等相比,F(xiàn)uzzing有許多其他方法不具備的優(yōu)點(diǎn)[9]:(1)Fuzzing可以是一種黑盒測(cè)試方法,不需要源代碼即可對(duì)軟件進(jìn)行分析;(2)Fuzzing的使用可以不用關(guān)心被測(cè)對(duì)象的實(shí)現(xiàn)語言、運(yùn)行平臺(tái)等細(xì)節(jié)。(3)Fuzzing的可重用性較好 , 一個(gè)測(cè)試用例可用于多個(gè)同類型對(duì)象。
Fuzzing技術(shù)步驟如圖1所示。
圖1 Fuzzing步驟
(1) 確定測(cè)試對(duì)象。確定了測(cè)試對(duì)象后才能選擇測(cè)試方法和工具,對(duì)于測(cè)試對(duì)象,需要明確是否開源、是否掌握測(cè)試對(duì)象的輸入輸出格式、是否有已知漏洞、已知漏洞的觸發(fā)方式和觸發(fā)點(diǎn)等信息。
(2) 確定測(cè)試對(duì)象的輸入。通常要觸發(fā)目標(biāo)軟件的漏洞,就需要構(gòu)造非預(yù)期的輸入數(shù)據(jù),當(dāng)目標(biāo)沒有對(duì)輸入進(jìn)行有效的檢驗(yàn)或是沒有相應(yīng)的適當(dāng)錯(cuò)誤處理時(shí),就會(huì)引起目標(biāo)軟件出錯(cuò)。Fuzzing是一個(gè)構(gòu)造非預(yù)期輸入來測(cè)試目標(biāo)軟件的過程,要想高效地進(jìn)行Fuzzing,就需要構(gòu)造有針對(duì)性的數(shù)據(jù)輸入,減少無效測(cè)試的次數(shù),提高Fuzzing的效率。
(3) 生成測(cè)試數(shù)據(jù)[10]。根據(jù)用例生成采用的不同算法可分為兩類生成方法:基于變異的方法和基于生成的方法?;谧儺惖乃惴ㄊ侵竿ㄟ^特定的算法按照一定的規(guī)則修改樣本中的某些數(shù)據(jù),生成一批非常規(guī)的樣本,而基于生成的算法則是不需要合法樣本就自動(dòng)生成一些非常規(guī)的數(shù)據(jù)樣本,這個(gè)生成過程通常采用自動(dòng)化的方式生成。
(4) 執(zhí)行測(cè)試數(shù)據(jù)。通常情況下,執(zhí)行完Fuzzing用例生成的過程就會(huì)立即執(zhí)行Fuzzing執(zhí)行的過程,所以通常會(huì)以自動(dòng)化方法實(shí)現(xiàn)用例執(zhí)行的過程。如果采用手動(dòng)執(zhí)行的方式,不僅工作量巨大費(fèi)時(shí)費(fèi)力,還容易出現(xiàn)誤差。
(5) 監(jiān)視異常。異常檢測(cè)是在Fuzzing過程中,軟件執(zhí)行輸入數(shù)據(jù)后,檢測(cè)目標(biāo)軟件的執(zhí)行情況,跟蹤軟件是否崩潰,是否拋出異常,記錄所有異常信息的過程。
(6) 分析測(cè)試結(jié)果。根據(jù)異常信息進(jìn)行人工分析。
系統(tǒng)設(shè)計(jì)是基于智能測(cè)試工具Sulley進(jìn)行的,通過對(duì)Sulley對(duì)網(wǎng)絡(luò)協(xié)議進(jìn)行Fuzzing的改進(jìn)和擴(kuò)展,開發(fā)了一種針對(duì)FTP[11]協(xié)議的模糊器。首先通過變異器生成輸入數(shù)據(jù),通過流量截獲模塊截獲流量數(shù)據(jù)包,再通過數(shù)據(jù)包分析模塊分析網(wǎng)絡(luò)協(xié)議,確定數(shù)據(jù)入口,最后通過會(huì)話管理模塊連接目標(biāo),開始Fuzzing測(cè)試。系統(tǒng)架構(gòu)如圖2所示。
圖2 系統(tǒng)架構(gòu)
流量截獲模塊:針對(duì)網(wǎng)絡(luò)協(xié)議的漏洞挖掘,需要有原始的數(shù)據(jù)包作為樣本進(jìn)行分析。設(shè)計(jì)流量截獲模塊,通過tcpdump和wireshark等工具獲取FTP客戶端與服務(wù)器之間的通信流量。
數(shù)據(jù)包分析模塊:流量獲取之后內(nèi)容繁多,需要對(duì)流量進(jìn)行清洗,分析有效字段,確定協(xié)議數(shù)據(jù)輸入入口。
數(shù)據(jù)生成模塊:相較于基于生成的測(cè)試用例生成方法生成的測(cè)試用例,基于網(wǎng)絡(luò)協(xié)議通信數(shù)據(jù)進(jìn)行變異的測(cè)試用例可以更有效地發(fā)現(xiàn)漏洞。因此在分析網(wǎng)絡(luò)數(shù)據(jù)包的基礎(chǔ)上,對(duì)輸入樣例進(jìn)行字符變異和寬度變異操作,從而獲得所需的測(cè)試用例。
會(huì)話管理模塊:該模塊從數(shù)據(jù)生成模塊處獲取測(cè)試用例,將其作為輸入發(fā)送給服務(wù)端,從而引起服務(wù)端的錯(cuò)誤。
變異器的作用是分別對(duì)網(wǎng)絡(luò)協(xié)議中數(shù)值類型和字符串類型的協(xié)議字段進(jìn)行變異和模糊處理,在具體設(shè)計(jì)中為了確保Fuzzing的有效性,需要重點(diǎn)考慮模糊次數(shù)的有限性。
(1) 數(shù)值模糊的方法
數(shù)值模糊是指根據(jù)協(xié)議中的數(shù)值字段的初始值來確定變異范圍。比如,數(shù)值字段的初始是200,那么變異范圍在初始值-100和+100的范圍內(nèi),即在閉區(qū)間[100,300]內(nèi)取值。
實(shí)現(xiàn)的方法步驟如下。
1) 根據(jù)數(shù)值字段初始值V,確定變異范圍 [V-100,V+100];
2) 確定變異函數(shù)y=logax+b;其中,a和b使用偽隨機(jī)算法獲得,以確保變異策略多次運(yùn)行可產(chǎn)生不同的變異值。
3) 通過已確定的變異函數(shù),使用變異范圍[V-100,V+100]的邊界值V-100、V+100和式x=ay-b計(jì)算x的取值范圍[X1,Xn]。
4) 根據(jù)設(shè)定的變異次數(shù)C={5,10,50,100},計(jì)算x在[X1,Xn]范圍內(nèi)的取值。例如,C=5,計(jì)算步徑L=[Xn-X1]/5,那么x的取值分別是{X1,X1+L,X1+2L,X1+4L,Xn}。
5) 最后根據(jù)確定的變異函數(shù),計(jì)算y值,即為最后的變異值。
使用對(duì)數(shù)函數(shù)的取值方法可保證模糊數(shù)據(jù)具有一定的變化速度和覆蓋寬度。
(2) 字符串變異方法
字符串變異方法主要采取字符替換和寬度變換,或?qū)煞N方式結(jié)合使用的方式模糊已知的初始字符串。
字符替換需要基于樣本文件來實(shí)現(xiàn),通常測(cè)試工具自帶樣本文件,測(cè)試人員也可以自備樣本文件。字符替換變異測(cè)試用例生成操作過程,如圖3所示。
圖3 字符替換變異流程
例如,初始字符串值S1為“AABBCC1234”,自定義變異樣本S2為{“%”,“&”,“#”,“@*”,“000”,“233”},跳變長(zhǎng)度L為3,迭代次數(shù)N為4。變異器生成隨機(jī)值S2_N(假設(shè)為2),并從變異樣本S2中先后隨機(jī)抽取S2_N次值如“#”“%”將初始值替換為“#AB%CC#23%”,再將迭代次數(shù)減1,則再迭代3次,最終得到變異字符串。
寬度變異指將初始字符串的長(zhǎng)度翻倍,倍數(shù)由測(cè)試人員確定,例如,初始字符串為“AABBCC”,設(shè)定長(zhǎng)度倍數(shù)是3,則生成的變異字符串為“AABBCCAABBCC”。
當(dāng)需要將字符變異和寬度變異兩種方式結(jié)合的時(shí)候,默認(rèn)先進(jìn)行寬度變異,再進(jìn)行長(zhǎng)度變異。
本文采用一種基于Fuzzing的網(wǎng)絡(luò)協(xié)議漏洞挖掘方法,通過對(duì)Sulley智能工具進(jìn)行改進(jìn),以FTP服務(wù)器作為實(shí)驗(yàn)對(duì)象,對(duì)FTP協(xié)議進(jìn)行漏洞挖掘,實(shí)現(xiàn)了FTP的漏洞挖掘系統(tǒng)。
實(shí)驗(yàn)測(cè)試對(duì)象為Uplus FTP Server。Uplus FTP Server是一款FTP文件服務(wù)端軟件,支持標(biāo)準(zhǔn)的FTP協(xié)議,提供FTP文件傳輸服務(wù),運(yùn)行平臺(tái)為Windows系列操作系統(tǒng)。
測(cè)試環(huán)境安裝在虛擬機(jī)上,使用兩臺(tái)安裝了Windows7操作系統(tǒng)的虛擬機(jī),一臺(tái)作為服務(wù)端,一臺(tái)作為客戶端。
在服務(wù)端正常安裝并配置啟動(dòng)Uplus FTP Server,開放端口21。使用終端窗口連接服務(wù)端,如圖4、圖5所示。
圖4 FTP服務(wù)端開啟
圖5 FTP客戶端連接
根據(jù)圖3所示的系統(tǒng)架構(gòu),在理解FTP規(guī)范的基礎(chǔ)上,首先截獲FTP協(xié)議通信流量,再通過數(shù)據(jù)包分析模塊提取FTP流量,根據(jù)協(xié)議格式拆分?jǐn)?shù)據(jù)包,提取原始輸入集,確定數(shù)據(jù)輸入入口,最后根據(jù)設(shè)定的變異規(guī)則使用數(shù)據(jù)生成模塊來對(duì)輸入進(jìn)行變異,生成測(cè)試數(shù)據(jù)集。FTP數(shù)據(jù)報(bào)文格式如圖6所示。
圖6 FTP數(shù)據(jù)包報(bào)文格式
啟動(dòng)Uplus FTP Server,使用終端連接服務(wù)器,執(zhí)行測(cè)試用例。本次實(shí)驗(yàn)使用mkdir和delete兩個(gè)命令分別進(jìn)行3次實(shí)驗(yàn),執(zhí)行成功后結(jié)果將返回至客戶端,記錄到日志中。
日志結(jié)果記錄如圖7所示。
圖7 日志結(jié)果記錄
從日志中可以觀察到,mkdir命令有失敗記錄,輸入的測(cè)試用例是200個(gè)“A”?;诖耍謩?dòng)構(gòu)造寬度變異測(cè)試用例,進(jìn)行多次實(shí)驗(yàn),得出以下結(jié)論:測(cè)試用例長(zhǎng)度超過400個(gè)字節(jié)時(shí),被測(cè)目標(biāo)返回“拒絕訪問”;測(cè)試用例長(zhǎng)度超過4 000個(gè)字節(jié)時(shí),被測(cè)目標(biāo)不再返回響應(yīng)碼,停止工作。
本文首先介紹了網(wǎng)絡(luò)攻擊的危害性和進(jìn)行網(wǎng)絡(luò)協(xié)議漏洞挖掘的重要性。然后對(duì)網(wǎng)絡(luò)協(xié)議分析技術(shù)和Fuzzing技術(shù)進(jìn)行了研究。第三部分設(shè)計(jì)了一種基于Sulley進(jìn)行改造的Fuzzing測(cè)試系統(tǒng),設(shè)計(jì)了各部分的功能模塊。最后通過對(duì)FTP服務(wù)器的測(cè)試,證明了該方法的有效性和正確性。今后將加強(qiáng)對(duì)未知和加密協(xié)議格式自動(dòng)識(shí)別方法的研究,一方面通過基于數(shù)據(jù)流的協(xié)議格式分析技術(shù)來獲取未知協(xié)議的格式,以作為Fuzzing輸入來對(duì)未知格式的網(wǎng)絡(luò)協(xié)議進(jìn)行漏洞挖掘,另一方面,利用中間人攻擊和CA證書偽造技術(shù)的共同作用,對(duì)加密協(xié)議的原報(bào)文進(jìn)行讀取與解密,從而實(shí)現(xiàn)對(duì)加密協(xié)議的協(xié)議格式分析。通過分析未知格式協(xié)議和加密協(xié)議,提高系統(tǒng)的使用覆蓋面,從而加強(qiáng)系統(tǒng)的智能化和自動(dòng)化程度。