我們可以通過使用CyberChef和Regex來克服大量基于文本的混淆,在混淆后,系統將識別一些“畸形”的shellcode,我們將在使用SpeakEasy模擬器進行模擬之前手動修復。

TLDR

1.識別功能和混淆類型;

2.清除基本混淆與正則表達式和文本編輯器;

3.使用Regex, CyberChef和Subsections去除高級混淆;

4.識別shellcode并修復負字節值(Python或CyberChef);

5.使用Speakeasy驗證和仿真。

初步分析

可以使用受感染的密碼保存和解壓縮腳本,這樣我們可以使用文本編輯器(如notepad++)直接打開文件。

打開后,我們可以看到腳本引用了一些Excel對象以及Wscript.Shell,通常用于執行 .vbs 腳本。

在這個階段,我們將跳轉到使用Wscript來利用Excel執行代碼的假設,避免分析Excel/Wscript組件,直接跳轉到解碼混亂的命令/代碼。

我們可以假設代碼的初始部分是利用Excel和Wscript來運行一個被混淆的vbs腳本。

混淆技術概述

從第30行開始,可以看到兩種主要的混淆形式。

1.腳本被分解成許多小字符串,例如“hello world”將是“hello”&“world”

2.該腳本使用Chr解碼的十進制編碼值。例如,“Hello World”可以是“Hell”& chr(111)&“World”。其中的“0”已轉換為十進制111。

3.每行以下劃線_結尾。雖然這不是混淆,但仍然需要刪除以清理腳本。

現在已經確定3種初始形式的“混淆”,接下來可以繼續使用正則表達式來清除它們。

可以在不使用正則表達式的情況下手動刪除和替換每個值,但這是一個非常繁瑣的過程。在這個腳本中,regex是最好的方法。

在清除第一種形式的混淆后。我們可以使用搜索/替換來做到這一點,使用“&”和空替換值。

按下確認鍵后,290個字符串分割混淆被刪除了。

現在,將繼續使用CyberChef來識別和刪除Chr(10)樣式混淆。

這個過程將包括使用一個正則表達式來識別Chr(10),然后使用一個子段來研究這些值并對它們進行解碼,保持剩余的腳本不變。為此,需要把當前編碼的內容移動到CyberChef中。

用Cyberchef的初步分析

現在將腳本移到CyberChef中,可以直接跳到正則表達式(regex)的原型中,以深入研究十進制編碼的值。

對于原型,本文將使用“正則表達式”和“突出匹配”,這是為了確認腳本匹配預期的混淆內容。

這里使用的正則表達式是Chr \(\d+\):

Chr -需要以Chr開頭的十進制值;

\( and \) -我們希望十進制值包含在括號中,需要轉義括號,因為它們在正則表達式中具有特殊含義;

\d + -指定一個或多個數值;

希望“數值”+“包含在括號中”+“前面加上Chr”。

由于regex看起來正在運行并正確識別值,因此可以繼續并將其更改為分段。

分段允許僅對匹配正則表達式的數據執行所有將來的操作。這允許我們保持腳本的大部分完整,而只解碼那些混淆并匹配我們的正則表達式的值。

接下來繼續將regex復制到分段,確保禁用原始正則表達式。

應用了這個小節之后,現在可以應用一個額外的正則表達式來提取十進制值(但只能是包含在Chr中的值)。

從這里開始,我們現在可以應用“From decimal”來解碼內容。

至此,我們現在有了一個比以前好看得多的腳本,盡管它仍然到處都有&。

回到文本編輯器

解決了主要的混淆后,可以將CyberChef輸出復制回文本編輯器中。

& chr(110)&值周圍的&符號仍然存在,可以繼續刪除它們。

保留了下劃線(visual basic換行符),繼續使用\s +_ \s +刪除它們,這將刪除所有換行符和周圍的空白。

腳本現在看起來干凈很多,盡管周圍有很多“”,但不會對分析有什么影響。

我們可以繼續使用“+”的正則表達式刪除這些引號,這將從腳本中刪除所有引號。

分析清理后的腳本

現在刪除了大部分垃圾代碼,可以繼續查看已解碼的腳本。

可以注意到的第一件事是,在進程注入中有很多api引用(VirtualAllocEx, WriteProcessMemory, CreateProcessA等)。

稍微向下滾動,我們還可以看到一團十六進制字節和進程名,可能用作進程注入的目標。例如,這個blob字節將被注入rundll32.exe。

此時,我們可以假設字節是shellcode。這主要是由于長度短,不能作為標準的pe/exe/dll文件。

在繼續之前,可以先刪除最后剩下的下劃線。

一旦刪除,十六進制字節的blob應該看起來像這樣。blob太短,不能成為一個完整的PE文件,但是有足夠的空間包含shellcode。

修復用于表示Shellcode的負十進制值

shellcode中存在需要修復的負值。雖然不確定負的值如何在visual basic/.vbs運行,但在這種情況下,似乎-4的值對應于256 -4,即252,這是0xfc,這是在Shellcode開頭看到的一個常見字節(cld標志)。

在分析可能的shellcode之前,我們需要取所有的負值并從256中減去它們。

這可以在CyberChef或Python中完成,示例如下所示。

CyberChef :這可以通過使用一個分段來提取負值,從值256中減去它們來完成。現在,所有值都可以進行十進制解碼。

Python:類似于cyberchef,可以迭代十進制值數組,從數字256中減去負值。

在輸出中,我們可以看到明文字符串以及0xfc的初始Shellcode字節。

兩個輸出也引用了一個可能的C2地址47.98.51[.]47。

此外,兩個輸出都引用EICAR字符串。這是一個字符串,將自動觸發所有殺毒軟件。

據分析,這是一個故意的字符串,旨在防止Cobalt Strike的試用版被濫用。

SpeakEasy的Shellcode仿真

0xfc字節的短長度和存在可以讓我們確信結果是shellcode。為了進一步確認,可以繼續在SpeakEasy模擬器中模擬輸出。

這證實了字節是shellcode,它從ip 47.98.41[.]47充當基于http的下載程序

如上所述,通過分析一個包含shellcode加載器的visual basic腳本,我們成功地識別了一個C2地址,并使用SpeakEasy模擬器確認了shellcode功能。

參考及來源:https://embee-research.ghost.io/decoding-a-cobalt-strike-vba-loader-with-cyberchef/