林明亮,彭貴超
(國(guó)家計(jì)算機(jī)網(wǎng)絡(luò)應(yīng)急技術(shù)處理協(xié)調(diào)中心海南分中心,海南 ???570100)
無文件攻擊是內(nèi)存層面的攻擊方式,設(shè)計(jì)之初就是為了規(guī)避傳統(tǒng)的已知檢測(cè)技術(shù)。這類攻擊最早發(fā)現(xiàn)是2001年的Code Red蠕蟲[1]。從2001年夏天到2017年這類攻擊開始流行,人們才找到直接的證據(jù)證明這類攻擊的存在。接近77%的成功入侵是基于無文件攻擊技術(shù),這個(gè)成功率幾乎是已知的基于文件攻擊的10倍。
無文件攻擊使用的技術(shù)也叫做“Living off the land”(LotL),即不落地存活技術(shù)。這類攻擊最主要的特點(diǎn)就是沒有惡意代碼或者攻擊載荷作為一個(gè)文件被存儲(chǔ)在磁盤上。其次是這類攻擊使用的是安全的,預(yù)安裝的,操作系統(tǒng)已有的工具。這也是在攻擊的前后沒有任何惡意活動(dòng)的痕跡被發(fā)現(xiàn)的原因。這種類型的攻擊使用系統(tǒng)工具,如Powershell,WMI[2]以及其他 Windows管理工具且通過修改注冊(cè)表鍵值的方式來實(shí)現(xiàn)對(duì)目標(biāo)的長(zhǎng)期控制,還有一些基于java的惡意代碼可以利用java的特性在內(nèi)存中存活,實(shí)現(xiàn)無文件的webshell后門。
無文件攻擊方式主要可以分為四種類型:只在內(nèi)存中運(yùn)行的攻擊、無文件持久化攻擊、非可執(zhí)行文件攻擊、利用系統(tǒng)自帶工具。在攻擊鏈的入侵環(huán)節(jié)一般通過利用漏洞獲取權(quán)限達(dá)到直接在內(nèi)存中執(zhí)行代碼的目標(biāo)。常見的攻擊手法為發(fā)送一個(gè)帶有惡意代碼的 office文件[3]或者在其他機(jī)器的快捷方式文件中插入惡意代碼。這個(gè)環(huán)節(jié)可以存在多種無文件攻擊類型,包括:只在內(nèi)存中運(yùn)行的攻擊,如SMB永恒之藍(lán)漏洞;非可執(zhí)行文件攻擊,如帶有惡意代碼的 office文件宏;利用系統(tǒng)自帶工具,如RDP弱口令等;當(dāng)一臺(tái)設(shè)備被入侵后,一般會(huì)進(jìn)入持久化環(huán)節(jié),來保持攻擊者對(duì)這臺(tái)設(shè)備的權(quán)限,這個(gè)環(huán)節(jié)主要使用無文件持久化的攻擊,如在注冊(cè)表中寫入Jscript代碼、在計(jì)劃任務(wù)中創(chuàng)建執(zhí)行惡意代碼的任務(wù)等方式;當(dāng)獲取系統(tǒng)權(quán)限并加以鞏固后,攻擊者將執(zhí)行攻擊載荷來達(dá)到特定目的,這個(gè)環(huán)節(jié)使用的攻擊類型包括:利用系統(tǒng)自帶工具,如net、sc、psexe等;只在內(nèi)存中運(yùn)行的攻擊,如Mirai DDoS;非可執(zhí)行文件攻擊,如Powershell腳本。
這類攻擊主要是依靠漏洞或者系統(tǒng)的弱口令獲取系統(tǒng)權(quán)限,然后在內(nèi)存中直接執(zhí)行惡意代碼。這類攻擊的代表Code Red和SQL Slammer蠕蟲都是利用Windows系統(tǒng)服務(wù)的漏洞直接在內(nèi)存中執(zhí)行它們的攻擊載荷。WannaCry勒索軟件使用的永恒之藍(lán)漏洞和雙子星后門也是這類攻擊的一種。如果系統(tǒng)存在遠(yuǎn)程命令執(zhí)行漏洞,攻擊者首選都是直接在內(nèi)存中執(zhí)行惡意代碼而不讓文件在硬盤上落地。如果只是在內(nèi)存中運(yùn)行的話并不足以讓這些惡意代碼持久控制目標(biāo),只要重啟系統(tǒng)后,內(nèi)存更新,目標(biāo)就會(huì)失去控制。但是,有些惡意代碼并不在意是否可以持久控制目標(biāo)。例如對(duì)于專門控制物聯(lián)網(wǎng)設(shè)備的 mirai僵尸病毒[4]來說,一個(gè)系統(tǒng)雖然重啟了,但是如果不能及時(shí)修復(fù)漏洞的話,攻擊者很容易就能再次獲取控制權(quán)。另一方面,對(duì)于特定的攻擊組織來說,目標(biāo)核心服務(wù)器一般不會(huì)輕易重啟,而這段時(shí)間已經(jīng)足夠他們找到想要的東西并清除痕跡了。
攻擊者在獲取權(quán)限后需要鞏固權(quán)限,讓控制持久化。在Windows系統(tǒng)上有多種方式可以讓攻擊者獲取持久化的控制權(quán)限且無需文件在硬盤上落地。下面主要介紹幾種比較主流的無文件持久化攻擊方式。
(1)Windows注冊(cè)表[5],最常用的無文件攻擊維持權(quán)限的方式就是將惡意代碼寫入 Windows注冊(cè)表中,2014年發(fā)現(xiàn)的惡意代碼Trojan.Poweliks就是基于注冊(cè)表的攻擊。后面出現(xiàn)的惡意代碼Trojan.Kotver和Trojan.Bedep也沿用這個(gè)攻擊方式。
通常,惡意代碼會(huì)將自身隱藏在注冊(cè)表的自啟動(dòng)子鍵里,這樣在系統(tǒng)重啟后其就會(huì)被立即執(zhí)行。在這個(gè)基礎(chǔ)上,一些惡意代碼還會(huì)將創(chuàng)建的自啟動(dòng)子鍵命名為非ASCII字符。這樣可以防止普通的檢測(cè)工具顯示這個(gè)鍵值,從而起到混淆及規(guī)避檢測(cè)的作用。另外,惡意代碼還可以更改注冊(cè)表中該子鍵的訪問權(quán)限,使其難以被刪除。隱藏在注冊(cè)表中的惡意代碼內(nèi)容還可以經(jīng)過混淆放置在多個(gè)鍵中[6],這樣每次攻擊都有不同的特征。如圖1所示,攻擊代碼隱藏在注冊(cè)表的自啟動(dòng)項(xiàng)中,并調(diào)用圖2中其他注冊(cè)表項(xiàng)的鍵值,全程沒有任何文件在硬盤中落地,且使用了編碼技術(shù)來規(guī)避安全軟件的檢測(cè)。
圖2 被調(diào)用的注冊(cè)表鍵值Fig.2 the key value to be called
注冊(cè)系統(tǒng)服務(wù)也可以利用類似的原理。一個(gè)攻擊者可以在注冊(cè)表中添加或者直接使用 sc.exe命令行工具來創(chuàng)建一個(gè)系統(tǒng)服務(wù)。如圖3創(chuàng)建系統(tǒng)服務(wù)命令:
圖3 創(chuàng)建惡意系統(tǒng)服務(wù)Fig.3 create malicious services
(2)WMI,WMI的數(shù)據(jù)加密存儲(chǔ)在文件夾%System%wbem epository里的多個(gè)文件中。攻擊者可以根據(jù)一個(gè)特定的事件創(chuàng)建一個(gè)filter,然后創(chuàng)建一個(gè) consumer方法來在這些事件發(fā)生時(shí)執(zhí)行惡意代碼。事件可以是一天中的某個(gè)時(shí)間,如Unix中的cron任務(wù)那樣。這種情況下,三個(gè)WMI類是必須的:filter類、consumer類以及一個(gè)FilterToConsumerBinding類將它們聯(lián)系起來。攻擊載荷一般為一個(gè)Powershell腳本以及將其存儲(chǔ)在注冊(cè)表中的腳本。這些攻擊載荷可能會(huì)全部存儲(chǔ)在WMI庫(kù)中。圖4為Cozyduke攻擊團(tuán)隊(duì)使用的方式。
圖4 WMI啟動(dòng)Powershell的consumer類Fig.4 WMI consumer that starts powershell
(3)計(jì)劃任務(wù),計(jì)劃任務(wù)可以在特定時(shí)間在本地或遠(yuǎn)程執(zhí)行命令。例如,圖5計(jì)劃任務(wù)執(zhí)行Powershell下載命令:
圖5 計(jì)劃任務(wù)執(zhí)行Powershell下載惡意代碼Fig.5 schedule task using powershell download malware
(4)在關(guān)機(jī)時(shí)調(diào)用,盡管它不是完全的無文件攻擊,在關(guān)機(jī)時(shí)調(diào)用有時(shí)也會(huì)被攻擊者使用。Dridex惡意代碼的一些變種會(huì)創(chuàng)建一個(gè)自啟動(dòng)注冊(cè)表項(xiàng)并將惡意代碼存放在硬盤中。當(dāng)系統(tǒng)啟動(dòng)時(shí),這些惡意代碼會(huì)在內(nèi)存中執(zhí)行并將注冊(cè)表項(xiàng)及硬盤上的惡意代碼刪除。在某種意義上,這些惡意代碼只運(yùn)行在內(nèi)存中,因此也算是無文件攻擊的一種方式。這類攻擊監(jiān)測(cè)關(guān)機(jī)指令,當(dāng)關(guān)機(jī)指令發(fā)起后,它會(huì)在系統(tǒng)中創(chuàng)建新的注冊(cè)表項(xiàng)以及以新的名字存放在硬盤中,等待下一次重啟,這樣它可以最小化在硬盤中的暴露時(shí)間。
一個(gè)非可執(zhí)行文件攻擊基本都會(huì)與一些腳本或合法工具相關(guān)聯(lián),因此嚴(yán)格來說這種攻擊類型應(yīng)該算是利用系統(tǒng)自帶工具的子類。這類攻擊大多數(shù)使用Powershell、WScript、CScript這些系統(tǒng)自帶的腳本框架來執(zhí)行惡意代碼[7]。一般的office文檔或者PDF文檔會(huì)包含惡意腳本代碼,在打開這些文檔的時(shí)候會(huì)彈出是否啟用編輯等提示框。安全意識(shí)不高的用戶會(huì)忽略這些提示,導(dǎo)致惡意代碼執(zhí)行。
Office文檔也并非需要宏才能執(zhí)行腳本。惡意代碼Trojan.PPDropper是一個(gè)PPT形式的病毒,它可以通過用戶打開一個(gè)鏈接來執(zhí)行惡意代碼。如圖6所示這個(gè)鏈接有三個(gè)要素:
圖6 office文檔執(zhí)行惡意代碼三個(gè)要素Fig.6 office running malware within three elements
這些代碼解碼重組后,如圖7所示為Powershell攻擊命令:
圖7 重組后的Powershell命令Fig.7 rebuild powershell command
系統(tǒng)自帶的工具是經(jīng)過安全校驗(yàn)的工具,利用這些工具也可以實(shí)現(xiàn)攻擊者的一些攻擊目的。如 net user/add可以在系統(tǒng)上添加用戶,net localgroup administrators/add可以將添加用戶加入到管理員組中,query user可以用于查詢當(dāng)前系統(tǒng)登錄的用戶情況,net view/domain可以查看當(dāng)前用戶所在域情況,tasklist/svc可以查看當(dāng)前執(zhí)行的進(jìn)程情況,以及前面提到過的rundll32.exe用于加載特定動(dòng)態(tài)鏈接庫(kù),sc.exe用于對(duì)系統(tǒng)的服務(wù)進(jìn)行操作,schtasks對(duì)計(jì)劃任務(wù)進(jìn)行操作等。所有的這些操作均可以利用系統(tǒng)自帶的工具來完成。
應(yīng)對(duì)無文件攻擊,我們自身以及所在的部門應(yīng)該建立事前預(yù)防、事中阻斷、事后響應(yīng)的體系化防御機(jī)制,才能有效地防護(hù)網(wǎng)絡(luò)的安全,避免數(shù)據(jù)資產(chǎn)遭受不必要的損失。事前預(yù)防建議做好這些安全措施:如無必要,禁用 Powershell和WMI;安裝所有的Windows更新,尤其是安全更新;檢查已安裝的應(yīng)用是否已更新至最新版本;定期檢測(cè)網(wǎng)絡(luò)中是否有非預(yù)期的大量數(shù)據(jù)流動(dòng),這可能是攻擊者正在竊取數(shù)據(jù);定期更新瀏覽器;留意郵件中下載的附件;使用可以監(jiān)測(cè)內(nèi)存惡意代碼執(zhí)行的安全工具等。事中阻斷針對(duì)無文件攻擊涉及攻擊鏈的三個(gè)環(huán)節(jié),可以使用以下方式進(jìn)行檢測(cè)阻斷[8]:因入侵環(huán)節(jié)大多使用漏洞利用或者使用釣魚郵件發(fā)送帶有惡意宏的 office文檔發(fā)起攻擊,漏洞利用防御可以有針對(duì)性地防御系統(tǒng)漏洞被攻擊者利用,而行為檢測(cè)則可以針對(duì)惡意宏腳本代碼執(zhí)行的行為進(jìn)行檢測(cè)阻斷;在持久化環(huán)節(jié),WMI、系統(tǒng)注冊(cè)表、計(jì)劃任務(wù)等關(guān)鍵區(qū)域可能會(huì)留下攻擊的痕跡,實(shí)時(shí)監(jiān)測(cè)這些區(qū)域的危險(xiǎn)更新以及定期對(duì)這些區(qū)域進(jìn)行掃描可以有效應(yīng)對(duì)這個(gè)環(huán)節(jié)的攻擊;執(zhí)行攻擊載荷環(huán)節(jié)惡意代碼已經(jīng)在內(nèi)存中運(yùn)行,因此對(duì)系統(tǒng)重點(diǎn)程序的行為檢測(cè)尤為重要,如Powershell的一些危險(xiǎn)操作。事后響應(yīng)主要關(guān)注以下幾個(gè)方面:評(píng)估攻擊造成的損失,如泄露了多少數(shù)據(jù);對(duì)攻擊路徑進(jìn)行封堵,還原攻擊路徑并封堵;人員培訓(xùn),提高安全意識(shí),避免再次發(fā)生類似事件等事后復(fù)盤提升整體防御能力。
本文介紹了無文件攻擊技術(shù)和防御。相比于傳統(tǒng)的基于惡意文件的攻擊,無文件的攻擊方式更加難以檢測(cè),對(duì)現(xiàn)有的安全防護(hù)提出了一個(gè)較大的挑戰(zhàn)。本文從無文件攻擊背景介紹到這類攻擊方式的細(xì)節(jié)進(jìn)行剖析,并提出建立事前預(yù)防、事中阻斷、事后響應(yīng)的防御體系來抵御這類攻擊的思路。