林明亮,彭貴超
(國家計算機網絡應急技術處理協調中心海南分中心,海南 海口 570100)
無文件攻擊是內存層面的攻擊方式,設計之初就是為了規避傳統的已知檢測技術。這類攻擊最早發現是2001年的Code Red蠕蟲[1]。從2001年夏天到2017年這類攻擊開始流行,人們才找到直接的證據證明這類攻擊的存在。接近77%的成功入侵是基于無文件攻擊技術,這個成功率幾乎是已知的基于文件攻擊的10倍。
無文件攻擊使用的技術也叫做“Living off the land”(LotL),即不落地存活技術。這類攻擊最主要的特點就是沒有惡意代碼或者攻擊載荷作為一個文件被存儲在磁盤上。其次是這類攻擊使用的是安全的,預安裝的,操作系統已有的工具。這也是在攻擊的前后沒有任何惡意活動的痕跡被發現的原因。這種類型的攻擊使用系統工具,如Powershell,WMI[2]以及其他 Windows管理工具且通過修改注冊表鍵值的方式來實現對目標的長期控制,還有一些基于java的惡意代碼可以利用java的特性在內存中存活,實現無文件的webshell后門。
無文件攻擊方式主要可以分為四種類型:只在內存中運行的攻擊、無文件持久化攻擊、非可執行文件攻擊、利用系統自帶工具。在攻擊鏈的入侵環節一般通過利用漏洞獲取權限達到直接在內存中執行代碼的目標。常見的攻擊手法為發送一個帶有惡意代碼的 office文件[3]或者在其他機器的快捷方式文件中插入惡意代碼。這個環節可以存在多種無文件攻擊類型,包括:只在內存中運行的攻擊,如SMB永恒之藍漏洞;非可執行文件攻擊,如帶有惡意代碼的 office文件宏;利用系統自帶工具,如RDP弱口令等;當一臺設備被入侵后,一般會進入持久化環節,來保持攻擊者對這臺設備的權限,這個環節主要使用無文件持久化的攻擊,如在注冊表中寫入Jscript代碼、在計劃任務中創建執行惡意代碼的任務等方式;當獲取系統權限并加以鞏固后,攻擊者將執行攻擊載荷來達到特定目的,這個環節使用的攻擊類型包括:利用系統自帶工具,如net、sc、psexe等;只在內存中運行的攻擊,如Mirai DDoS;非可執行文件攻擊,如Powershell腳本。
這類攻擊主要是依靠漏洞或者系統的弱口令獲取系統權限,然后在內存中直接執行惡意代碼。這類攻擊的代表Code Red和SQL Slammer蠕蟲都是利用Windows系統服務的漏洞直接在內存中執行它們的攻擊載荷。WannaCry勒索軟件使用的永恒之藍漏洞和雙子星后門也是這類攻擊的一種。如果系統存在遠程命令執行漏洞,攻擊者首選都是直接在內存中執行惡意代碼而不讓文件在硬盤上落地。如果只是在內存中運行的話并不足以讓這些惡意代碼持久控制目標,只要重啟系統后,內存更新,目標就會失去控制。但是,有些惡意代碼并不在意是否可以持久控制目標。例如對于專門控制物聯網設備的 mirai僵尸病毒[4]來說,一個系統雖然重啟了,但是如果不能及時修復漏洞的話,攻擊者很容易就能再次獲取控制權。另一方面,對于特定的攻擊組織來說,目標核心服務器一般不會輕易重啟,而這段時間已經足夠他們找到想要的東西并清除痕跡了。
攻擊者在獲取權限后需要鞏固權限,讓控制持久化。在Windows系統上有多種方式可以讓攻擊者獲取持久化的控制權限且無需文件在硬盤上落地。下面主要介紹幾種比較主流的無文件持久化攻擊方式。
(1)Windows注冊表[5],最常用的無文件攻擊維持權限的方式就是將惡意代碼寫入 Windows注冊表中,2014年發現的惡意代碼Trojan.Poweliks就是基于注冊表的攻擊。后面出現的惡意代碼Trojan.Kotver和Trojan.Bedep也沿用這個攻擊方式。
通常,惡意代碼會將自身隱藏在注冊表的自啟動子鍵里,這樣在系統重啟后其就會被立即執行。在這個基礎上,一些惡意代碼還會將創建的自啟動子鍵命名為非ASCII字符。這樣可以防止普通的檢測工具顯示這個鍵值,從而起到混淆及規避檢測的作用。另外,惡意代碼還可以更改注冊表中該子鍵的訪問權限,使其難以被刪除。隱藏在注冊表中的惡意代碼內容還可以經過混淆放置在多個鍵中[6],這樣每次攻擊都有不同的特征。如圖1所示,攻擊代碼隱藏在注冊表的自啟動項中,并調用圖2中其他注冊表項的鍵值,全程沒有任何文件在硬盤中落地,且使用了編碼技術來規避安全軟件的檢測。

圖2 被調用的注冊表鍵值Fig.2 the key value to be called
注冊系統服務也可以利用類似的原理。一個攻擊者可以在注冊表中添加或者直接使用 sc.exe命令行工具來創建一個系統服務。如圖3創建系統服務命令:

