导语:本文使用CyberChef解码.hta脚本,并使用SpeakEasy Emulator分析了Shellcode。
我们将在本文介绍解码用于加载cobalt strike shellcode的简单.hta加载器的过程,接下来用文本编辑器执行初始分析,并使用CyberChef提取嵌入的shellcode,将使用模拟器(SpeakEasy)验证shellcode,使用Ghidra执行一些基本分析。
哈希:2 c683d112d528b63dfaa7ee0140eebc4960fe4fad6292c9456f2fbb4d2364680。将zip文件下载到一个安全的虚拟机中,并在感染密码的情况下解压缩,将显示一个.hta文件。.hta文件本质上是一个带有嵌入式脚本的html文件,我们的目标是定位和分析嵌入的脚本。
由于.hta是一种基于文本的格式,我们可以直接在文本编辑器中打开该文件。
使用文本编辑器进行分析
在文本编辑器中打开该文件将显示一小段混淆的代码,后面跟着一个大的base64 blob。
出于分析目的,我们不需要解码初始部分,我们可以通过PowerShell命令的存在和分解的wscript.shell来判断这一点。它通常从javascript执行命令。
使用初始脚本只执行base64 blob的方法,我们可以直接解码base64。如果base64 blob不能解码,可以返回到初始片段进行分析。
解码Base64
可以继续突出显示整个base64 blob并将其复制到cyberchef,现在可以尝试解码它。
将base64内容复制到CyberChef中,可以看到字符之间带有空字节的明文,这通常表示utf-16编码,很容易通过“decode text”或“remove null bytes”删除。
通过在配方中添加“remove null bytes”,可以获得看起来像PowerShell脚本的解码内容。
使用“解码文本”和“utf-16”也可以很好地工作。
这两个选项都会产生一个解码的powershell脚本,可以将其复制到一个新的文本编辑器窗口中。
PowerShell脚本分析
现在将PowerShell脚本放入文本编辑器中,我们可以继续扫描关键字或任何可能指示下一步操作的内容。
在脚本中间的十六进制字节的大blob,以及大量的api的引用,可用于分配(VirtualAlloc),写入(memset)和执行(CreateThread)内存中的东西。
在脚本的底部有一些小的东西。该脚本休眠60秒,如果初始脚本失败,会尝试切换到64位版本的Powershell。
解码十六进制字节使用CyberChef
为了分析十六进制字节,我们可以复制它们并尝试使用CyberChef解码它们,通过复制以下字节并将它们移动到CyberChef来实现。
一旦复制,字节可以用一个简单的“from十六进制”操作解码。在本例中,逗号和0x被自动识别。
我们还可以看到,虽然内容被“解码”,但看起来仍然不太好。
用CyberChef验证ShellCode
此时,验证我们的假设,即解码的内容是shellcode。一种常见的方法是在shellcode中查找明文值(ip, api名称),这需要做额外的分析。
使用CyberChef,可以通过尝试反汇编字节来验证我们的理论,即内容是shellcode。我们需要将值转换为十六进制,然后使用CyberChef的Disassemble x86操作。
在这里,可以看到字节已经成功反汇编。
1.没有明显的红色部分表示反汇编失败;
2.CLD :这是shellcode执行的第一个常见命令。
还有其他一些指标,如早期调用操作和错误0D操作,这些都是Cobalt Strike shell代码常见的情况。这些模式看起来很奇怪,但在看过一些shellcode示例之后就很容易识别了。
现在,我们可以假设数据是shellcode,并通过尝试执行它来做进一步的验证。
此时,可以继续分析反汇编字节,我们需要对x86指令有所熟悉。尝试并执行代码通常要容易得多。特别是对于较大的shellcode示例。
通过在模拟器中执行来验证ShellCode
为了进一步验证数据是shellcode并尝试确定它的功能,我们可以将其保存到一个文件中,并尝试在模拟器或调试器中运行它。
在这种情况下,可以使用FireEye的SpeakEasy工具。你可以在这里阅读SpeakEasy,并从GitHub下载。
在运行SpeakEasy之前,我们可以先下载可疑shellcode的原始字节,确保删除十六进制和反汇编x86操作。
你可以将文件命名为任何你喜欢的名称,本文将其命名为shellcode.bin。
接下来,可以用以下命令在SpeakEasy工具上打开命令提示符。
-t :要模拟的目标文件;
-r :告诉SpeakEasy文件是shellcode;
-a x86 :告诉SpeakEasy假定x86指令。这几乎总是x86或x64,如果其中一个失败,可以试试另一个。
按下enter键,SpeakEasy就可以成功地模拟代码。在这里我们可以看到,为了从51.79.49[.]174:443下载一些东西,进行了许多api调用。
现在,可以安全地假设整个脚本和shellcode的主要目的是充当下载程序。此时,还可以调查到该IP地址的连接,并确定是否成功下载和执行了任何内容。
文章翻译自:https://embee-research.ghost.io/malware-analysis-decoding-a-simple-hta-loader/如若转载,请注明原文地址