吉沃运营专员 发表于 2022-12-20 15:02:00

Lazarus 使用泄露的黑客团队工具

英文原文:https://alden.io/posts/lazarus-loves-crypto/
背景
大约一周前,我发了一条非常棒的推文来取笑这篇博文。



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/core-win32/blob/master/DynamiCall/obfuscated_calls.h 和混淆函数调用的所有映射。像一个好的 APT 一样利用 Hacking Team 植入程序。



这是一个很棒的发现,因为 repo 包含我们要逆向的二进制文件的源代码!就函数混淆而言,它最终只是将所有字符移动 -1。假设我们正在逆向的二进制文件只是这个 repo 中的 RCS (远程控制系统) 是一个合理的假设,但存在一些不一致之处。

为了让这个过程更容易一些,我写了一个快速的反混淆脚本来修复 IDA 中的函数调用。

import idc
import idautils
import idaapi

def deobfuscate(obfuscated) -> str:
    return "".join()

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.chm96f144e71068bc98c5e73d396738d22a948d3a5e2d20ba618b5a0a758c0a7a89
hkcmds.exe442769ddce07457c55fa2eb61b145f6ad91cc1155fc2124b275e0acaf4029e2c

IPs

23[.]216[.]147[.]64

参考

[*]https://www.zscaler.com/blogs/security-research/naver-ending-game-lazarus-apt

页: [1]
查看完整版本: Lazarus 使用泄露的黑客团队工具