本文簡要介紹了Fuzz 工具Peach的使用,並通過文件格式 Fuzz舉例闡述了 Peach Pit 文件的編寫。
本文轉自“綠盟科技博客”:http://blog.nsfocus.net/peach-fuzz/
1、引言
Fuzz(模糊測試)是一種通過提供非預期的輸入並監視異常結果來發現軟件安全漏洞的方法。模糊測試在很大程度上是一種強制性的技術,簡單並且有效,但測試存在盲目性。
典型地模糊測試過程是通過自動的或半自動的方法,反復驅動目標軟件運行並為其提供構造的輸入數據,同時監控軟件運行的異常結果。
Fuzz被認為是一種簡單有效的黑盒測試,隨着Smart Fuzz的發展,RCE(逆向代碼工程)需求的增加,其特征更符合一種灰盒測試。
Peach是一個優秀的開源Fuzz框架。
2、Peach簡介
2.1 概述
Michael Eddington等人開發的Peach是一個遵守MIT開源許可證的模糊測試框架,最初采用Python語言編寫,發布於2004年,第二版於2007年發布,最新的第三版使用C#重寫了整個框架。
Peach支持對文件格式、ActiveX、網絡協議、API等進行Fuzz測試;Peach Fuzz的關鍵是編寫Peach Pit配置文件。
Windows下使用Peach3需要預先安裝.net 4和windbg;Linux、OS X下需要安裝Mono .net開發框架。
2.2 命令行參數
- -1:執行第1次測試。
- -a:啟動Peach代理。不指定”channel”默認為本地代理(默認支持,無需顯式啟動);
“channel”可以指定為”tcp”遠程代理。
- -c:統計測試用例數。
- -t:驗證Peach Pit xml文件正確性。
- -p:並行Fuzz。運行Peach的機器總數為M,這是第N個。
- –debug:調試信息開關。
- –skipto:指定Fuzz跳過的測試用例數。
- –range:指定Fuzz的測試用例范圍。
3、Peach文件Fuzz
3.1 Peach文件Fuzz流程圖
3.2 Peach Pit
在使用Peach進行Fuzz之前需要編寫被稱為”Peach Pit”的xml配置文件,其中包含着如何進行Fuzz的關鍵信息,如下圖:
其主要元素包括:
- DataModel
一個Pit文件至少會包括一個或多個DataModel,描述數據類型信息,關系(大小、數量、偏移量),和其它允許智能Fuzz的信息。如下圖:
其屬性包括:
1) name:數據模型的名字[必須]。
2) ref:引用模版數據模型[可選]。DataModel有ref屬性時,與被引用DataModel類似
於子類與基類的關系,基類數據會被子類繼承,子類子元素會覆蓋基類同名子元素,
3) mutable:數據元素可變異性[可選,默認true]。
其主要子元素:Blob、Block、Choice、Flags、String、Number、Relation等。
1) Blob:常用於表示沒有類型定義和格式的數據,如下圖:
其主要屬性包括:
- value:Blob默認值。
- length : blob的字節長度, blob長度判斷會根據后續有token元素的位置計算。
- token:這個元素解析是否作為”標記”,默認false。
2) Block:用來組合一個或者多個的其他元素。Block和DataModel是很類似的,一個重要區別在於它們的位置,DataModel是頂級元素, Block是其子元素。
其不同於DataModel的屬性包括:
- minOccurs:這個Block所必須出現的最低次數[可選] 。
- maxOccurs :這個Block可能會出現的最高次數[可選]。
3) Choice:每次選擇其中一個元素,類似switch語句。如下圖:
minOccurs為最小生成Choice數;maxOccurs為最大生成Choice數,-1為無上限;occurs為必須產生的次數,如果不能達到這個次數,異常退出。具體匹配實現按照Choice中Block順序,crack(解析)數據時根據token匹配一個Block后,數據位置后移匹配Block大小,繼續按照Choice中Block順序從頭匹配。
4) Flags: Flag元素定義包含在Flags容器中的位字段,如下圖:
其主要屬性包括:
- size:大小,以位數為單位[必須] 。
- position:flag的起始位置(以0為基准)[必須]。
5) String:定義一個或者雙字節的字符串,如下圖:
其主要屬性包括:
- nullTerminated:字符串是以null結尾[可選] 。
- type:字符編碼類型,默認”ascii”,可用選項有ascii, utf7, utf8, utf16, utf16be,
utf32 [可選]。
- padCharacter:填充字符串,來填充達到length的長度,默認是0x00[可選]。
6) Number:定義了長度為8,16,24,32 或者64位的二進制數字,如下圖:
其主要屬性包括:
- size:Number的大小,以位為單位。有效的選擇是1-64 [可選]。
- endian:數字的字節順序,默認是小端字節[可選]。
- signed:是否是有符號,默認是true[可選]。
7) Relation:用於連接兩個大小、數據、偏移量相關元素,如下圖:
type類型為size時,of表示Number 是Value字符串的字節數。expressionGet用於crack過程,表示讀”Value”多少字節。expressionSet用於publishing過程,為Publisher 生成Number值。
- StateModel
用於定義測試的邏輯,實際上相當於一個狀態機。如下圖:
下級標簽包括State,每個State中又可以包含若干個Action標簽。
1) State:表示一個狀態,不同的State之間可以根據一些判斷條件進行跳轉,通常和Action的when屬性聯合使用。如下圖:
2) Action:用於完成StateModel中的各種操作,是給Publisher發送命令的主要方式。Action能發送輸出、接收輸入、打開連接,也能改變State等。主要屬性:
- type:操作類型[必須]。主要類型:
start:啟動Publisher,隱含動作,一般不需要。
stop:停止Publisher,隱含動作,一般不需要。
input:接收或者讀取來自Publisher的輸入,需要指定DataModel,用於crack和包含輸入數據。
ouput:通過Publisher發送或者寫輸出,需要一個DataModel ,包含可選data,如下圖:
- when:如果提供的表達式為true,完成操作;否則,跳過。
- ref:狀態變更后的引用[type=changeState] 。
- method:call的方法 [必須, type=call],調用Publisher可選參數定義的方法,不
是所有Publisher都支持。
- Agent
是能夠運行在本地或者遠程的特殊的peach進程,這些進程能夠啟動監視器監控被測目標,如附加調試器、檢測crash等。如下圖:
遠程Agent需要首先在遠程目標機通過peach –a tcp啟動遠程代理,無需pit文件。本地peach pit文件添加如下圖location,其中ip為目標機ip。
可用Monitor如下圖:
Windows Debugger Monitor通過windbg控制一個windows調試實例,主要參數:
- CommandLine :運行的命令行,如下圖:
文件fuzz時上述文件名fuzzed.wav需要與Publisher參數一致。如下圖:
- SymbolsPath:windbg符號路徑。
- StartOnCall :StateModel有匹配調用時附加調試器。
- NoCpuKill:默認false,表示當被測目標進程cpu占用為0時將其結束。
Peach3對非內核目標使用的混合調試模式,首先通過CreateProcess DEBUG_PROCESS參數創建調試進程,當檢測到被測目標有感興趣faults產生時會使用windbg的dbgeng.dll進行重現調試,最后利用windbg插件msec.dll的!exploitable命令對漏洞的可利用性進行初步判斷,記錄結果。
- Test
指定使用哪個Agent、StateModel,Publisher用什么方法發送數據,使用什么方法變異數據,日志文件路徑等。可以有多個Test,使用時通過peach命令行指定要運行的Test名稱,未指定默認運行名稱為”Default”的Test。如下圖:
Strategy(變異策略)包括:
- Random:默認會隨機選擇最大6個元素(可以通過參數MaxFieldsToMutate設置)利用隨機mutator(變異器)進行變異。
- Sequential:Peach會順序對每個元素使用其所有可用的Mutators進行變異。
- RandomDeterministic:Peach默認規則。這個規則對pit xml文件中元素根據Mutators
生成的Iterations鏈表做相對隨機(由鏈表中元素數目決定)的順序混淆,所以每個xml文件每次運行生成的測試用例多少、順序固定,這樣才能保證skipto的准確性。Peach3包括元素增、刪、改、交換,經驗值,逐位、雙字等Mutators,見下圖:
3.3 Fuzz Wav文件
- Wav文件格式
- Pit文件
參考文獻
www.peachFuzzer.com