[討論]漏洞分析的那些事兒(2012.08.05更新)

仙果發表於2011-11-02
題目:漏洞分析的那些事兒

作者:仙果

題記:忙了很長一段時間,也沒有出任何成果,感覺自己正處於一個瓶頸期,該有的基礎沒有打牢,而需要研究的東西太多,自己感興趣的方面也特別多,多而繁雜,
沒有主線是目前最好的寫照,所以很難得能夠靜下心來寫點東西。一直在提醒自己要把這篇文章寫出來,特別是最近每天都在提醒自己要寫要寫一定要寫,這是一種很煎熬的感覺,不得不寫這就是我現在的狀態。
也許這是作為一個文科生的悲哀,一定要把這個完成。
      本文會是一篇經驗和漏洞分析資源的整合,方便在漏洞分析方面沒有入門的同學和朋友。有問題大家一起討論,衷心希望在本版塊大家都能夠找到需要的知識和解答。
      文章會不定期更新,大家想知道什麼方面的知識也可以跟帖提出,我會盡量解答,其他的朋友也會給你解答的。

目錄:
一   漏洞分析方面的資源
二   漏洞分析的準備工作
0x1   樣本獲取
0x2   環境搭建
0x3   工具
三   漏洞分析的測試階段
四   漏洞的分析階段
五   其他方面的工作

