概述
在野的Powershell惡意指令碼總是經過多重混淆、加密,直接靜態分析難以得知指令碼具體有什麼惡意行為,所以需要對其進行動態除錯。目前最常用的Powershell偵錯程式是ISE,但ISE沒有較友好的除錯視窗,使得除錯指令碼時效率低下,下面,將介紹使用VSCode實現遠端除錯Powershell指令碼,幫助你提升解密分析Powershell惡意指令碼的效率。
樣本獲取
本次演示所使用的樣本為一個Powershell後門,其特點是有多層惡意程式碼,會從C&C伺服器多次載入不同payload。
母體為一個bat指令碼,主要功能就是執行一段base64加密後的Powershell指令碼。
解密後的程式碼,正是這個樣本的核心程式碼,接下來就開始對其進行除錯分析。
虛擬機器環境搭建
首先虛擬機器建議使用Win10,因為VSCode的遠端除錯功能與Win10相容性更好,同時,建立遠端會話需要將虛擬機器裡的網路型別設定為專用。
然後在虛擬機器裡執行:winrm quickconfig,即可開啟Windows 遠端管理(WinRM) 服務。
為了在虛擬機器裡成功執行除錯Powershell指令碼,還需開放指令碼執行許可權set-executionpolicy unrestricted,以及關閉Windows Defender。
本機VSCode環境搭建
遠端除錯,需要安裝Powershell外掛,開啟VSCode,直接在商店搜尋直接安裝即可。
在Powershell控制檯中輸入:Enter-PSSession -ComputerName [虛擬機器ip] -Credential [虛擬機器使用者名稱],敲入密碼,即可遠端登入到虛擬機器。然後將待除錯的指令碼放入虛擬機器中,輸入:psedit [虛擬機器中的指令碼路徑],載入目標指令碼。
遠端除錯分析
在關鍵程式碼處下斷點,按下F5除錯便可以執行到斷點處,右側則是變數的值,透過除錯我們可以得知該段程式碼的作用是從http://miranda.tattooforsure.com:8888/admin/get.php讀取惡意程式碼並執行。
VSCode遠端除錯也支援編輯指令碼,可以新增一行程式碼:$payload = -JOIn [ChAr[]](& $R $Data ($IV + $K)),將下載的惡意程式碼賦值給$payload,便可以從除錯視窗中獲取到$payload的值了。
複製$payload的值,儲存為payload.ps1進行除錯。發現其結構很簡單,宣告Start-NEGOtiatE函式並進行呼叫。值得注意的是,函式執行需要傳入母指令碼的$ser、$u、$hop引數。
payload.ps1的功能為上傳終端的域名、使用者名稱、主機名、IP、OS版本以及Powershell版本資訊,為了繞過檢測,其會使用RC4對上述資訊進行加密,並在傳輸之前先上傳RC4秘鑰。
上傳的C&C地址為http://miranda.tattooforsure.com:8888/login/process.php,上傳完畢後,C&C還會返回第二階段的payload。
將第二階段的payload儲存為payload2.ps1並開啟,原來就是個函式定義,函式名為U5BS3,然後在payload.ps1中進行呼叫。
為了方便除錯,我們直接將U5BS3函式定義複製到payload.ps1中。單步步過:U5BS3 -Servers @(($s -split "/")[0..2] -join "/") -StagingKey $SK -SessionKey $key -SessionID $ID -WorkingHours "WORKING_HOURS_REPLACE" -KillDate "REPLACE_KILLDATE" -ProxySettings $Script:Proxy,就能除錯進U5BS3函式內部了。
透過搜尋特徵程式碼,可以確認這段程式碼就是開源的Empire程式碼,是個Powershell的攻擊框架。
這段程式碼就是核心的後門程式碼了,根據C&C伺服器下發的指令碼,執行相對應的惡意操作,這裡就不詳細分析了。
總結
對於惡意樣本分析,都必須在虛擬機器環境操作,所以遠端除錯是個不錯的選擇。而VSCode作為微軟開發的指令碼IDE,對Powershell遠端除錯的功能是很完善的,大家可以透過VSCode遠端除錯功能,提升解混淆分析惡意Powershell指令碼的效率。