北京天融信科技有限公司
01什么是 PowerShell
PowerShell是微軟為Windows平臺(tái)制作的新一代命令行操作環(huán)境。和傳統(tǒng)的命令行環(huán)境相比,PowerShell的功能更加強(qiáng)大,使用方式也非常靈活。但這些新的特性單來便利的同時(shí),也隱藏著更大的安全風(fēng)險(xiǎn)。本文在對(duì)PowerShell功能和特點(diǎn)介紹的基礎(chǔ)上,將會(huì)概述部分安全機(jī)制的繞過方法,以及針對(duì)PowerShell攻擊的檢測(cè)和防御技巧。
1.1 PowerShell三大組件
powershell由三個(gè)主要組件構(gòu)成:
System.Management.Automation.dll :PowerShell核心功能位于此dll庫中;
PowerShell.exe :加載System.Management.Automation.dll庫的主進(jìn)程文件;
Antimalware Scanning Interface (AMSI) :反惡意軟件掃描接口,允許與Windows Defender等反惡意軟件程序集成。
1.2 PowerShell版
下表是Powershell的歷史版本及所運(yùn)行的環(huán)境:
注意事項(xiàng):
PowerShell v2 無法升級(jí)到 v2 以上;
PowerShell v3 可以直接升級(jí)到 v5+;
PowerShell v2 和 PowerShell v5 可以共存;
PowerShell v2 無法從 Windows 7/Windows Server 2008 中刪除;
Windows 8+/Server 2012+ 上默認(rèn)不安裝 PowerShell v2/.Net 3.5;
Microsoft Office 需要 .Net 3.5 并且需要啟用 PowerShell v2;
%SystemRoot%\System32\WindowsPowerShell\v1.0\是所有版本的的PowerShell 的可執(zhí)行文件的路徑。
02PowerShell的攻擊特性
PowerShell的cmdlets包含許多系統(tǒng)管理工具,這些工具在用于攻擊時(shí)因其沒有文件承載,不需要接觸磁盤,直接在內(nèi)存中加載并執(zhí)行惡意代碼,可以繞過防火墻、IDS/IPS,以及許多反病毒軟件。
2.1 內(nèi)置工具
PowerShell內(nèi)置工具可以直接執(zhí)行惡意操作,例如Invoke-WebRequest可以通過HTTP協(xié)議下載惡意文件,如下圖:
2.2 創(chuàng)建自定義工具
PowerShell的強(qiáng)大之處還在于可以創(chuàng)建自定義工具,如果像Invoke-WebRequest這樣的工具不可用,仍然可以使用.Net中的.Net WebClient類編寫自己的下載器,如下圖是自定義的文件下載工具:
使用自定義下載工具下載文件:
WebClient類也可以直接在命令行調(diào)用,以達(dá)到避免文件落地的目的,使用DownloadString加載并執(zhí)行遠(yuǎn)程腳本如下:
以上就是powershell的基本使用。
2.3 PowerShell在釣魚攻擊中的應(yīng)用
1.編寫后門ps文件Invoke-BaseConfig.ps1,如下:
2.新建word文檔的宏代碼輸入如下代碼:
3.通過郵件等形式進(jìn)行投遞,當(dāng)有人打開附件并啟用宏時(shí),攻擊者就可以獲得該pc的權(quán)限。
2.4 PowerShell攻擊框架
除了在攻擊場(chǎng)景中基本用法,PowerShell還可以用來創(chuàng)建自定義工具集。使用PowerShell創(chuàng)建的開源攻擊項(xiàng)目有很多,這些攻擊框架展示了整個(gè)攻擊過程中 PowerShell 如何發(fā)揮作用。下面是一些比較流行的PowerShell 的攻擊工具/框架:
03PowerShell 的可見性問題
對(duì)于許多 EDR 和防病毒產(chǎn)品,只有在調(diào)用“PowerShell.exe
若要提高對(duì)PowerShell活動(dòng)的檢測(cè)能力,方法就是手動(dòng)執(zhí)行一些PowerShell操作,然后查看對(duì)應(yīng)的檢測(cè)日志,檢測(cè)是否存在遺漏,以便完善安全產(chǎn)品的檢測(cè)能力。
下面通過一個(gè)名為“Invoke-BaseConfig.ps1"的演示腳本,來展示相同的腳本在不同的工具中可能會(huì)有那些不同的行為。演示腳本的行為包括自定義函數(shù)、對(duì)本地可執(zhí)行文件進(jìn)行調(diào)用、混淆以及調(diào)用其他 PowerShell 腳本等。
3.1 Sysmon
下面通過使用 Sysmon 來模擬殺毒軟件捕獲的內(nèi)容。
調(diào)用 PowerShell.exe 執(zhí)行 cmdlet 時(shí)的樣子:
當(dāng) PowerShell執(zhí)行上圖所示命令時(shí),大多數(shù)命令行工具都會(huì)記錄整個(gè)命令。但在PowerShell終端中則無需先調(diào)用 PowerShell.exe,運(yùn)行 cmdlet 時(shí)的產(chǎn)生日志如下圖:
由于 cmdlet 是在已經(jīng)啟動(dòng)的 PowerShell 進(jìn)程中執(zhí)行,因此不會(huì)捕獲到任何命令行。
執(zhí)行更復(fù)雜的腳本時(shí)捕獲的內(nèi)容如下:
如上圖所示,腳本源文件本身并沒有被捕獲,但是任何直接與可執(zhí)行文件/進(jìn)程創(chuàng)建(powershell.exe、net.exe)相關(guān)的命令都被捕獲。其他如混淆的命令則*沒有被捕獲。還有另一個(gè)被記錄下來的調(diào)用shell.ps1執(zhí)行命令,但該腳本并不在Invoke-BaseConfig.ps1 腳本的原始文件中。
04PowerShell 日志記錄
下表顯示了可用的 PowerShell 日志、所需的版本以及一些對(duì)應(yīng)日志的附加說明:
標(biāo)*表示默認(rèn)不啟用
4.1 Scriptblock日志
Scriptblock 日志是可以啟用的用日志之一。在下面的屏幕截圖中,運(yùn)行之前相同的命令,可以看到初始命令以及執(zhí)行腳本的全部源代碼,從日志分析和防守的角度上講,Scriptblock的日志粒度已經(jīng)非常詳細(xì)。
4.2 Module日志
使用Module記錄日志時(shí),每個(gè)命令都會(huì)記錄成一個(gè)單獨(dú)的事件,某些情況下一個(gè)命令可能產(chǎn)生多個(gè)事件,這導(dǎo)致Module日志量會(huì)非常多。將這些事件與Scriptblock日志事件關(guān)聯(lián)后,可以看到命令在通過PowerShell管道時(shí)的詳細(xì)信息。通過這種方法不僅可以看到命令本身,還可以看到與該命令執(zhí)行時(shí)相關(guān)的變量以及輸出的值。因?yàn)镸odule日志會(huì)記錄變量的值,所以甚至可以在這些日志中分析到硬編碼的密碼或通過控制臺(tái)輸入的密碼。
在下面的演示中,我們可以觀察到混淆命令在執(zhí)行時(shí)的細(xì)節(jié),該命令通過使用Set-ItemProperty修改注冊(cè)表,創(chuàng)建了一個(gè)開機(jī)啟動(dòng)項(xiàng) ,這個(gè)啟動(dòng)項(xiàng)在每次系統(tǒng)啟動(dòng)時(shí)下載另一個(gè)混淆命令并執(zhí)行:
在此例子中看到,從最開始 Invoke-Expression初始化到 Set-ItemProperty 修改注冊(cè)表整個(gè)過程中Module記錄的多個(gè)事件。
4.3 Transcription日志
當(dāng)需要確定事件是否成功執(zhí)行以及有哪些內(nèi)容輸出到會(huì)話時(shí),Transcription日志是非常有用的。在下面的屏幕截圖中可以看到初始命令以及輸出到屏幕的所有內(nèi)容,通過上述這些的日志進(jìn)行分析,可以很輕松看到PowerShell在執(zhí)行腳本做了什么。
05PowerShell混淆
5.1 混淆技巧
PowerShell腳本在編寫方式上非常靈活,非常容易進(jìn)行各種混淆。除此之外也可以使用混淆工具進(jìn)行混淆,例如:
Invoke-Obfuscation(https://github.com/danielbohannon/Invoke-Obfuscation)。
如果是手動(dòng)混淆,可以使用以下技術(shù):
注意:PowerShell 包含一個(gè) -encode 選項(xiàng),可以執(zhí)行 base64 編碼的命令。這個(gè)選項(xiàng)是為了運(yùn)行包含括號(hào) ({}) 的復(fù)雜代碼塊的,所以并不算是混淆。
5.2 Deep Scriptblock Logging
在4.1小節(jié)里,Scriptblock日志記錄了 Invoke-BaseConfig.ps1 的整個(gè)源代碼,但命令仍然是被混淆的。但由于我們擁有完整的源代碼,所以可以手動(dòng)反混淆,只是會(huì)比較麻煩。從PowerShell v5.1 開始,PowerShell引入了一個(gè)名為“Deep Scriptblock Logging"的功能,這個(gè)功能在執(zhí)行混淆代碼時(shí),會(huì)在剝離每一層混淆代碼的同時(shí)記錄下實(shí)際運(yùn)行的代碼。
在下面的示例中,可以看到通過CHAR 編碼的命令通過管道傳輸?shù)?For-EachObject 循環(huán),解碼后的命令被記錄到日志中:
5.3 手動(dòng)反混淆
并非所有的混淆代碼都可以自動(dòng)解碼,此時(shí)就需要手動(dòng)解碼,手動(dòng)解碼同樣也是利用PowerShell操作的。
在上一節(jié)記錄的反混淆命令中,IEX Net.WebClient 命令沒有被反混淆。要手動(dòng)對(duì)其進(jìn)行反混淆,只需要復(fù)制括號(hào)里包含的字符串內(nèi)容,然后粘貼到PowerShell中,如下圖:
PowerShell會(huì)自動(dòng)對(duì)輸入的內(nèi)容解碼并輸出。
5.4 backdoor.ps1和Shell.ps1
繼續(xù)查看Scriptblock日志,查看Invoke-BaseConfig.ps1執(zhí)行之后的事件。如下圖,可以看到backdoor.ps1的全部源碼,backdoor.ps1禁用了Windows Defender,然后調(diào)用shell.ps1,Shell.ps1 ,其中包含大量 base64 編碼數(shù)據(jù):
backdoor.ps1最初是從Invoke-BaseConfig.ps1中調(diào)用并執(zhí)行的,由于沒有直接調(diào)用PowerShell.exe,所以在3.1節(jié)中,Sysmon工具沒有記錄到這個(gè)事件。backdoor.ps1通過調(diào)用“PowerShell.exe -Exec Bypass"調(diào)用了shell.ps1,所以在3.1節(jié)中記錄shell.ps1執(zhí)行的事件,卻不知道shell.ps1的來源。
5.5 Invoke-Decoder
現(xiàn)在還剩下一個(gè)問題,shell.ps1 中的這一大塊 base64壓縮數(shù)據(jù)是什么,這里需要用到一個(gè)解碼工具:
Invoke-Decoder(https://github.com/robwillisinfo/Invoke-Decoder)。
運(yùn)行Invoke-Decoder,選擇L加載字符串、S從終端加載字符串,然后復(fù)制需要解碼得字符到終端,如下圖:
然后使用選項(xiàng)2,base64解碼和解壓縮:
通過記事本打開剛剛解碼的文件,文件是MZ開頭的,說明這是一個(gè)可執(zhí)行文件。在文件中有“GruntStager"關(guān)鍵字,說明這個(gè)文件可能是一個(gè)Covenant
(https://www.cobbr.io/Covenant.html),C2地址是http://192.168.90.206:80。
06PowerShell安全控制
在前面的章節(jié)主要講增加對(duì)PowerShell的監(jiān)控和檢測(cè)能力,除此之外,還應(yīng)該控制PowerShell的使用場(chǎng)景,提高系統(tǒng)安全性。
6.1 受限語言模式(CLM)
受限語言模式支持運(yùn)行日常管理任務(wù),限制了可以任意調(diào)用 Windows API 的敏感語言元素。啟用受限語言模式(CLM)可以阻止大多數(shù)的基于PowerShell 的惡意代碼運(yùn)行。
關(guān)于受限語言模式的更多信息可以參考:/powershell/powershell-constrained-language-mode/.
6.2 限制 IT 管理權(quán)限(JEA)
Just Enough Administration 比受限語言模式的控制更加完善,控制粒度更細(xì)。它是一種基于角色的訪問控制,可以限制用戶可以運(yùn)行的 cmdlet、函數(shù)和外部命令。會(huì)話也是沙盒化的。
關(guān)于JEA的更多信息可以參考:
/en-us/previous-versions/dn896648(v=technet.10)
6.3 應(yīng)用鎖(AppLocker)
AppLocker通過使用 CLM 和 JEA限制了攻擊者在 PowerShell 中的可以進(jìn)行的攻擊行為,AppLocker 根據(jù)定義的策略控制用戶能夠啟動(dòng)的內(nèi)容,以此限制攻擊行為。使用 AppLocker可以將定義的策略分配給組或個(gè)人。
AppLocker 可以限制以下內(nèi)容:
可執(zhí)行文件(.exe、.com)
腳本(.js、.ps1、.vbs、.cmd、.bat)
Windows 安裝程序文件(.mst、.msi、.msp)
DLL 文件(.dll、.ocx)
打包的應(yīng)用程序/安裝程序 (appx)
關(guān)于AppLocker的更多信息可以參考:
/en-us/windows/security/threat-protection/windows-defender-application-control/applocker/applocker-overview
07PowerShell 繞過
7.1 PowerShell v2 降級(jí)攻擊
PowerShell v2缺少微軟發(fā)布的較新的安全功能,比如PowerShell v2不支持AMSI。以下命令可以將 PowerShell “降級(jí)"到 v2,不僅可以避開 AMSI檢測(cè),還可以避開大多數(shù)日志記錄功能,如下圖:
如上圖所示日志,降級(jí)命令本身可以在Scriptblock (4104) 事件中檢測(cè)到,但是在降級(jí)之后檢測(cè)不到任何內(nèi)容。防止“降級(jí)攻擊"辦法就是刪除 PowerShell v2。
關(guān)于PowerShell降級(jí)攻擊可以參考鏈接:https://robwillis.info/2020/01/disabling-powershell-v2-with-group-policy/
7.2 非托管 PowerShell
在1.1章節(jié)提到,PowerShell的核心實(shí)際上是System.Management.Automation.dll,所以攻擊者可以在沒有PowerShell.exe的情況下運(yùn)行PowerShell代碼。這也是為什么不推薦阻止PowerShell.exe原因之一。這種技術(shù)被稱為“非托管"PowerShell,這些工具通常在二進(jìn)制文件中實(shí)現(xiàn)AMSI和PowerShell日志記錄,想要對(duì)這類攻擊進(jìn)行檢測(cè)很困難。
如下圖,powerless.exe是我們自己編譯的powershell的替代程序:
下面是非托管的PowerShell的項(xiàng)目:
UnmanagedPowerShell(https://github.com/leechristensen/UnmanagedPowerShell)
SharpPick(https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerPick)
PSAttack(https://github.com/jaredhaight/PSAttack)
nps(https://github.com/Ben0xA/nps)
InsecurePowerShell(https://github.com/cobbr/InsecurePowerShell)
08防御 PowerShell 攻擊
下表是總結(jié)了本文中講的概念和技術(shù),可以作為檢測(cè)PowerShell惡意活動(dòng)的基本手段:
使用支持 AMSI 的 EDR 和 殺毒軟件。
PowerShell v5 Malicious自動(dòng)記錄事件;
Malicious自動(dòng)日志事件是通過 AMSI 標(biāo)記為“警告"級(jí)別的 4104/Scriptblock 事件,這些事件是檢測(cè)PowerShell的步,但是4014中存在一些正常的事件需要單獨(dú)處理。
已知樣本
針對(duì)已知的工具和降級(jí)攻擊創(chuàng)建基于簽名的告警規(guī)則。
混淆
分析字符的使用頻率(`,{},(), whitespace);
在檢索數(shù)據(jù)時(shí)去除轉(zhuǎn)義字符 (`);
檢測(cè)base64 之外的編碼技術(shù)。
09總結(jié)
PowerShell 工具是一把劍,一直以來都是網(wǎng)絡(luò)對(duì)抗中的熱點(diǎn)技術(shù),而且隨著微軟對(duì)PowerShell的投入越來越大,針對(duì)PowerShell的利用也將越來越復(fù)雜。身為安全人員,我們首先要熟知環(huán)境中正常 PowerShell 的行為特征以及惡意行為跡象。衡量并理解對(duì)手使用該工具的方式以及所發(fā)生的變化,是檢測(cè)并最終防御PowerShell攻擊的關(guān)鍵所在。
原文鏈接:
https://robwillis.info/2021/02/defending-against-powershell-attacks/
聲明:
1.本文檔由天融信安全團(tuán)隊(duì)發(fā)布,未經(jīng)禁止第三方轉(zhuǎn)載及轉(zhuǎn)投。
2.本文檔所提到的技術(shù)內(nèi)容及資訊僅供參考,有關(guān)內(nèi)容可能會(huì)隨時(shí)更新,天融信不另行通知。
3.本文檔中提到的信息為正常公開的信息,若因本文檔或其所提到的任何信息引起了他人直接或間接的資料流失、利益損失,天融信及其員工不承擔(dān)任何責(zé)任。