使用高级CyberChef和Shellcode仿真手动解码Cobalt Strike.vbs Loader
2023-12-11 11:32:0 Author: www.4hou.com(查看原文) 阅读量:20 收藏

xiaohui 技术 刚刚发布

805

收藏

导语:本文介绍了如何手动解码用于将Cobalt Strike shellcode加载到内存中的复杂.vbs脚本。

我们可以通过使用CyberChef和Regex来克服大量基于文本的混淆,在混淆后,系统将识别一些“畸形”的shellcode,我们将在使用SpeakEasy模拟器进行模拟之前手动修复。

哈希:e8710133491bdf0b0d1a2e3d9a2dbbf0d58e0dbb0e0f7c65acef4f788128e1e4,示例链接请点此

TLDR

1.识别功能和混淆类型;

2.清除基本混淆与正则表达式和文本编辑器;

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

4.识别shellcode并修复负字节值(Python或CyberChef);

5.使用Speakeasy验证和仿真。

初步分析

可以使用受感染的密码保存和解压缩脚本,这样我们可以使用文本编辑器(如notepad++)直接打开文件。

打开后,我们可以看到脚本引用了一些Excel对象以及Wscript.Shell,通常用于执行 .vbs 脚本。

在这个阶段,我们将跳转到使用Wscript来利用Excel执行代码的假设,避免分析Excel/Wscript组件,直接跳转到解码混乱的命令/代码。

1.png

我们可以假设代码的初始部分是利用Excel和Wscript来运行一个被混淆的vbs脚本。

混淆技术概述

从第30行开始,可以看到两种主要的混淆形式。

1.脚本被分解成许多小字符串,例如“hello world”将是“hello”&“world”

2.该脚本使用Chr解码的十进制编码值。例如,“Hello World”可以是“Hell”& chr(111)&“World”。其中的“0”已转换为十进制111。

3.每行以下划线_结尾。虽然这不是混淆,但仍然需要删除以清理脚本。

2.1.png

2.2.png

现在已经确定3种初始形式的“混淆”,接下来可以继续使用正则表达式来清除它们。

可以在不使用正则表达式的情况下手动删除和替换每个值,但这是一个非常繁琐的过程。在这个脚本中,regex是最好的方法。

在清除第一种形式的混淆后。我们可以使用搜索/替换来做到这一点,使用“&”和空替换值。

3.png

按下确认键后,290个字符串分割混淆被删除了。

4.png

现在,将继续使用CyberChef来识别和删除Chr(10)样式混淆。

这个过程将包括使用一个正则表达式来识别Chr(10),然后使用一个子段来研究这些值并对它们进行解码,保持剩余的脚本不变。为此,需要把当前编码的内容移动到CyberChef中。

用Cyberchef的初步分析

现在将脚本移到CyberChef中,可以直接跳到正则表达式(regex)的原型中,以深入研究十进制编码的值。

对于原型,本文将使用“正则表达式”和“突出匹配”,这是为了确认脚本匹配预期的混淆内容。

这里使用的正则表达式是Chr \(\d+\):

Chr -需要以Chr开头的十进制值;

\( and \) -我们希望十进制值包含在括号中,需要转义括号,因为它们在正则表达式中具有特殊含义;

\d + -指定一个或多个数值;

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

5.png

由于regex看起来正在运行并正确识别值,因此可以继续并将其更改为分段。

分段允许仅对匹配正则表达式的数据执行所有将来的操作。这允许我们保持脚本的大部分完整,而只解码那些混淆并匹配我们的正则表达式的值。

接下来继续将regex复制到分段,确保禁用原始正则表达式。

6.png

应用了这个小节之后,现在可以应用一个额外的正则表达式来提取十进制值(但只能是包含在Chr中的值)。

从这里开始,我们现在可以应用“From decimal”来解码内容。

至此,我们现在有了一个比以前好看得多的脚本,尽管它仍然到处都有&。

7.png

回到文本编辑器

解决了主要的混淆后,可以将CyberChef输出复制回文本编辑器中。

8.png

& chr(110)&值周围的&符号仍然存在,可以继续删除它们。

9.png

保留了下划线(visual basic换行符),继续使用\s +_ \s +删除它们,这将删除所有换行符和周围的空白。

10.1.png

10.2.png

脚本现在看起来干净很多,尽管周围有很多“”,但不会对分析有什么影响。

我们可以继续使用“+”的正则表达式删除这些引号,这将从脚本中删除所有引号。

11.png

分析清理后的脚本

现在删除了大部分垃圾代码,可以继续查看已解码的脚本。

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

12.png

稍微向下滚动,我们还可以看到一团十六进制字节和进程名,可能用作进程注入的目标。例如,这个blob字节将被注入rundll32.exe。

13.png

此时,我们可以假设字节是shellcode。这主要是由于长度短,不能作为标准的pe/exe/dll文件。

在继续之前,可以先删除最后剩下的下划线。

14.png

一旦删除,十六进制字节的blob应该看起来像这样。blob太短,不能成为一个完整的PE文件,但是有足够的空间包含shellcode。

15.png

修复用于表示Shellcode的负十进制值

shellcode中存在需要修复的负值。虽然不确定负的值如何在visual basic/.vbs运行,但在这种情况下,似乎-4的值对应于256 -4,即252,这是0xfc,这是在Shellcode开头看到的一个常见字节(cld标志)。

在分析可能的shellcode之前,我们需要取所有的负值并从256中减去它们。

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

CyberChef :这可以通过使用一个分段来提取负值,从值256中减去它们来完成。现在,所有值都可以进行十进制解码。

16.png

Python:类似于cyberchef,可以迭代十进制值数组,从数字256中减去负值。

在输出中,我们可以看到明文字符串以及0xfc的初始Shellcode字节。

17.png

两个输出也引用了一个可能的C2地址47.98.51[.]47。

18.png

此外,两个输出都引用EICAR字符串。这是一个字符串,将自动触发所有杀毒软件。

19.png

据分析,这是一个故意的字符串,旨在防止Cobalt Strike的试用版被滥用。

20.1.png

20.2.png

SpeakEasy的Shellcode仿真

0xfc字节的短长度和存在可以让我们确信结果是shellcode。为了进一步确认,可以继续在SpeakEasy模拟器中模拟输出。

21.png

这证实了字节是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/如若转载,请注明原文地址

  • 分享至

取消 嘶吼

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟


文章来源: https://www.4hou.com/posts/gDjl
如有侵权请联系:admin#unsafe.sh