一  漏洞分析方面的資源
     說到資源,看雪論壇本身就是一個很好的資源,很多志同道合的朋友在這裡討論學習,我的很多知識都是在這裡學習到的。遇到了不懂的地方,可以在這裡進行討論,總有一個人會回答你的問題,平時你也可以解答別人提出的問題,大家共同進步。
     一個很好的資源就是看雪安全文件庫,上面集中了很多人的心血都是非常精闢的文章,平時沒事了多去翻翻總是有心中一亮的感覺。
     看雪軟體安全文件庫(http://kssd.pediy.com)
     需要從書本上學習的話,有幾本書可以推薦下
     《0day安全:軟體漏洞分析技術》:連結是新版,比08年的第一版要豐富了很多,是國內首屈一指的全面講解漏洞分析各個方面的書。強烈推薦。
     《加密與解密(第三版) 》:書我已經不用再介紹,除了演算法和.net加密解密部分,基本翻完了的。
     其他的資源大家可以慢慢的蒐集,比較常用到的資源,可以用來做參考書的就以上這些了,如果能把以上關於漏洞的知識完全弄明白的話,你就會成為一個非常厲害的高手。
      說一些題外話,全當我在夢囈也可以。漏洞分析是一個很駁雜的學科(我把它看成一門學科),所以想要把漏洞分析做好,
需要掌握的知識有很多。彙編是基礎,雖不要求能用匯編寫出一個大型程式,但基本彙編要領和體系結構還是需要熟練掌握。C/C++語言基本,
懂得C/C++的程式設計,對漏洞分析方面的幫助會特別大,很多程式都是C/C++編寫而成,C/C++類,虛擬函式,指標/引用 和資料結構都是容易觸發漏洞的脆弱點,
對於理解程式處理流程進而逆向出高階程式碼有很大的幫助,自己最最欠缺的是這方面的知識和技能。
其他物件導向的高階程式語言/指令碼,其中包括Perl,Python等等,對於寫POC測試程式碼會非常有幫助。
      上面提到做漏洞分析最好具備的基礎,其他方面比如作業系統架構,記憶體分配釋放,程式的相關知識,都是需要學習的。如果分析flash的漏洞就需要對ActionScript 3程式碼進行學習,
瞭解AVM2虛擬機器的相關架構,JAVA方面的漏洞也是如此。更不用說現在比較流行的移動平臺,需要對ARM彙編學習,移動平臺下的除錯也需要學習。
      需要學習的東西很多,而一個人的精力有限,在這裡也向大家請教如何更有效的學習。我沒有達到上述的要求,這是自己的目標。即使你跟我一樣沒有任何基礎也不要灰心,只要努力就能進入漏洞分析的大門。
自己下階段的目標是學習C/C++的類和虛擬函式,到時候也會在這裡和大家進行討論。

二   漏洞分析的準備工作
0x1   樣本獲取
       若要分析一個漏洞,首先就要有漏洞樣本,而樣本從何而來,總體來說有以下幾個渠道:
0x1.1
       http://www.exploit-db.com:非常出名的漏洞公佈站點,新的漏洞基本都可以在這裡找到,漏洞型別也比較豐富,不光有二進位制漏洞,還有其他型別如SQL隱碼攻擊。
經常有些文章很不錯英語比較好的同學可以關注下。國內類似的站點有烏雲,Sebug.net,還有就是一些大牛的部落格了,經常會更新一些漏洞資訊。
0x1.2
        Metasploit:這個自不必多說,免費版是非常好的漏洞測試和利用工具,我們可以拿來提取和分析樣本,更新也是非常的快。ShellCode也可以從Metasploit提取而不用自己寫。
Exploit-db網站上的很多樣本示例都是Metasploit的Ruby程式碼。
0x1.3
        朋友交流:這個是很私下的事情,比如某A大牛發現了一個軟體的BUG,但是無法確定能否利用,於是就發給了B大牛,共同研究討論。這種渠道很難得,如果你有這麼樣的朋友,
請珍惜吧。呵呵。
0x1.4
        地下交易:當無法從正常渠道拿到漏洞樣本的時候,地下交易就有了市場,恐怕也是國內網路安全的一個趨勢,並不對這種方式做任何評論。從中確實能夠拿到漏洞樣本來分析,過一段時間以後地下交易的漏洞樣本就會公開,可供拿來分析了。
還有些就是隻限於某個圈子,圈子外的人是拿不到樣本的,也就無從分析。
0x1.5
     其他:這裡的其他主要包括挖漏洞和某些抓漏洞。
挖漏洞稱為FUZZING,有很多方法,最基本的就是二進位制FUZZING,迴圈位元組替換,很笨拙但是卻很有效,理論上可以找到所有的漏洞,只要你構造的FUZZ樣本能覆蓋到所有的路徑。當你FUZZING時發現一個崩潰的樣本就可以進行分析,
這時你就找到了軟體的某個脆弱點,即使不能成功利用,也是非常有成就感的一個事情,證明這時軟體編寫者未能完全考慮到的情況被你發現。
抓漏洞是一個技術活,搭建好蜜罐就可以開始抓了,據說很多大公司都有自己的蜘蛛爬蟲在網路上不間斷的分析網站連結,一旦有新的漏洞在網路上利用傳開,很快就可以被蜘蛛爬蟲發現並記錄下來。
據說很多0Day漏洞就是這麼被發現的。透過蜘蛛爬蟲得到漏洞樣本後就可以進行分析了,全是體力活。

0x2   環境搭建
      在測試環境搭建方面,推薦大家使用虛擬機器,包括VMware Workstation ,Virtual BOX ,Virtual PC 等虛擬化工具。其中最出名的當屬VMware Workstation,效能和易用性都不錯,當開多個虛擬系統的時候佔用的主機記憶體會很高,所以主機的效能越高越好,記憶體越大越好。
    特別需要注意的是某些漏洞在主機與虛擬機器中的情況並不一致,這種情況特別是在RPC相關的漏洞中特別明顯,如果想要做到穩定利用,最好做到主機和虛擬機器都進行同樣的測試並以主機為準。
作業系統安裝在虛擬機器中,接下來就應該準備測試的軟體環境了。
   進行測試的軟體往往釋出有多個版本,因此需要明確測試軟體的版本。比如Adobe Reader 從版本6至最新的10.1那麼多,在確定漏洞所能針對的版本以後,就需要選擇某個特定版本進行安裝測試,例如選擇Adobe Reader 9.0。某個漏洞只能針對Adobe Reader 8.2,那也只能選擇對應版本。
若不知道漏洞具體能夠針對的軟體版本,則使用二分法進行漏洞確認。最好的情況是檢視十六進位制資料就能夠確認漏洞,這需要長時間的經驗積累過程。
    某些特殊的軟體需要組合起來才能觸發漏洞,因此在漏洞分析之前要確定漏洞成功觸發所需要的軟體環境,並依此搭建。

0x3   工具
使用工具的目的是為了能夠更容易更快速的分析漏洞的成因和觸發漏洞的詳細過程。工具的選擇也是因人而異,大牛可以透過IDA的靜態程式碼就可以找到漏洞觸發的本質所在,我等小菜就必須透過動態除錯+靜態分析+查詢資料來分析漏洞。
具體來說有以下幾個工具。
IDA:相信每個對反彙編瞭解的朋友都知道這個工具,據說最新版本為6.2但下載不到,能下載的版本為6.1介面很友好,掌握好IDA這個工具還是要花費一番力氣的。
推薦一本書《IDA Pro 權威指南》,可以買本實體書,隨時翻看。

Windbg:微軟自己的動態除錯工具,足夠強大,具體使用方法網上已經有很多教程,大家可以自行翻看。
OD:破解和分析漏洞的必備,很多方面都用得到的。很多實用的指令碼,非常強大。因為我分析漏洞用的是Windbg,OD使用的較少,很多用法都忘記的差不多了,基本的操作其實與Windbg一樣的,反之也是成立的,只要學會其中一種即可,2中工具都能夠精通當然最好。
SoftIce:使用此工具的朋友據說已經不錯,但確實非常強大,偶爾還是會用到,容易引起藍色畫面和當機。
Immunity Debugger:新興的動態除錯工具,介面與OD類似。操作也類似,據說是購買了OD的原始碼,強大之處是可以編寫Python指令碼輔助分析,網上也有很多現成的指令碼,在漏洞利用方面比較好,可以很容易編寫ROP程式碼和確認漏洞可否利用。
其他工具:還有很多工具沒有介紹到,需要具體漏洞具體分析,如RPC漏洞就需要網路資料嗅探工具,輔助分析發包。包括Perl和ruby都是可能用到的工具。

三   漏洞分析的測試階段
        上述的一些環境和工具準備好以後,現在就可以開始進行漏洞測試,你可能會有這樣的疑問:為什麼不直接到漏洞分析,偏偏還要走到這一步,不是多此一舉嗎?答案是顯而易見的,漏洞測試也是非常的關鍵,這裡我進行解釋一下,首先當拿到一個樣本時,你不能確定它是否就是漏洞,
如果是漏洞,利用形式是什麼?有無便捷的漏洞分析方法?如果不是漏洞,是否是軟體安裝沒有對應漏洞可以作用的版本等等一系列問題。進行漏洞測試時最好把上述的問題都能解決掉,這樣漏洞觸發原理分析時才會更有針對性也會節省很多的精力在判斷漏洞與否方面。以下我簡述一些需要
特別注意的情況,當然也比較片面,大家可以舉一反三,不足之處見諒。
0x1 需要注意的情況
        主要有三個方面:軟體配置、網路狀態、作業系統準備
0x1.1        軟體配置
        之所以提出這個問題是因為某些軟體在預設安裝的狀態下是不會觸發某些漏洞,配置上出現了問題才導致漏洞的產生;有些軟體預設狀態下存在漏洞,但修改了預設配置,有些漏洞就不會觸發,這樣的情況就會導致漏洞測試的不完整。下面我會舉例子來說明這個問題。
例如CVE-2009-4324編號Adobe Reader 的漏洞,原型如下:
util.printd("1.345678901.345678901.3456 : 1.31.34", new Date());
util.printd("1.345678901.345678901.3456 : 1.31.34", new Date());
try {this.media.newPlayer(null);} catch(e) {}
util.printd("1.345678901.345678901.3456 : 1.31.34", new Date());

此漏洞的觸發需要Adobe Reader 預設安裝並且支援Javascript執行,選擇路徑如下:編輯-首選項-Javasript-啟用Acrobat Javascript。如果把此項取消掉,這個Adobe Reader 的漏洞便不會觸發,此時測試也就無從談起。
第二個拿IE來做例子,ActiveX是IE的一類外掛,這個是大家都知道的一個常識,如果你只是安裝IE而不安裝對應的ActiveX,進行測試的時候IE只會彈出JavaScirpt錯誤警告但不會崩潰或者漏洞得意成功執行。總之一句話,當你拿到樣本時需要特別注意留意一些樣本中
洩露的資訊,然後檢視軟體配置,是否符合漏洞觸發的條件。
        同時一款軟體可以有很多個版本,IE此時有IE6、IE7、IE8、IE9、IE10等,Adobe Reader大版本有6、7、8、9、10等,Adobe Flash 的版本就多到可以不一一列舉了。當你不能確定漏洞樣本所能針對的軟體版本時,就需要儘可能的多測試一些版本,之前提到過過的二分法是一個不錯的選擇。
0x1.2        網路狀態
        這點呢主要是說明網路狀態對漏洞測試的影響,特別是RPC類的遠端漏洞,對網路的要求比較苛刻。比如說MS08-067 Windows 遠端RPC漏洞,很出名的一個洞,現在某些木馬中也會嵌入這個漏洞在內網中進行滲透,漏洞觸發測試需要關閉Windows 自身防火牆,開啟IPS$共享,
139和445埠也要開啟(Windows XP),三個條件缺一不可。
0x1.3 作業系統準備
        此種情況其實主要針對Unix和Linux系統,其也有很多個核心版本,在測試linux核心有關的漏洞時,需要特別注意漏洞針對的核心版本。linux漏洞對核心版本的要求特別高,而Windows 包括其上的應用程式的漏洞,對        Windwos 系統版本的要求就沒有那麼嚴格,基本上可以搭建一個基本的漏洞測試模型出來,linux則不行,這是需要特別注意的地方。

相關文章