當前位置:
首頁 > 最新 > 網路協議逆向初探—Netzob簡介及優劣性分析

網路協議逆向初探—Netzob簡介及優劣性分析

Netzob是一款由法國學者Georges Bossert和Frédéric Guihéry開發的,在網路協議逆向工程中, 用於劃定欄位邊界,描述欄位語義,流量生成,和模糊測試通信協議的開源工具。其中:

欄位邊界:將原始協議報文劃分為若干個可識別欄位。

欄位語義:欄位數據所約定的含義,包含靜態語義和動態語義。

流量生成:生成與主機進行交互的網路流量。

模糊測試:通過向被測試系統注入大量非預期的輸入來發現潛在的漏洞。

應用層協議包括兩種基礎組成部分:協議狀態機和報文格式。這款工具能做到通過主動與被動過程來推斷報文格式(詞法),和協議狀態機(語法)。如圖1所示,Netzob的協議逆向分析由三個階段組成:導入,協議推斷,和模擬。

第一階段:導入

Netzob可導入多種數據,如實時網路通信,進程間通信數據,捕捉的網路通信(PCAP)和oSpy文件格式的API。

使用函數PCAPImporter或FileImporter導入一個或多個文件,Netzob在導入過程中對原始報文進行解碼轉換,並分層歸類。同時,可選擇伯克利封包過濾器來限制導入的封包內容,指定導入的網路協議層數和指定導入數據包的數量。數據包導入後的格式為messages。

下圖為導入的.pcap格式的Modbus數據包:

第二階段:協議推斷

將導入的messages合併(若有多個文件導入)並提取出規範化的形式Symbol。Symbol是相似報文的抽象化。屬性相似的報文在協議里擔當相同的角色。例如,TCP會話集中的SYN報文可抽象化為同一符號。Symbol結構明確了一系列可預判的欄位(field)。這些欄位有固定或可變的長度。圖3為由modbus協議生成的messages提取的Symbol。

1

詞法推斷

>>>>

1. 欄位分割

a) splitDelimiter字元分割:用於分割的字元可以為ASCII, 自定義, 十六進位字元串, 以及任何符合抽象數據類型AbstractType的對象。

圖4的Symbol中,每行都包含字元「#」,因此將「#」作為分割符將每行分成多個欄位(圖5)。

圖4. Symbol

圖5. 字元「#」分割

b) splitStatic:根據靜態分布的分割。

如圖7所示,圖6分割後的各欄位中:Field-0,field-2。Field-4為動態欄位,Field-1和Field-3為靜態欄位。

圖6. Symbol

圖7. 靜態分割

c) splitAligned:檢測活動的循環部分。用Needleman-Wunsch序列比對演算法進行位元組定界。此演算法對包含可變長度的動態欄位更有效。

對圖8 Field-2再分割。根據Needleman-Wunsch演算法,相似匹配度高的被分配在同一欄位(圖9)。

圖8. Field-2

圖9. 對齊分割

>>>>

2.報文分簇—重組報文

Netzob對分割後的報文進行分簇,使用的函數有:

clusterByKeyField

clusterbyApplicativeData

clusterBySize

clusterByAlignment

clusterByKeyField:根據關鍵欄位分簇重組。

如圖10,字元分割後的各欄位中,Field-0包含了多種命令,如CMDidentify, CMDbye.等.因此,以Field-0作為 key field來分簇。分簇生成了14個不同的symbol(圖11)。

圖10. 字元分割的欄位

圖11. 分簇後的14個symbol

clusterbyApplicativeData:根據協議內嵌的應用數據分簇。用戶需自定義Applicative Data,如ACK,SYN(圖12)。

圖 12. 自定義應用數據

clusterBySize根據長度分簇:相同長度的欄位被重新歸為一組(圖13)。

圖13. 根據長度分簇

clusterByAlignment:使用UPGMA(unweighted pair-group method with arithmetic means)非加權組平均法,構造系統樹來進行多序列比對,最大化邊界。

>>>>

3.各symbol之間的關係(RelationFinder)

確定潛在的報文欄位之間的關係並根據所找到的關係修改報文格式。

2

語法推斷

abstractSession:提取導入的原始報文的序列,包括在同一時間交換的報文。

推斷狀態機:

