記一次特殊的釣魚樣本分析
文章主要內容
記錄對某次應急事件中獲取到的特殊釣魚樣本的分析,該樣本通過sapien powershell studio將powershell代碼封裝成可執行文件來繞過一些查殺和限制;
0x01 背景
某次應急事件中拿到一個攻擊者使用的釣魚樣本,這個樣本比較有意思和之前的分析有些不同,第一次分析也算曲折,此文記錄下對該樣本的分析過程。
樣本如下:

偽裝成某某OA的一個升級的程序(發起釣魚的攻擊者,通過偽裝成某某OA工作人員)
0x02 樣本行為分析
一般筆者拿到樣本之后會先丟到虛擬機里面跑下(這里要注意一些反虛擬機操作),然后看下各方面的特征,如注冊表修改、新建進程、網絡外聯情況等。
運行樣本:

首先通過ApateDNS看到可疑dns請求:

進一步查看sysmon:可以看到對應時間,是進程mobsync.exe發起的上面可疑域名的dns請求:

同時我們往前看幾條,也就是發起dns前,可以看到有一個進程創建操作,詳情如下:

如上圖,我們可以看到這個mobsync.exe其父進程就是樣本進程,所以這個進程我們的樣本進程創建運行的,所以我們這里其實是直接就拿到了c2地址。
進一步我們看下mobsync.exe這個進程干了些啥,如下圖pcmonitor監測到其修改涉及internet Explorer 安全區域的信息的注冊表,來增加成功回連的概率:

這里筆者進一步通過inetsim 模擬真實環境,其實就是給樣本一個回連的https服務,看看其網絡行為:
inetsim記錄如下:如下圖,好家伙直接空手套白狼,拿到回連的url了,ps:看著就像CS;

通過模擬環境的行為分析到這就差不多了,接下來就是樣本文件逆向分析了,畢竟誰知道上面的這個些是不是攻擊者給我們設置的陷阱呢?(比如當他的反虛擬化比我們的反反虛擬化做的多的時候,那么攻擊者的樣本里面檢測到這個是虛擬環境,就隨便弄些行為讓我們分析的人去分析,回連一些正常域名/IP等,ps:這個樣本回連域名正好就是這個情況,比較特殊,所以全文筆者都把域名脫敏了)。光從行為側去下結論是不太行的。
0x03 樣本逆向分析
一、前置工作:
先來看下樣本結構:通過die我們可以看到其用Smart Assembly做了一次混淆

直接通過de4dot來反混淆:拿到解混淆之后的:

再丟到die里面:

首先這個exe沒有導入和導出表,只有兩個節,代碼節和資源節:

除此之外,翻資源節的時候發現,存在一個比較特殊的標記,sapien powershell v5 host xxx的

筆者google找了下這個東西:發現是一個叫PowerShell Studio的特征,是sapien公司的。
https://www.sapien.com/software/powershell_studio

接著直接問chatgpt這個是干啥的:

我們可以得到一個結論這個工具可以用來對powershell代碼保護以及封裝成一個可執行文件。所以我們這里的樣本文件很大可能是這么來的。
如下圖,通過啟發式掃描,這個樣本可能是一個.net的c#程序(這里也印證了上面我們的推測,因為powershell也是基于.net的,所以兼容c#),但是也正是因為這個基于.net所以我們的ida之類的反編譯工具不太行了。

接著我們用dnspy來反編譯這個通過.net c#開發的exe文件,將其從中間語言還原成c#源碼:
定位入口:

二、代碼分析:
1、靜態分析
主函數代碼如下:

如上圖,可以看到,這個樣本邏輯里面還是做了一些反調試操作的,第65-68行通過kernel32里面的IsDebuggerPresent()函數來檢測進程是否被調試;
還有第69行的Class7.smethod3方法,如下圖是其實現,可以看到是通過kernel32里面的CheckRemoteDebuggerPresent()來檢測當前進程是否被調試:

接著,來到主要方法 Class9.smethod_11():

接著我們跟進該方法:

直到如下下圖處,非常可疑,這里讀取資源段里面的內容,并賦值給array3數組。

然后調用了一個smethod_7的方法對這個array3數組進行操作,最后得到var4,這個函數傳入了一個特殊的寫死的數組和num2

寫死的數組內容如下:

num2其實就是array3的長度:

分析到這的時候,筆者猜測這里這個函數在做一些解密操作。
我們跟進來看下Class9的smethod_7來看下,如下圖,簡單看下,其實就是一個長度for循環,對傳入的byte_0參數進行一頓操作,其中包括加106,減byte_1里面對應for輪數的索引的值(超過長度會自動清零 338-342行),之后對一堆情況判斷,比如但錢輪數是否是5的倍數,是的話byte_0的對應字節要加2,等等之類的

這里我們沒必要去深入分析,因為不需要知道具體是這么干的,我們只需要知道這個函數就是在解密就行。解密的邏輯就是上圖。
當然要是擱以前我肯定是不會去分析的,但是現在不一樣了,現在我們有gpt了,直接讓gpt來分析具體功能細節,反正我又不用動手,如下圖是gpt對該函數的分析結果:和我們看的差不多。

