# 分析Cobalt Strike Powershell惡意程式 大約從去年開始,不知道為什麼突然出現許多使用Cobalt Strike的攻擊,一些重大的資安事件當中 (ex: SolarWinds供應鏈攻擊[[1]](https://www.ithome.com.tw/news/142398)),駭客也使用了Cobalt Strike Payload。Cobalt Strike是美國Strategic Cyber公司所開發的一款滲透測試的工具框架,適合Red Team協作進行滲透測試。 在這段時間所看到的Cobalt Strike Payload,除了最常見的exe和dll形式,其他也有像是巨集(Macro)或是Powershell型態的攻擊投遞。今天要深入了解的是Cobalt Strike Powershell型的惡意程式。 ## 樣本檢視 `Sample` `MD5: e0315aca119a9b3b7d89184ad2fa2603` `SHA-1: bfc928da46d2ae32e2c60373a5d968d2f15e497a` `SHA-256: 24b18a60020d05b32b13d2cf1e6d6b1ccda4f0af5fb5ec0da960746fde54b796` ![](https://i.imgur.com/YEMEWTF.png) 從VirusTotal上可以看到有28家防毒廠商可以偵測樣本是惡意的,有4家規則顯示這是Cobalt Strike相關的惡意程式,有趣的是,有8家規則顯示「PwShell.Rozena」。看了2018年GDATA關於Rozena的分析報告[[2]](https://www.gdatasoftware.com/blog/2018/06/30862-fileless-malware-rozena),其中也使用command line執行Powershell的手法,進行無檔案攻擊(Fileless attack),也許是Yara規則有相似的部分,之後有時間也可以分析看看。 ## 樣本分析 利用文字編輯器開啟檔案(Notepad++或sublime text都可以),這隻程式沒有被經過混淆,是很單純的直接由Cobalt Strike工具直接產出的Stageless payload [[3]](https://www.cobaltstrike.com/help-staged-exe)。 由Cobalt Strike官網的說明得知: > Attacks -> Packages -> Windows Executable (S) generates a Windows executable artifact that contains Cobalt Strike's Beacon (no stagers, hence a stageless payload!). This package gives you several output options. 其中的一個選項就是Powershell,其說明: > PowerShell is a PowerShell script that injects a stageless Beacon into memory. 也就是目前底下所看到的Powershell script。 ![](https://i.imgur.com/Z80e9Y5.png) 快速的瀏覽過powershell程式碼,可以知道程式宣告了兩個function,func_get_proc_address以及func_get_delegate_type,程式中間有很長一串Base64的字串,在byte array後面有一小段xor運算,最後出現VirtualAlloc和Invoke 這些可疑的API。 在程式的一開始,利用IntPtr Size確認系統是32-bit或是64-bit作業系統。如果size是4代表當前的作業系統為32-bit系統,若size為8則代表當前為64-bit系統。 如果系統為64-bit時,`Start-job`指令代表開始背景執行Powershell工作,參數為`$DoIt`,以32-bit模式運行,若系統為32-bit,則直接執行`$DoIt`。 ![](https://i.imgur.com/TOzW4V1.png) 再來我們先聚焦在中間的Base64的字串上,可以看到他透過Convert FromBase64String方法將這一串Base64的字串轉為`$var_code` Byte array形式。 ![](https://i.imgur.com/TFF5jLn.png) 接著將每一個byte與35做XOR運算,`-lt`是powershell的小於運算子,`-bxor`則是做binary XOR運算。 ![](https://i.imgur.com/p7lw2r3.png) 我們可以將XOR之後的byte array dump出來查看,記得先將以下兩段程式碼註解,不讓程式載入memory裡執行。 ![](https://i.imgur.com/t47iQTg.png) 透過Powershell WriteAllBytes方法,將內容dump成檔案,加入一行code如下,存檔並執行他。 ![](https://i.imgur.com/LPVYaiw.png) 利用靜態分析工具Pestudio查看dump出的檔案會發現它其實是一個dll檔。 ![](https://i.imgur.com/NIRXJVR.png) 接下來的程式碼則是將dll檔案載入memory當中執行,在整個powershell執行的過程中,不會有檔案落地,所以這樣的手法又被稱為無檔案攻擊。 ![](https://i.imgur.com/6X6K2ac.png) 值得注意的是,我們剛才dump出來的dll檔,就是cobalt strike的Beacon payload。 目前也已經有許多研究人員開發出可以萃取出Beacon config資訊的工具[[4]](https://github.com/Te-k/cobaltstrike)。利用工具萃取出的config資訊如下: ![](https://i.imgur.com/h4kgiZ0.png) 可得知Beacon為https類型,並取出c2 Domain以及URI。如果想更了解Cobalt Strike Beacon的分析,我推薦T-ek寫的文章[[5]](https://www.randhome.io/blog/2020/12/20/analyzing-cobalt-strike-for-fun-and-profit/),裡面有更多詳細的分析內容。 ## 在Debug的過程中可能會遇到的問題 無法執行Powershell script,可能會發生在你新安裝的Windows系統上。 ![](https://i.imgur.com/wK1JUbU.png) 這個問題在於PowerShell Execution Policy的設定上,Execution Policy有4種選項[[6]](https://tecadmin.net/powershell-running-scripts-is-disabled-system/): Restricted : No scripts can be run. AllSigned : Only scripts signed by a trusted publisher can be run. RemoteSigned : Downloaded scripts must be signed by a trusted publisher. Unrestricted : All Windows PowerShell scripts can be run. 利用`Get-ExecutionPolicy`查看目前執行權限,可以看到目前的權限為Restricted,表示不能執行任何的script。 ![](https://i.imgur.com/XRKorCq.png) 我們可以利用`Set-ExecutionPolicy`來修改權限。 ![](https://i.imgur.com/Gd7xQ1g.png) ### Reference [1] https://www.ithome.com.tw/news/142398 [2] https://www.gdatasoftware.com/blog/2018/06/30862-fileless-malware-rozena [3] https://www.cobaltstrike.com/help-staged-exe [4] https://github.com/Te-k/cobaltstrike [5] https://www.randhome.io/blog/2020/12/20/analyzing-cobalt-strike-for-fun-and-profit/ [6] https://tecadmin.net/powershell-running-scripts-is-disabled-system/