|
背景
大约一周前,我发了一条非常棒的推文来取笑这篇博文。
2022 年 9 月 12 日,一位韩国用户向 VirusTotal 提交了以下加密货币主题的 CHM 文件。这让我很兴奋。ZScaler 在 4 月份的一次非常相似的活动中写了一篇文章。
技术分析
我们从编译的 HTML 帮助 (CHM) 文件开始,它本质上是一种在桌面上本地显示 HTML 的方式。由于 CHM 文件只是存档,因此可以使用 7-Zip 对它们进行反编译 (?),以便我们查看捆绑的内容。如果受害者打开 wallet.chm,他们将看到以下关于比特币的文章 (已翻译):
提取捆绑内容后,可以看到许多文件,最重要的是:page_1.html 和 src 目录。
上图中显示的内容实际上只是 page_1.html 的渲染版本,与任何其他 HTML 文件一样,它可以执行 JavaScript。在 page_1.html 的末尾,我们找到了一些打包的 JS:
这个特定的 JS 打包器已经在许多 NK 属性样本中被注意到,并且解包起来很简单。可以简单地打印解压后的结果,而不是返回解码后的函数。
美化后:
函数 jmpof09fds() 获取 CHM 文件在磁盘上的位置,为下一阶段的写入做准备。变量 jdeDc05a 只是一个 URL 编码脚本,解码后是反编译 wallet.chm 以将 hkcmds.exe 暴露到磁盘的快捷方式:
在图 4 中的 JS 之后,还有一些代码可以执行捆绑包中包含的文件 hkcmds.exe。
至此,我们完成了 CHM 文件,因为第二阶段的所有准备工作都已完成,现在可以继续分析 hkcmds.exe。
将二进制文件放入 DetectItEasy,结果表明它是一个没有加壳的 C/C++ 二进制文件。不需要额外的步骤,可以继续在 IDA 中进行分析。
IDA 帮助我们识别 WinMain,所以我们从那里开始。首先跳出的是一些被输入 sub_4018A0() 的混淆字符串。
检查二进制文件中的其余字符串,我们注意到有大量类似的混淆字符串。就像我们上面看到的一样,它们都是由 sub_4018A0 引用的。在快速调试过程中,可以看到 sub_4018A0 奇迹般地返回了一个正常的 WinAPI 函数调用!有趣的是,这些行之间有很多相似之处,这意味着它可能发生了一些简单的反混淆。
- MpdbmBmmpd
- HfuMbtuFssps
- Qspdftt43Ofyu
- Npevmf43Ofyu
- Npevmf43Gjstu
- Qspdftt43Gjstu
- DsfbufUppmifmq43Tobqtipu
- HfuQspdBeesftt
- GjoeGjstuGjmfB
- HfuFowjsponfouWbsjbcmfB
- HfuGjmfJogpsnbujpoCzIboemf
- MpbeMjcsbszB
- Qspdftt43OfyuX
- Qspdftt43GjstuX
- GsffMjcsbsz
- HfuDvssfouQspdftt
复制代码
为了好玩,我将一些字符串扔进谷歌并遇到了这个 ...... https://github.com/hackedteam/co ... /obfuscated_calls.h 和混淆函数调用的所有映射。像一个好的 APT 一样利用 Hacking Team 植入程序。
这是一个很棒的发现,因为 repo 包含我们要逆向的二进制文件的源代码!就函数混淆而言,它最终只是将所有字符移动 -1。假设我们正在逆向的二进制文件只是这个 repo 中的 RCS (远程控制系统) 是一个合理的假设,但存在一些不一致之处。
为了让这个过程更容易一些,我写了一个快速的反混淆脚本来修复 IDA 中的函数调用。
- import idc
- import idautils
- import idaapi
- def deobfuscate(obfuscated) -> str:
- return "".join([chr(ord(i)-1) for i in str(obfuscated)])
- def iterate_strings(start_addr, end_addr):
- for i in idautils.Strings():
- # Check if the string is within the specified range
- if i.ea >= start_addr and i.ea + i.length <= end_addr:
- # Get the string content
- print(f"String at {hex(i.ea)}: {deobfuscate(i)}")
- idaapi.patch_bytes(i.ea, bytes(deobfuscate(i), 'utf-8'))
- def main():
- start_addr = 0x00411A68 # Start address of obfuscation strings
- end_addr = 0x0041322E # End address of obfuscation strings
- iterate_strings(start_addr, end_addr)
- main()
复制代码
就相似性而言,WinMain 中传递给新线程的函数 sub_401260 与 HM_ClipBoard.h 中的 PollClipBoard 相似。考虑到反编译中的一些结构怪异,这两个具有非常相似的结构。使用 GetsClipboardData 的大循环,然后将其分批发送。
WinMain 在 Hacking Team 存储库中没有任何可比较的代码,因此我的假设是 hkcmds.exe 是经过修改或更新的版本。还有一些明显的不匹配,比如在 obfuscated_calls.h 中没有 CreateThread 条目,但在 hkcmds.exe 中使用了它。我将继续对该样本进行进一步分析,但有趣的是看到可能的国家行为者使用 Hacking Team 工具。
结论
将此恶意软件归因于 Lazarus 或其他朝鲜演员的理由相当充分。考虑到提交者的位置、文档的内容、使用 CHM 文件进行交付、利用泄漏的工具以及 Akamai 进行基础设施托管;所有这些都与之前关于 Lazarus 近期活动的报告一致。
IoCs
Hashes
wallet.chm | 96f144e71068bc98c5e73d396738d22a948d3a5e2d20ba618b5a0a758c0a7a89 | hkcmds.exe | 442769ddce07457c55fa2eb61b145f6ad91cc1155fc2124b275e0acaf4029e2c |
IPs
23[.]216[.]147[.]64
参考
- https://www.zscaler.com/blogs/security-research/naver-ending-game-lazarus-apt
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|