云端模糊測(cè)試挖洞實(shí)例
一、簡(jiǎn)介
Fuzzing(模糊測(cè)試)是一種用于識(shí)別軟件bug以及漏洞的方法。就目前的發(fā)展趨勢(shì)來(lái)說(shuō)Fuzzing正向著云端邁進(jìn),相較于傳統(tǒng)Fuzzing方式,云端Fuzzing使得模糊測(cè)試速度加快也更加靈活。在本教程中,我們將與你一同走完云端模糊測(cè)試的全過(guò)程(即部署,F(xiàn)uzzing以及使用softScheck Cloud Fuzzing Framework (sCFF)框架檢索結(jié)果)。我們將以運(yùn)行在Ubuntu 16.04上的tcpdump4.9版本為例進(jìn)行演示,讀者可下載sCFF框架,和我們一同玩耍。
二、背景知識(shí)
第一章節(jié)將講解在使用過(guò)程中會(huì)遇到的一些基礎(chǔ)問(wèn)題。當(dāng)然,如果你對(duì)云端模糊測(cè)試有一定經(jīng)驗(yàn)或者對(duì)這些基礎(chǔ)問(wèn)題足夠了解的情況下可以跳過(guò)本章節(jié)。此外,我們強(qiáng)烈建議從上到下依次閱讀本文,子章節(jié)可能有些簡(jiǎn)短,但是都會(huì)提供大家進(jìn)一步了解詳情的傳送門。
1. Fuzzing
Fuzzing是一項(xiàng)用于軟件強(qiáng)度測(cè)試的技術(shù)。其核心思想是自動(dòng)或半自動(dòng)的生成隨機(jī)數(shù)據(jù)輸入到一個(gè)程序中,并監(jiān)控目標(biāo)程序異常,如崩潰,斷言(assertion)失敗,以發(fā)現(xiàn)可能的程序錯(cuò)誤,比如內(nèi)存泄漏。
這些異常大多數(shù)都是軟件漏洞,經(jīng)驗(yàn)豐富的攻擊者完全可以進(jìn)行利用。由于其自動(dòng)化特性以及可以應(yīng)用于所有軟件中,F(xiàn)uzzing常作為安全專家的基本裝備存在。盡管知曉源代碼可以加快模糊測(cè)試的速度,但是并非必須的。數(shù)十年來(lái),模糊測(cè)試工具以及目標(biāo)應(yīng)用都是在本地計(jì)算機(jī)上運(yùn)行。然而隨著各種云計(jì)算服務(wù)商興起,似乎在云端運(yùn)行模糊測(cè)試工具也是個(gè)不錯(cuò)的選擇。事實(shí)上像微軟,谷歌等大型公司已經(jīng)實(shí)現(xiàn)在云端進(jìn)行模糊測(cè)試了。在云端模糊測(cè)試方面,微軟還要領(lǐng)先一步,其Springfield項(xiàng)目甚至還向開發(fā)者提供云端模糊測(cè)試服務(wù)。
相對(duì)于傳統(tǒng)模糊測(cè)試,云端模糊測(cè)試有哪些優(yōu)點(diǎn)呢?首先你不需要額外購(gòu)買計(jì)算機(jī),省錢,節(jié)省空間,不需要花過(guò)多時(shí)間去設(shè)置環(huán)境等等,云端模糊測(cè)試的主要優(yōu)勢(shì)還是它所具有的靈活性,同一時(shí)間程序可以在多個(gè)操作系統(tǒng)上進(jìn)行測(cè)試,檢測(cè)是否會(huì)出現(xiàn)不同表現(xiàn)行為。如果一個(gè)項(xiàng)目對(duì)數(shù)據(jù)吞吐量要求較高,就可以利用RAID0陣列中的SSD。當(dāng)一個(gè)應(yīng)用程序需要大量的RAM,也可以選擇一個(gè)相應(yīng)的實(shí)例。如果需要測(cè)試一個(gè)web應(yīng)用或者是網(wǎng)絡(luò)協(xié)議,這里有許多低階終端,所以相對(duì)來(lái)說(shuō)完成任務(wù)的花費(fèi)就很便宜。
當(dāng)然這里也是存在缺點(diǎn)的。首先你得相信為你提供云服務(wù)的商家,因?yàn)樗袛?shù)據(jù)都是在云端運(yùn)行,而非你個(gè)人的計(jì)算機(jī)。此外,你多用幾個(gè)月所需要支付的價(jià)格差不多也夠你自己再買一臺(tái)計(jì)算機(jī)的價(jià)格了。
2. Amazon AWS
Amazon Web Services是指Amazon提供的各類云端服務(wù)合集,目前AWS是全球最大的一家提供云計(jì)算服務(wù)的公司。AWS中有一個(gè)名為Elastic Compute Cloud (EC2)的組件,EC2允許用戶自己配置虛擬機(jī)作為服務(wù)器使用。在云端創(chuàng)建的這個(gè)虛擬服務(wù)器實(shí)例,在創(chuàng)建時(shí)就可以選擇操作系統(tǒng),預(yù)安裝軟件,資源分配等各種設(shè)置。至于操作系統(tǒng),用戶可以依靠Amazon龐大的鏡像庫(kù)AMI進(jìn)行選擇,我們可以從Amazon提供的100余種不同的機(jī)器配置中自由選擇。用戶只需要按每小時(shí)支付費(fèi)用,當(dāng)然配置越高收費(fèi)越貴咯!
3. softScheck Cloud Fuzzer Framework
softScheck為了讓模糊測(cè)試過(guò)程更加輕松,使用Python 3開發(fā)了softScheck Cloud Fuzzer Framework(sCFF),該框架使用Boto 3 API與AWS進(jìn)行通信。sCFF遵循Unix范式將不同的子程序分開:一個(gè)程序?qū)W⒁患隆?/p>
4. American fuzzy lop
American fuzzy lop (afl)是sCFF框架中的一個(gè)模糊測(cè)試工具。以其速度,可靠性,復(fù)古風(fēng)格的UI設(shè)計(jì)以及赫赫戰(zhàn)功而聞名。如果可以獲得測(cè)試軟件的源代碼,不僅能生成更加客觀的模糊測(cè)試結(jié)果,還能提高測(cè)試覆蓋率。編者注:當(dāng)前大多數(shù)遠(yuǎn)程代碼執(zhí)行和特權(quán)提升等比較嚴(yán)重的漏洞基本是使用Fuzzing技術(shù)挖掘的,然而Fuzzing技術(shù)仍然存在著覆蓋率低的缺陷。而許多的代碼漏洞需要更大的路徑覆蓋率才能觸發(fā),而不是通過(guò)純粹的隨機(jī)嘗試。
5. tcpdump
Tcpdump是一款著名的網(wǎng)絡(luò)數(shù)據(jù)包分析工具。它能抓取,顯示,以pcap文件格式保存網(wǎng)絡(luò)中的數(shù)據(jù)包,之后這些數(shù)據(jù)將以更友好的方式提供給使用者。不同于老大哥Wireshark,Tcpdump是一個(gè)非交互式命令行程序,對(duì)于模糊測(cè)試來(lái)說(shuō)更加方便。
6. GNU Debugger
GNU DeBugger (GDB),可以對(duì)軟件運(yùn)行狀態(tài)進(jìn)行單步分析,更精確的找出導(dǎo)致程序崩潰的原因。如果分析的是包含調(diào)試標(biāo)志的二進(jìn)制代碼,你可以知道當(dāng)前程序正在運(yùn)行代碼的那一行,對(duì)于修復(fù)bug來(lái)說(shuō)更加輕松。甚至還可以在運(yùn)行時(shí)修改某些變量的值,用以快速觀察變量值改變是否能修復(fù)bug。
三、使用sCFF來(lái)對(duì)tcpdump進(jìn)行模糊測(cè)試
介紹完背景知識(shí)后,接著繼續(xù)我們文首提到的tcpdump 4.9漏洞發(fā)現(xiàn)之旅。這一章分為兩個(gè)部分,首先就是章節(jié)列表,這是需要你在繼續(xù)本教程之前完成的任務(wù)。由于文章篇幅的限制,這些內(nèi)容并沒(méi)有寫入文章,還好網(wǎng)上已經(jīng)有大量的文章教程可以使用。其次涵蓋了預(yù)模糊測(cè)試階段,主要講解了在真是環(huán)境下進(jìn)行模糊測(cè)試之前應(yīng)該做的事情,最后即是發(fā)現(xiàn)漏洞后你該怎么做。
1. 前期工作
如果你想要以云端模糊測(cè)試的方法找出tcpdump中存在的漏洞,你首先需要完成一些本教程沒(méi)涉及到的步驟,基本上這些操作可以歸結(jié)為AWS以及sCFF框架的配置。如果你想以傳統(tǒng)的本地模糊測(cè)試方法尋找漏洞,或者僅僅只是了解一下云端模糊測(cè)試,你可以跳過(guò)這些步驟。
必選項(xiàng):
- 創(chuàng)建一個(gè)AWS賬號(hào)
- 導(dǎo)出AWS密鑰ID和密鑰
- .aws/config中應(yīng)該包含你的域信息,.aws/credentials中應(yīng)該包含密鑰ID和訪問(wèn)密鑰
- 創(chuàng)建SSH安全組,以允許實(shí)例與外部端口22之間進(jìn)行通信
- 創(chuàng)建并下載密鑰對(duì)(SSH通信需要使用到這些密鑰)
- 下載并安裝sCFF;
可選項(xiàng):
- 為了進(jìn)行模糊測(cè)試, 需要安裝AFL的語(yǔ)言環(huán)境
- 確保afl-collect以及GDB + exploitable plugin已安裝
2. 預(yù)模糊測(cè)試階段
前期工作完成之后,接著便下載tcpdump 4.9版本的源代碼。你也可以下載最新的git版本,雖然本文作為案例的漏洞在新版本中已進(jìn)行修復(fù),但誰(shuí)能保證不會(huì)有其他驚喜呢?在下載源代碼之后,使用afl-gcc編譯對(duì)于之后的模糊測(cè)試是有幫助的(CC=afl-gcc ./configure && make)
編譯成功之后,運(yùn)行scff-mkconfig指令創(chuàng)建一個(gè)sCFF項(xiàng)目文件。請(qǐng)確保將target設(shè)置為tcpdump,參數(shù)設(shè)置為–e –r @@。其中-e和-r都是tcpdump的參數(shù),-e表示打印擴(kuò)展頭,-r表示讀取文件。這兩個(gè)標(biāo)志在之后會(huì)被afl每次生成的模糊測(cè)試文件替換。記住,如果你是是第一次注冊(cè)AWS t2機(jī)器,只要運(yùn)行時(shí)低于750小時(shí)都可以免費(fèi)使用。所以你可能會(huì)堅(jiān)持使用t2機(jī)器進(jìn)行模糊測(cè)試。為了更快的得到測(cè)試結(jié)果,推薦大家使用一個(gè)模版,使用了一個(gè)170btyes的pcap文件包含ipv4通信數(shù)據(jù)。作為借鑒,以下為我們通過(guò)scff-mkconfig命令創(chuàng)建的配置文件:
- [INSTANCES]
- amiami = ami-0963b466
- gid = tcpdump49
- instancetype = t2.micro
- name = auto
- numberofmachines = 4
- platform = linux
- [FUZZING]
- dependencies = none
- fuzzer = afl
- fuzzdir = fuzzing
- inputdir = fuzzing/input
- outputdir = fuzzing/output
- template = ipv4.pcap
- target = tcpdump
- args = -e -r @@
如今可以通過(guò)scff-create-instances命令來(lái)創(chuàng)建EC2實(shí)例,你可以使用密鑰對(duì)通過(guò)SSH進(jìn)行通信。
3. 模糊測(cè)試階段
接下來(lái),我們可以通過(guò)scff-ctrl . bootstrap命令對(duì)將用于模糊測(cè)試的機(jī)器進(jìn)行設(shè)置。一旦設(shè)置完成,正式的模糊測(cè)試便開始。sCFF提供了單模Fuzzing和分布式Fuzzing。在單模Fuzzing下,每個(gè)實(shí)例都會(huì)單獨(dú)運(yùn)行模糊測(cè)試工具;分布式Fuzzing,雖然同樣每個(gè)實(shí)例運(yùn)行一個(gè)模糊測(cè)試工具,但模糊測(cè)試數(shù)據(jù)會(huì)在實(shí)例間共享,這樣可以提升測(cè)試速度。如果你擁有兩個(gè)以上的實(shí)例,我們推薦使用分布式Fuzzing模式,以scff-ctrl . distributed指令啟動(dòng)分布式模式。如果想要了解模糊測(cè)試的狀態(tài),我們可以通過(guò)瀏覽器進(jìn)行查看。
你可以使用scff-ctrl . grab-findings命令隨時(shí)下載導(dǎo)致這些崩潰的文件。
4. 測(cè)試完成后
運(yùn)行scff-exploitcheck命令可以對(duì)這些崩潰文件進(jìn)行分析,誤判和重復(fù)出現(xiàn)的崩潰信息將會(huì)被過(guò)濾,最后剩下的信息將會(huì)用于漏洞的檢測(cè)和利用。
如果信息中有紅色EXPLOITABLE標(biāo)簽,那么這里存在漏洞的可能性就非常高了。再用gdb對(duì)所發(fā)現(xiàn)的內(nèi)容進(jìn)行檢測(cè)。如下圖,tcpdump 4.9的文件printsl.c中存在一個(gè)可利用的漏洞。
經(jīng)過(guò)進(jìn)一步的調(diào)試,我們可以得知dir為255,并且dir也是lastlen中的指針(定義為lastlen[2][255]),這里存在參數(shù)越界,進(jìn)而導(dǎo)致程序崩潰。
為了修復(fù)這個(gè)錯(cuò)誤,我們要么調(diào)整dir的值,要么檢查dir的值是否在0和2之間。在dir = p[DIR_SLX]后面設(shè)置一個(gè)斷點(diǎn),然后在gdb中修改該值(例如0,p=0)
再對(duì)源代碼進(jìn)行編譯,之后檢查程序是否還會(huì)崩潰。
四、總結(jié)
由于該漏洞需要用戶使用-e參數(shù)來(lái)打開pcap文件才可以完成攻擊,危害并不是特別嚴(yán)重。
當(dāng)我將該漏洞報(bào)告給tcpdump安全團(tuán)隊(duì),他們的響應(yīng)速度的確稱贊,該漏洞已在4.10版本中得到修復(fù)。得益于云端模糊測(cè)試以及優(yōu)秀的工具包,整個(gè)測(cè)試過(guò)程大約花費(fèi)五個(gè)小時(shí),其中包括識(shí)別以及修復(fù)漏洞。
- Downloading and compiling tcpdump: 10 minutes
- Pre Fuzzing Phase + template generation: 10 minutes
- Fuzzing Phase: 110 minutes
- Post Fuzzing Phase: 60 minutes
- Patch writing and retesting: 90 minutes
- -----------------------------------------------------------
- Total: 300 minutes