網路協議逆向初探—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:綠盟科技研究通訊 |