發展
一直以來,檔案是惡意代碼存在的最常見形式,安全軟體也通常把磁盤上的檔案作為重點檢測對象。然而,一旦惡意代碼以無檔案形式存儲在系統中,便難以對其追蹤。早在十幾年前,紅色代碼、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系統資料庫。攻防對抗,永無止境。
====================================分割線================================
本文轉自d1net(轉載)