追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

admin 2024年3月31日19:58:17评论5 views字数 4496阅读14分59秒阅读模式
追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

点击上方蓝字关注我们

SPRING HAS ARRIVED

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

摘要

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

恶意软件常常利用混淆JavaScript脚本的技术,以增加其对抗分析和检测的难度。通过混淆,恶意脚本可以模糊代码的结构和逻辑,使其变得更加晦涩难懂,从而阻碍安全研究人员和防御系统对其进行分析和检测。此外,混淆还可以使得恶意脚本更难以被传统的静态和动态分析工具所识别,从而增加了攻击者成功执行恶意活动的机会。因此,混淆JavaScript脚本已成为恶意软件作者常用的手段之一,用以提高其攻击的成功率和持久性。

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

调试方法

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

通常,混淆的JS代码的目的是为了释放或下载另一个文件。要调试此操作,可以利用“shell32.dll”中的特定函数,例如“ShellExecute”用于运行命令。JS通过称为“wscript.exe”的Windows解释器执行,因此要调试JS,需要在调试器中打开wscript.exe(路径:C:/Windows/System32/wscript.exe),然后更改命令行以指向恶意的JS文件:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

接下来,需要在上面提到的shell32.dll上设置断点,方法是转到“断点”选项卡 > 单击右键 > “添加DLL断点” > shell32.dll:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