接著我們回到上層函數:解密后的array4變量的內容放到了text2里面:

接著我們跟下這個text2:如下圖,被丟到class2.method_3里面了:

跟進方法:如下圖,我們還是重點關注傳入的解密后的tex2,也就是這里的形參tstring_10,下圖,我們看到就是進行了一個替換操作,把之前的里面#SAPIENPRESETS替換成$PSScriptRoot = \"{0}\"\r\n+$PSCommandPath = \"{0}\"\r\n,其實這里就是獲取當前路徑和運行的進程路徑

替換之后直接丟到Runspace.CreatePipeline.Commands.addscript()里面,這里其實就是把我們解密后的內容當成powershell腳本語言運行了;
分析到這,我們靜態分析就差不多了;
2、動態分析
這里我們直接在下面打一個265行打個斷點,然后dump下string_10變量內容,直接拿到攻擊者的powershell腳本:

如下圖,我們拿到運行的腳本:

dump下來,用unicode編碼打開:

如下圖是最后還原的代碼:

下面一堆代碼,特別長,主要是一些ui之類的命令和資源的存儲,比如運行樣本的圖標之類的,我們來看關鍵的地方:
首先發現一個函數inject_Apc的函數:函數實現如下,就是一個簡單的APC注入,shellcode加載,稍有不同的是這里是為了不影響主進程的運行,是通過創建一個新進程mobsync.exe進程來加載shellcode:


除此之外,我們也來簡單看下這個釣魚樣本的功能實現:也就是如下三個按鈕都是干啥的:

直接ctrl+F click ,找到對應按鈕事件:就是對應的上面三個按鈕:

首先是進程檢查:其實現如下:就是檢索計算機上運行的進程信息,沒有其他的遠控操作了。

接著看補丁檢查:其實現如下:效果就是將會返回一個對象數組,每個對象代表一個安裝的快速修復工程。這些對象包括有關修復程序名稱、描述、安裝日期和時間以及其他相關信息的屬性;除此之外沒有其他遠控操作了。

最后一個應用檢查,其實現如下:效果就是獲取計算機上的所有軟件信息;除此沒有其他遠控操作。

所以全部分析下來,我們會發現這個樣本,只要雙擊運行就會上線,至于里面的一些按鈕都是一些正常功能。(畢竟也還是要裝一下的,避免運維人員一看就覺得有問題,然后就上報,g了)
3、shellcode分析
最后一步shellcode分析:
這個沒啥好說的,筆者把shellcode扣下來的時候,windowsdefender直接殺了,應該沒啥研究價值,所以這里筆者就直接模擬跑下得到如下結論:
如下圖,可以看到,這個shellcode”動態“加載了wininet.dll ,然后調用internetconnectA回連c2地址,發送get請求(其實就是一個Cobaltstrike 的shellcode),這里拉取/themes/default/js/jquery-3.3.2.slim.min.js 其實就是在拉beacon,對cobaltstrike shellcode上線過程感興趣的話可以閱讀下筆者之前寫的對csshellcode分析的文章cs shellcode分析
https://forum.butian.net/share/2017

0x04 反思
一、防守方的角度
1、如何去檢測這種樣本
筆者目前的思路是:
我們可以通過yara規則去靜態檢測,可疑的可執行文件中是否存在上文提到的sapien powershell studio的標記(如下圖);

strings: $a = "SAPIEN PowerShell.v5" wide condition all of them and uint16(0) == 0x5A4D
這個誤報情況應該不會高了,因為一般客戶處的業務基本沒有把powershell腳本封裝成exe的需求,以及在筆者的視角中也沒有想到相關其他誤報場景。
2、如何去分析這種樣本
這種樣本將powershell代碼加密藏到資源段中了,我們只要反編譯拿到源碼,直接找源碼里面的獲取資源數據的地方,就能找到解密的地址,然后打斷點,直接就拿到了封裝進去powershell腳本的地址了。
二、攻擊方的角度
那么當殺軟將這種可以執行任意powershell代碼的exe程序標記成惡意文件的時候,紅隊視角如何對其進行免殺呢?
- 首當其沖的就是要去特征化,把SAPIEN PowerShell studio的特征去掉,這樣能保證靜態免殺。
- 其次分析代碼的時候,筆者發現這個樣本沒有做反虛擬機操作和反沙箱操作,這里可以加一些相關操作來提升分析的難度,如下al-khaser項目里面提到的一些vm的特征,注冊表,服務、進程、文件等,以及對抗沙箱的定時、睡眠等

0x05 總結
通過這次的樣本,發現了新的攻擊手段,通過sapien powershell studio將powershell代碼打包成exe,這樣就能不調用powershell情況下,執行任意powershell代碼,算是學習到了一種新的繞過手段把。同時也掌握了對該類樣本的快速分析方法,下次遇到相同類型的樣本能夠迅速的分析。