2016-08-01
發(fā)展
一直以來,文件是惡意代碼存在的最常見形式,安全軟件也通常把磁盤上的文件作為重點檢測對象。然而,一旦惡意代碼以無文件形式存儲在系統(tǒng)中,便難以對其追蹤。
早在十幾年前,紅色代碼、Slammer蠕蟲就利用緩沖區(qū)溢出進行攻擊,通過網(wǎng)絡(luò)傳播,完全存在于內(nèi)存之中,而不以文件作為載體。不過,這種基于內(nèi)存的無文件(Fileless)攻擊一旦進程或系統(tǒng)關(guān)閉,也就不復存在。
為了實現(xiàn)攻擊持久化,攻擊者們找到新的突破口——將惡意軟件實體隱藏在注冊表的某個鍵值里,并通過各種加密手段,來逃脫安全軟件的查殺。最早使用該技術(shù)的是2014年GData公司發(fā)現(xiàn)的點擊欺詐軟件Poweliks。隨后,多款惡意程序甚至APT組織使用這種無文件持久化攻擊技術(shù)。
攻擊流程
1、初始樣本執(zhí)行
當初始樣本通過釣魚郵件、漏洞或其他方式感染系統(tǒng)后,就會在Windows注冊表配置單元中以加密形式寫入完整的負載,為無實體惡意代碼執(zhí)行做準備。
2、無實體惡意代碼注冊表執(zhí)行
通常,惡意代碼被創(chuàng)建為幾個注冊表子鍵,每個鍵值中會分別存儲腳本代碼或者二進制數(shù)據(jù),自啟動后,通過層層解密,最終執(zhí)行核心代碼。
a)第一階段鍵值A(chǔ)uto-Start
系統(tǒng)啟動后會自動讀取某些特殊的鍵值,這就為惡意代碼自啟動創(chuàng)造了條件。一般通過在rundll32.exe里運行RunHTMLApplication來執(zhí)行一段JS腳本。引申來看,任何能加載MSHTML模塊都是潛在的利用對象。詳細了解該原理可以參考鏈接[1]
b)第二階段鍵值Loader
第一階段的代碼會用來解密并執(zhí)行第二階段的數(shù)據(jù)。在調(diào)研的幾個案例中,第二階段的數(shù)據(jù)通常會是一段加密腳本,例如PowerShell、VBScript等,這里主要是為了執(zhí)行第三階段的數(shù)據(jù)。
c)第三階段鍵值Binary
第三階段的鍵值通常用來存儲Payloads。通過階段二的腳本命令來將其注入到系統(tǒng)合法進程之中,實現(xiàn)無進程ShellCode執(zhí)行。
當然,并不是所有的無文件惡意軟件都是按照三個階段執(zhí)行,像Poweliks則是將二、三階段的數(shù)據(jù)存放在一個子鍵中,通過PowerShell腳本解密并執(zhí)行對應模塊的數(shù)據(jù),其基本原理和目的是一致的。一旦惡意代碼被注入內(nèi)存之中,就會按照攻擊者最初的設(shè)計來實施惡意行為,比如連接控制服務(wù)器、收集主機信息、接受命令執(zhí)行其他操作等。
代碼隱藏
存儲在注冊表中的腳本和數(shù)據(jù)經(jīng)過了精心的加密隱藏,以達到讓安全軟件和用戶不可見的目的。
a)撤銷訪問權(quán)限:在訪問控制列表(ACL)中撤銷用戶對注冊表訪問權(quán)限。
b)添加無效字符:利用Windows注冊表編輯器無法顯示包含無效字符的注冊表鍵,在注冊表鍵值中寫入一個或多個無效字符,用戶訪問時會顯示錯誤消息。
結(jié)束語
基于注冊表的無文件攻擊利用操作系統(tǒng)特性來達到數(shù)據(jù)隱藏的意圖,并將惡意程序運行在合法進程之中,這種方式能讓基于文件監(jiān)測的查殺手段失效,為此安全廠商們也積極做出響應,然而隨著技術(shù)的進一步發(fā)展,惡意代碼的隱藏方式很可能并不只局限于Windows注冊表。攻防對抗,永無止境。