现在,需要通过运行调试器(x64dbg, 下载地址:https://x64dbg.com/)来加载shell32.dll — 如果断点设置正确,x64dbg将在到达此DLL后停止执行,这意味着在特定API上设置断点,例如“ShellExecute”,将可用。这可以通过转到“符号”选项卡 > 单击shell32.dll > 搜索ShellExecute > 按下F2来设置断点(红色表示断点已设置)来完成:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

现在,需要禁用针对shell32.dll的断点,否则它将执行此DLL的任何API:“断点”选项卡 > 右键单击“shell32.dll” > “禁用”。之后,再次运行调试器 — 最终它将停止在先前设置的API上执行。传递的参数可以在堆栈面板中看到 — 在此示例中,它是一个PowerShell命令:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

完整命令可以通过在堆栈面板中右键单击命令 > “跟随转储中的Qword” > “转储 *” > 在转储面板中右键单击 > “文本” > “扩展ASCII” 来扩展。

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

看起来JS正在释放并执行PS脚本。脚本的路径也可见,这意味着可以在不先执行JS文件的情况下调查PS脚本的IOCs。这是由PSDecode(下载地址:https://github.com/R3MRUM/PSDecode)美化的代码:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

恶意软件分析

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

在整理脚本后,可以看到这是真正的恶意软件,而JS只是传播者。它将尝试从第一个URL下载“01b1v2g3.zip”(另存为“s3pch1.zip”,解压内容到创建的“MsEdgeSandbox”隐藏文件夹中,并删除“s3pch1.zip”),或者从第二个URL下载(下载“f1lePsa”变量中指定的文件,并将它们保存在同一“MsEdgeSandbox”目录中)。最后,它启动“client32.exe”并创建注册表条目以保持持久性。现在已知恶意的URL,我们可以直接连接到它们并下载ZIP文件:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

存档包含一些DLL、EXE、INI文件,其中包括“client32.exe”,这可能是真正的恶意软件:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

其中一个配置文件包含一行,可能包含C2地址以及用于连接的端口:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

静态分析

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

为了进一步确认上述行为,可以动态地分析文件,但在此之前,可以先用静态分析方法进行快速检查。以下是发现的文件及数字签名信息,如图:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

相同的信息可以从检查字符串或分析PE头中提取。NetSupport Manager是合法的远程管理应用程序,但也被对手用作远程访问木马(RAT)。总之,静态分析没有提供任何新信息,因为client32.exe正在使用配置文件进行连接,因此下面将开始通过动态分析来确认这一点。

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

动态分析

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

在动态分析之前,先简单介绍几个实用工具。FLARE和Remnux是网络连接的组合工具, INetSim(下载地址:https://www.inetsim.org/downloads.html)是一个用于模拟Internet服务如:http或smtp的工具。将FLARE的默认网关配置为Remnux的IP, 这样在FLARE中生成的流量将被定向到Remnux的机器。通过网络分析确认了恶意软件确实正在连接到配置文件中的域名,以及一个新的域名, 可能是合法的域名, 因为解析域指向: geo.netsupportsoftware.com,以下是Wireshark(下载地址:https://www.wireshark.org/)抓包的结果:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

接下来看一下如果Remnux也在端口1412上运行监听器会出现什么情况(netcat下载地址:https://sectools.org/tool/netcat/):

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

看来持久性是通过PS脚本实现的, 但该脚本未执行, client32.exe未执行这部分功能, 动态分析告一段落。

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

执行痕迹追踪

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

在模拟普通用户运行后, 的确有一个PS窗口弹出, 通过调试JS, 已知释放的PS脚本在Roaming目录下, 但运行后可能删除了自身,在该文件夹下无法找到任何文件。

通过检查MFT(主文件表, 里面包含所有文件的元数据,路径为:C:$MFT) 可以证明js确实存在, 为了解析$MFT文件,将其保存为CSV格式文件, 这个可以使用MFTCmd.exe和TimelineExplorer(下载地址:https://ericzimmerman.github.io/#!index.md)组合打开解析后的CSV文件:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

PS脚本在执行后会删除自身,因此在$MFT中看不到它,与文件删除一样,$MFT中的EntryNumber被标记为未分配,并且很快被覆盖,但还有另一个名为$UsnJrnl的表(记录系统上发生的所有更改;路径:C:$Extend$UsnJrnl)。它有两个备用数据流:$Max(更改日志)和$J(更改日志的内容,其中保存了对文件的每个操作)。此外,NTFS以UTC格式存储时间值,因此它们不受时区更改的影响;我的沙箱上的本地时间是UTC+2(15:36),因此在$MFT中是-2小时的时间(13:26)。下面是来自$J表的PS脚本的创建和删除条目,证明了其过去确实存在过;此外,在调试过程中,脚本的名称与之前不同,这表明每次执行JS时脚本名称都是随机的。

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

下载的s3pch1.zip 表现出类似的行为,但在以那个名称下载之前,会创建一个 .tmp 文件,然后将其重命名为脚本中指定的名称。这意味着重命名也可以通过使用 $J 并通过指定文件的 EntryNumber 进行过滤来证明。在需要确认已被重命名的可疑文件存在的情况下,这非常有用,因为 $MFT 表只包含当前的文件名:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

MsEdgeSandbox 文件夹的存在也可以在 $MFT/$J 表中进行验证;以下是证明它已被创建为隐藏目录的证据:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

$J 表不会显示完整路径,但可以与 $J(在此情况下为83495)中的 ParentEntryNumber 和 $MFT 中的 EntryNumber 进行相关性检查;$MFT表中的 EntryNumber 83495 指向 Roaming 文件夹,这也证明了PS脚本、s3pch1.zip和MsEdgeSandbox 文件夹是在那里创建的:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

在收集了所有名称之后,可以过滤 $J 表来搜索它们(legit.js 也从 mal.js 重命名过来,EntryNumber 是相同的):

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

所有恶意文件的存在已通过 $MFT 和 $J 表得到证实。

所有文件的执行证据都可以在Prefetch文件夹中找到(它包含加速应用程序加载时间所需的数据, 路径:C:WindowsPrefetch)。创建时间是应用程序首次执行的时间,修改时间是应用程序的上次执行时间加上 10 秒 — 在这 10 秒内,Prefetch文件将记录可执行文件与之交互的所有文件和目录。Prefetch还包含最后 8 次运行时间,其中第 8 次是修改时间。如果这是一个应用程序,那么修改时间将指示上次执行时间 — 但对于使用特定应用程序打开的文件则不然。恶意脚本执行后还执行了 Powershell — 这就是修改时间与 wscript.exe 不同的原因,这意味着 Powershell/另一个脚本的执行,而不是这个特定的恶意脚本。如下所示,两个应用程序在某个时间点打开了恶意脚本,其中 Powershell 还与 s3pch1.zip(通过脚本下载)和 client32.exe(通过脚本执行)进行了交互;至于 client32.exe,它是一个应用程序,因此修改时间表示执行时间 +10 秒(所有时间均为 UTC+2):

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

在禁用Prefetch的情况下(可以通过更改注册表键的值来实现:SYSTEM(HKLM)/CurrentControlSet/Control/SessionManager/MemoryManagement/PrefetchParameters/EnablePrefetcher 设置为 0),执行也可以在名为 RecentDocs 的注册表键中进行验证(最近访问的文件,UTC;路径:NTUSER.DAT(HKCU)SoftwareMicrosoftWindowsCurrentVersionExplorerRecentDocs*extension*):

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

证明PowerShell脚本执行的最直接证据可在Windows日志中找到(C:WindowsSystem32winevtLogsMicrosoft-Windows-PowerShell/Operational.evtx):

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

对于 wscript.exe(JS)、powershell.exe 和 client32.exe, 安全日志也可以通过进程创建事件来证明执行,事件ID为4688:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

网络流量

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

在执行JS后,网络流量将如下所示:

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

首先连接到 tukudewe.com 获取 zip 文件,然后直接连接到 jokosampbulid (C2),并在 client32.exe 执行后进行地理位置检查(UTC 时间)

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

持久性痕迹

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

脚本还通过在注册表中创建自动启动项添加了一些持久性。持久性知名位置之一当然是Run键。有两个Run键:NTUSER.DAT(HKCU)SoftwareMicrosoftWindowsCurrentVersionRun(此键中的值在特定用户登录后运行)和SOFTWARE(HKLM)MicrosoftWindowsCurrentVersionRun(此键中的值在任何用户登录后运行)。在已知持久性的情况下(如本例),更容易删除,但如果位置未知,则始终可以通过解析注册表来查找异常条目。一个能够做到这一点的工具是 RegRipper(下载地址:https://github.com/keydet89/RegRipper3.0):

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

至此, 所有恶意文件的执行已通过Prefetch、RecentDocs 键和日志证明;网络连接通过捕获流量证明,持久性通过注册表解析器证明。

追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试
追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

点个在看你最好看

原文始发于微信公众号(二进制空间安全):追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月31日19:58:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   追踪迷雾后的真相-被混淆的JavaScript脚本可以这样调试http://cn-sec.com/archives/2615284.html

发表评论

匿名网友 填写信息