狀態機是特徵化的所有可能的,合理的報文序列。狀態機包含一組狀態集(states)、一個起始狀態(start state)、一組輸入符號集(alphabet)、一個映射輸入符號和當前狀態到下一狀態的轉換函數(transition function)的計算模型。狀態機可以用一個有向圖形來描述,由一組節點和一組相應的轉移函數組成。狀態機通過響應一系列事件而「運行」。每個事件都在屬於「當前」節點的轉移函數的控制範圍內。這些節點中至少有一個必須是終態。當到達終態,狀態機停止。

以下為Netzob中可生成的狀態機:

狀態機鏈Chained States Automata: 圖14為一個基本的自動機,包括一系列來描述報文傳輸的命令和響應的序列。每發送一個報文都將創建一個新的狀態(State1-State8)。一系列報文的狀態組成了狀態機鏈。

圖14. 狀態機鏈

單狀態機 One State Automata: 圖15的狀態機中只生成了一個狀態(main state),其中包含了每一個合理的接收與發送報文。

圖15. 單狀態機

PTA Automata: 合併不同的從Prefix Tree Acceptor中抽象得來的報文序列來生成狀態機(圖16)。

這裡用到的Prefix Tree前綴樹,是一種多叉樹結構,圖17為一棵Trie樹,包含了關鍵詞:{『to』, 』tea』, 『ted』, 『ten』, 『a』, 『in』, 『inn』}. Trie樹把每個關鍵字保存在一條路徑上. 兩個有公共前綴的關鍵字,在Trie樹中前綴部分的路徑相同。

圖16. PTA狀態機

圖17. 前綴樹示

第三階段:模擬

1

流量生成

流量生成– 與真實的伺服器通信來驗證報文格式是否正確

a) 啟動Netzob中內置的伺服器(IP client, Raw Ethernet client, SSL client, TCP client/server, UDP client/server)

b.)如圖18所示,連接一個客戶端,讓推斷出的報文與伺服器通信。客戶端代表通信的遠端埠,可以收發生成的狀態機和報文格式的數據。為了確保接收與發送的Symbol和具體消息能夠相互轉化,使用一個抽象層(Abstraction Layer),圖19為抽象層的內容。

圖18. 流量生成

圖19. 抽象層

圖20. Incoming messages

從圖20結果來看,收到的報文格式是正確的,伺服器能分析它們並發送正確回應。

2

模糊測試

模糊測試(Fuzzing)通過向被測試系統注入大量非預期的輸入來發現潛在的漏洞。

如圖21,選定一個有動態欄位(CMDencrypt)的報文,改變報文結構。

圖21. 生成非預期報文

下圖可看出Netzob只發出了最後一個欄位的CMDencrypt報文。

圖22. 發送非預期報文

圖23為用原始報文和改過的報文向伺服器詢問過程。含有動態欄位的原始報文發送到伺服器,得到了回應。而被修改過動態欄位的測試報文發送後得到了錯誤消息。

圖23. Fuzzing過程

如圖24所示,服務端得到了錯誤消息,解析最後一個欄位時產生了bug。

圖24. 錯誤消息

總結

Netzob主要用 Needleman-Wunsch演算法和UPGMA對報文分割分簇,以此來劃定欄位邊界。提取欄位類型特徵,將類型具體化為表達式,並用搜索演算法識別內在符號的依賴關係來描述欄位語義。Netzob用主動推斷的方式基於報文序列方法推斷狀態機,利用詢問和應答的反饋不斷擴充已有樣本來推斷狀態機。但Netzob對於欄位之間存在的順序、並列和層次三種結構關係缺乏描述,也無法分析出欄位取值所需要滿足的特定約束條件。Netzob對於欄位語義的描述引入過多的先驗知識,因此對於未知網路協議分析具有一定的局限性。

參考文獻

[2] 「使用Netzob逆向未知協議.」 www.anquanke.com/post/id/85441.

[3] Georges Bossert. Security Evaluation of Communication Protocols in Common Criteria

[4] 吳禮發.網路協議逆向分析及應用,2016

[5] https://baike.baidu.com/item/%E7%8A%B6%E6% 80%81%E6%9C%BA/6548513

內容編輯:安全大數據分析實驗室 王語嫣 責任編輯:肖晴


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 綠盟科技研究通訊 的精彩文章:

TAG:綠盟科技研究通訊 |