圖3 創建惡意系統服務Fig.3 create malicious services
(2)WMI,WMI的數據加密存儲在文件夾%System%wbem epository里的多個文件中。攻擊者可以根據一個特定的事件創建一個filter,然后創建一個 consumer方法來在這些事件發生時執行惡意代碼。事件可以是一天中的某個時間,如Unix中的cron任務那樣。這種情況下,三個WMI類是必須的:filter類、consumer類以及一個FilterToConsumerBinding類將它們聯系起來。攻擊載荷一般為一個Powershell腳本以及將其存儲在注冊表中的腳本。這些攻擊載荷可能會全部存儲在WMI庫中。圖4為Cozyduke攻擊團隊使用的方式。

圖4 WMI啟動Powershell的consumer類Fig.4 WMI consumer that starts powershell
(3)計劃任務,計劃任務可以在特定時間在本地或遠程執行命令。例如,圖5計劃任務執行Powershell下載命令:

圖5 計劃任務執行Powershell下載惡意代碼Fig.5 schedule task using powershell download malware
(4)在關機時調用,盡管它不是完全的無文件攻擊,在關機時調用有時也會被攻擊者使用。Dridex惡意代碼的一些變種會創建一個自啟動注冊表項并將惡意代碼存放在硬盤中。當系統啟動時,這些惡意代碼會在內存中執行并將注冊表項及硬盤上的惡意代碼刪除。在某種意義上,這些惡意代碼只運行在內存中,因此也算是無文件攻擊的一種方式。這類攻擊監測關機指令,當關機指令發起后,它會在系統中創建新的注冊表項以及以新的名字存放在硬盤中,等待下一次重啟,這樣它可以最小化在硬盤中的暴露時間。
一個非可執行文件攻擊基本都會與一些腳本或合法工具相關聯,因此嚴格來說這種攻擊類型應該算是利用系統自帶工具的子類。這類攻擊大多數使用Powershell、WScript、CScript這些系統自帶的腳本框架來執行惡意代碼[7]。一般的office文檔或者PDF文檔會包含惡意腳本代碼,在打開這些文檔的時候會彈出是否啟用編輯等提示框。安全意識不高的用戶會忽略這些提示,導致惡意代碼執行。
Office文檔也并非需要宏才能執行腳本。惡意代碼Trojan.PPDropper是一個PPT形式的病毒,它可以通過用戶打開一個鏈接來執行惡意代碼。如圖6所示這個鏈接有三個要素:

圖6 office文檔執行惡意代碼三個要素Fig.6 office running malware within three elements
這些代碼解碼重組后,如圖7所示為Powershell攻擊命令:

圖7 重組后的Powershell命令Fig.7 rebuild powershell command
系統自帶的工具是經過安全校驗的工具,利用這些工具也可以實現攻擊者的一些攻擊目的。如 net user/add可以在系統上添加用戶,net localgroup administrators/add可以將添加用戶加入到管理員組中,query user可以用于查詢當前系統登錄的用戶情況,net view/domain可以查看當前用戶所在域情況,tasklist/svc可以查看當前執行的進程情況,以及前面提到過的rundll32.exe用于加載特定動態鏈接庫,sc.exe用于對系統的服務進行操作,schtasks對計劃任務進行操作等。所有的這些操作均可以利用系統自帶的工具來完成。
應對無文件攻擊,我們自身以及所在的部門應該建立事前預防、事中阻斷、事后響應的體系化防御機制,才能有效地防護網絡的安全,避免數據資產遭受不必要的損失。事前預防建議做好這些安全措施:如無必要,禁用 Powershell和WMI;安裝所有的Windows更新,尤其是安全更新;檢查已安裝的應用是否已更新至最新版本;定期檢測網絡中是否有非預期的大量數據流動,這可能是攻擊者正在竊取數據;定期更新瀏覽器;留意郵件中下載的附件;使用可以監測內存惡意代碼執行的安全工具等。事中阻斷針對無文件攻擊涉及攻擊鏈的三個環節,可以使用以下方式進行檢測阻斷[8]:因入侵環節大多使用漏洞利用或者使用釣魚郵件發送帶有惡意宏的 office文檔發起攻擊,漏洞利用防御可以有針對性地防御系統漏洞被攻擊者利用,而行為檢測則可以針對惡意宏腳本代碼執行的行為進行檢測阻斷;在持久化環節,WMI、系統注冊表、計劃任務等關鍵區域可能會留下攻擊的痕跡,實時監測這些區域的危險更新以及定期對這些區域進行掃描可以有效應對這個環節的攻擊;執行攻擊載荷環節惡意代碼已經在內存中運行,因此對系統重點程序的行為檢測尤為重要,如Powershell的一些危險操作。事后響應主要關注以下幾個方面:評估攻擊造成的損失,如泄露了多少數據;對攻擊路徑進行封堵,還原攻擊路徑并封堵;人員培訓,提高安全意識,避免再次發生類似事件等事后復盤提升整體防御能力。
本文介紹了無文件攻擊技術和防御。相比于傳統的基于惡意文件的攻擊,無文件的攻擊方式更加難以檢測,對現有的安全防護提出了一個較大的挑戰。本文從無文件攻擊背景介紹到這類攻擊方式的細節進行剖析,并提出建立事前預防、事中阻斷、事后響應的防御體系來抵御這類攻擊的思路。