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