Zeta安全事件数字取证分析:从ClickFix初始入侵到Sliver C2与数据窃取的技术复盘

1 阅读16分钟

[Blue Team Labs Online Write-up] Zeta End (Filefix, rclone, sliver 和 github 附件文件托管)

Chicken0248 跟随 15 分钟阅读 · 2025年12月3日

9

收听

分享

(图片说明:点击或回车查看全尺寸图像)

事态升级了! 作为 Zeta-9 网络安全响应与事件安全调查服务 (CRISIS) 的一员,请继续你的调查。 已从 Zeta-9 秘密局域网内的一台机器获取了完整的分诊镜像。执行完整的 DFIR 分析以揭示威胁行为者的最终目标……

数字取证

标签: EZ-TOOLS, IDA, HxD, TimeLineExplorer

场景

事态已升级至临界点:解药——人类抵御疫情的最后屏障——已从 Zeta-9 的系统中被彻底清除,并同时泄露到了暗网上;部门负责人弗兰肯斯坦博士确认,任何研究人员的机器上都没有留下任何痕迹,这引发了人们的担忧,即这并非简单的盗窃,而是蓄意破坏。调查人员已经发现了攻击者的切入点:在入侵了一个受信任的云托管 Web 服务器后,他们篡改了秘密部门研究人员经常访问的一个网站。这一个立足点使他们能够感染秘密部门的局域网,从而获得了攻击 Zeta-9 核心所需的访问权限。你已被 Zeta-9 的网络安全响应与事件安全调查服务 (CRISIS) 聘用。你的任务是:追踪入侵过程,揭示攻击者窃取的内容,并确定公司最黑暗的秘密——也是人类最后的希望——是否已从他们的掌控中溜走。最紧迫的问题仍然是:解药是否已经无法挽回,还是你能迅速采取行动将其夺回,将 Zeta-9 从彻底崩溃的边缘拉回来?

警告: 本实验包含许多你需要在联网机器上访问的工件。

背景

Patient Z-ero 调查中,威胁行为者成功入侵了 FortiGate 防火墙,从而通过 VPN 获得了对内部网络的访问权限。 在 The Walking Packets 调查中,威胁行为者入侵了监控平台,并从监控视频记录中获得了 JUMPHOST 用户的凭证。 在 The Headless Dead 调查中,威胁行为者利用从监控平台获取的本地管理员凭证,并通过 VPN 访问内部网络,实施了基于 WMI 的横向移动至 JUMPHOST,并外泄了 AWS 密钥。 在 Rotten Cloud 调查中,威胁行为者使用 AWS 密钥访问了多个敏感的 S3 对象和密钥,然后利用组织网站的密钥门户请求 OAuth 令牌,并访问了 Azure blob 中的多个敏感对象,最后用恶意的 filefix 托管页面篡改了网站。

环境感知

证据与工具发现

(图片说明:点击或回车查看全尺寸图像)

在此次调查中,我们将获得属于 Zeta-9 研究员弗兰肯斯坦博士的工作站的分诊证据。

有趣的是,此工作站还安装了 Wing FTP Server,这让我立刻想到了 CVE-2025-47812,即 Wing FTP Server 的一个 RCE 漏洞。但正如我们从 Rotten Cloud 调查中得知的那样,弗兰肯斯坦博士很可能中了 ClickFix 攻击,所以这可能是个误导。

此工作站上还有 Helena 博士的账户,但我们的主要焦点将是弗兰肯斯坦博士。

现在,我将使用 EvtxECmd 解析 Windows 事件日志文件夹,使用 MFTECmd 解析 USN 日志和 MFT,最后使用 PECmd 解析预读取文件,为本次调查做好准备。

命令: EvtxECmd.exe -d "C:\Users\BTLOTest\Desktop\Artefacts\C\Windows\System32\winevt\logs" --csv . --csvf log_timeline.csv

命令: MFTECmd.exe -f C:\Users\BTLOTest\Desktop\Artefacts\C\$Extend\$J -m C:\Users\BTLOTest\Desktop\Artefact\C\$MFT --csv C:\Users\BTLOTest\Desktop

将 Chicken0248 的故事发送到你的收件箱 免费加入 Medium 以获取此作者的更新。 订阅

命令: PECmd.exe -d C:\Users\BTLOTest\Desktop\Artefacts\C\Windows\prefetch --csv c:\Users\BTLOTest\Desktop

调查

Q1) 调查人员发现弗兰肯斯坦博士访问了一个被入侵的 Zeta-9 网页,该网页提供了对秘密部门网络的初始访问。他是什么时候访问该页面的?

正如我们从 Rotten Cloud 调查中得知的,威胁行为者篡改了组织的网站 (zeta9-research-portal.azurewebsites.net/) 以托管恶意的 filefix 命令。我们需要查看弗兰肯斯坦博士访问该网站的浏览器历史记录。

(图片说明:点击或回车查看全尺寸图像)

我们可以看到,弗兰肯斯坦博士在 2025-09-27 11:17:33 访问了被篡改的网站,这应该设为我们事件时间线的起点,并关注此后发生的任何可疑事件。

答案:2025-09-27 11:17:33

Q2) 在查看共享的 Zeta-9 文档时,弗兰肯斯坦博士不知情地运行了通过该网站传递的有效载荷。他被诱骗执行的 PowerShell 脚本的名称是什么?

(图片说明:点击或回车查看全尺寸图像)

现在,我们应该回到组织网站的网页存档,并复制命令以揭示在被入侵的工作站上执行了什么。

(图片说明:点击或回车查看全尺寸图像)

我们可以看到,当此命令被输入到文件资源管理器地址栏时,将执行托管在提供的 Gist URL 上的 PowerShell 脚本。此执行导致威胁行为者获得了对工作站的初始访问权限。

答案:Microsoft.PowerShell.DataV4Adapter.ps1

Q3) 根据受害者被诱骗运行有效载荷的方式,识别攻击者使用的确切技术名称。

(图片说明:点击或回车查看全尺寸图像)

正如我们已经发现的,这里使用的技术是“filefix”,所以答案很简单。我也看到很多人误解这个问题为 MITRE ATT&CK 技术,但实际上就这么简单。

答案:filefix

Q4) 当弗兰肯斯坦博士被诱骗在其系统上运行恶意命令时,导致执行了 shellcode,从而使攻击者获得了对其机器的完全访问权限。此 shellcode 的 MD5 哈希值是多少?

(图片说明:点击或回车查看全尺寸图像)

现在我们来分析一下这个脚本。我们可以看到它有一个 $compressedBase64 变量,存储了一个 base64 字符串,该字符串将被解码和解压缩 (gunzip) 以获取另一个 PowerShell 脚本,并使用 Invoke-Expression 执行它。

(图片说明:点击或回车查看全尺寸图像)

我们可以使用 CyberChef 解码并 gunzip 该 base64 字符串,从而揭示另一个 PowerShell 脚本,其中包含另一个 base64 字符串(在 $ETPvFICD 变量中)。要获取解密的脚本,这次我们需要先反转它,然后再进行 base64 解码。

(图片说明:点击或回车查看全尺寸图像)

这应该是最终的脚本,它将从另一个 Gist URL 获取 shellcode,将其从十六进制转换为原始字节,解压缩 (gunzip),最后与 0xFF 进行 XOR 运算,得到最终准备注入和执行的 shellcode。

(图片说明:点击或回车查看全尺寸图像)

要获取此 shellcode 的 MD5,我们应该复制脚本中的步骤。但这里有个问题,创建者 A1l4m 要求我们在计算 MD5 哈希之前,将原始 shellcode 转换回十六进制并去除空白字符。我不太清楚原因,但我们照做就是了。

答案:d3cf756ebbdf7b015a2ee4e154b638ee

Q5) 由于 shellcode 运行,弗兰肯斯坦博士的机器连接到了一个命令与控制主机。请提供外部 IP 和端口。

(图片说明:点击或回车查看全尺寸图像)

有多种方法可以找到答案。第一种是在运行 shellcode 的同时运行 Process Monitor 来检测来自 powershell 进程的任何 IP 连接。第二种方法是在沙箱中触发 filefix 攻击,如这个 any.run 报告所示,powershell.exe 连接的 IP 和端口是 35.158.153.237:34651。

答案:35.158.153.237:34651

Q6) C2 连接成功后,攻击者运行了一个简单的命令来确认身份和环境。他们用了哪个命令来枚举机器?

(图片说明:点击或回车查看全尺寸图像)

我们可以查看预读取时间线,了解弗兰肯斯坦博士访问被篡改网站后发生了什么。我们可以看到 whoami.exe 随后被执行,接着是多次 rclone.exe 执行,以及公共用户主文件夹下的 runtimebroker.exe,这完全不是此可执行文件的标准位置。现在可以确认,在获得此工作站的访问权限后,威胁行为者首先执行了 whoami 以确认其在此主机上的身份,然后使用 rclone 从云传输工具。

答案:whoami

Q7) 获得访问权限后不久,入侵者更改了 PowerShell 的执行策略。该修改具体是什么时候进行的?

(图片说明:点击或回车查看全尺寸图像)

我们可以使用注册表浏览器查看弗兰肯斯坦博士的 NTUSER.dat 配置单元下的 ExecutionPolicy 注册表项。结果显示,在 2025-09-27 11:19:49,威胁行为者将此用户的执行策略更改为 Unrestricted,这将允许在该用户下的此工作站上运行任何脚本。

答案:2025-09-27 11:19:49

Q8) 为了在重启后持久运行,攻击者放置了一个辅助可执行文件。用于持久化的可执行文件的完整文件系统路径是什么?

正如我们已经发现的,RunTimeBroker.exe 在 rclone 和 PowerShell 之后被执行,并且我们也有这个文件来计算文件哈希。让我们获取其哈希并提交到 VirusTotal。

(图片说明:点击或回车查看全尺寸图像)

VirusTotal 显示此可执行文件是 sliver 木马。因此,威胁行为者放置二进制文件以维持持久性是有道理的,因为初始访问是通过 clickfix 获得的(严格来说,威胁行为者可以设置持久性来再次执行 filefix 有效载荷)。

答案:C:\Users\Public\RunTimeBroker.exe

Q9) 攻击者使用哪个工具获取了该持久化二进制文件?

(图片说明:点击或回车查看全尺寸图像)

现在,让我们通过 USN Journal 查找此文件的来源。正如我们已经发现的,它可能来自 rclone,USN Journal 证实了这一点,因为它最初是以 rclone 临时文件的名称创建的,随后被重命名为其原始名称 (sapi.cpl),然后又重命名为 RunTimeBroker.exe,最后移动到了 C:\Users\Public\

答案:rclone

Q10) 持久化机制实际是何时建立的(即,触发可执行文件的内容是何时写入的)?

(图片说明:点击或回车查看全尺寸图像)

这个问题相当棘手。从预读取文件中,我们可以看到 sliver 木马每次都在 PowerShell 之后执行,这让我相信它一定与 PowerShell 相关的持久化机制有关。

(图片说明:点击或回车查看全尺寸图像)

在查看 USN Journal 后,我们可以看到在事件时间范围内的 2025-09-27 11:35:08,PowerShell 配置文件被编辑了。这证实了威胁行为者编辑了 PowerShell 配置文件,使得每次加载 PowerShell 配置文件时(通常在 PowerShell 启动时)都会执行 sliver 木马。

答案:2025-09-27 11:35:08

Q11) 持久化二进制文件联系了哪个 C2 服务器(IP:端口)?

(图片说明:点击或回车查看全尺寸图像)

有两种方法可以找到答案。第一种是运行这个恶意文件,同时让 Process Monitor 捕获其网络连接,结果指向 63.178.44.21:8838。另一种方法是回到 VirusTotal,我们可以看到它联系了相同的 IP 地址和端口,这个端口完全不标准,因此很突出,是反向 shell 连接端口。

答案:63.178.44.21:8838

Q12) 识别恶意文件用于命令和控制通信的框架。

就是 Sliver。

答案:sliver

Q13) 确认持续访问后,入侵者毫无顾忌地在秘密部门网络中进行探索。他们下载了一个包含其外泄工具包的 ZIP 文件。提供该 ZIP 文件的 MD5 哈希值。

(图片说明:点击或回车查看全尺寸图像)

首先,我们必须确定 zip 文件是什么以及它是如何下载到此工作站的。使用 USN Journal,我们可以看到 CUREKiller.zip 是通过 certutil lolbin 下载的,并且其中包含 5 个文件。

(图片说明:点击或回车查看全尺寸图像)

遗憾的是,我们没有相关的 certutil 工件。因此,我们必须使用位于 C:\Users\Dr.FrankensteinCode\AppData\Local\Microsoft\Windows\WebCache 的 Web 缓存。我们可以看到它缓存了请求下载 CUREKiller.zip 文件的 HTTP 请求。但是我们如何获得此文件的哈希呢?

我们可以使用 x-ms-blob-content-md5 的值,该值用于在传输过程中验证 blob 的完整性。我们需要将其从 base64 转换回来,然后转换为十六进制,最终获得此文件的 MD5。

答案:b289a7f5fd8bcb22e5452d4fe3e57174

Q14) 最终,对手从侦察转向了数据窃取。用于外泄的可执行文件具体是在何时运行的?

(图片说明:点击或回车查看全尺寸图像)

从预读取时间线中,我们可以看到 KillTheCure.exe(被认为是用于外泄的可执行文件)在 2025-09-27 15:49:58 执行,随后是 sdelete 以安全删除此工作站上的 6 个不同文件。同时,我们可以看到 Exfiltrated_data.zip 是在 KillTheCure.exe 执行期间创建的。

(图片说明:点击或回车查看全尺寸图像)

观察到 SDelete.exeKillTheCURE.exe 执行后立即运行,删除了桌面上的 6 个文件,分别是: C:\Users\Dr.FrankensteinCode\Desktop\confidential.png C:\Users\Dr.FrankensteinCode\Desktop\CURE.txt C:\Users\Dr.FrankensteinCode\Desktop\gunman.png C:\Users\Dr.FrankensteinCode\Desktop\Helena.txt C:\Users\Dr.FrankensteinCode\Desktop\test.txt C:\Users\Dr.FrankensteinCode\Desktop\outbreak.png

所有这些文件都位于桌面上,这让我们相信外泄可执行文件只针对执行它的用户的桌面。

答案:2025-09-27 15:49:58

Q15) 用于外泄的远程主机的 IP 地址是什么?

(图片说明:点击或回车查看全尺寸图像)

我们需要获取 CUREKiller.zip 文件并对 KillTheCure.exe 二进制文件进行逆向工程。但是怎么做呢?SBT 有一篇有趣的文章可以提供帮助,该文章讨论了在 GitHub 的问题、拉取请求甚至评论中托管文件的替代方法,并为我们提供了一些可以尝试的 URL 方案。

(图片说明:点击或回车查看全尺寸图像)

假设威胁行为者使用了相同的技巧来托管此 zip 文件,那么我们如何获得“unique_id”呢?这比预期的要容易。它就在 URL 的末尾,在添加 ? 符号和参数之前。

这意味着我们现在可以从 https://github.com/user-attachments/files/22441452/CUREKiller.zip 下载 ZIP 文件,这里就是 USN Journal 中已经发现的 5 个文件。

(图片说明:点击或回车查看全尺寸图像)

我们现在可以用任何喜欢的工具反编译该可执行文件。可以看到,在执行时,它会搜索执行该文件的用户的“下载”和“桌面”文件夹中的 .png.jpg 文件,并将它们移动到临时文件夹,打包为 Exfiltrated_data.zip,然后将其嵌入到 BetterCallSaul.png 文件(我们在调查机器的“下载”文件夹中有这个文件)中,接着使用 sdelete 删除原始文件,之后它还会删除所有临时文件(不使用 sdelete)。最后,它通过 HTTP POST 请求将 BetterCallSaul.png 发送到 /upload 路径的 36.157.123.216

答案:36.157.123.216

Q16) 攻击者窃取并抹除了秘密部门网络中的关键文件。列出被窃取的文件并按字母顺序排序。

如前所述,在执行外泄可执行文件期间,桌面文件夹中有 6 个扩展名为 .png.txt 的文件,分别是 confidential.png, cure.txt, gunman.png, Helena.txt, outbreak.pngtest.txt

答案:confidential.png, cure.txt, gunman.png, Helena.txt, outbreak.png, test.txt

Q17) 当攻击者用于外泄的主要 C2 端点失败时,他们转向了不同的工具以继续进行外泄。使用了什么工具作为后备方案?

(图片说明:点击或回车查看全尺寸图像)

我们已经知道威胁行为者使用了 rclone 来投放 sliver C2,因此它也可以用作后备方案来同步/上传外泄的文件。调查机器中 Chrome 的浏览器历史记录也显示我们从 MEGA 下载了 BetterCallSaul.png

(图片说明:点击或回车查看全尺寸图像)

现在,我们只需要确认这一点。从 rclone 配置文件中获取 MEGA 凭证,但密码是加密的。我们需要解密它。由于 Rclone 是开源的,因此有多种工具可以解密 rclone 密文,包括这个。现在我已经获得了两个用户的明文密码。

(图片说明:点击或回车查看全尺寸图像)

我登录了每个 MEGA 账户。第一个账户没什么意思,但第二个账户证实了镜像文件也使用 rclone 克隆到了这里!

(图片说明:点击或回车查看全尺寸图像)

除此之外,我们还可以在这里看到 sliver 木马、netcat 二进制文件以及预期的 Wing FTP Server RCE 利用脚本。

答案:rclone

Q18) 为了使用该替代工具,攻击者需要云访问权限。他们将凭证存储在系统上。提供他们使用的该账户的电子邮件和密码。[无需暴力破解]

答案:00darksideofme00+2@gmail.com:Necrobyte001123!

Q19) 关键文件 ‘cure.txt’ 属于被清除的数据之一!恢复被认为是可能的——如果你能恢复它,请提交该文件的 MD5 哈希值。其他调查人员已使用上一个问题中的凭证登录了攻击者的云,并将外泄内容的副本存储在本地:C:\users\BTLOtest\Downloads

由于我们拥有外泄二进制文件和图像文件,我将使用以下由 ChatGPT 生成的脚本从图像中提取 zip 文件。

# extractor.py
# 需要: Pillow (PIL)
# 用法: python extractor.py hidden.png recovered.bin
import sys
from PIL import Image
import zlib
import struct

def read_rgba_bytes(png_path):
    img = Image.open(png_path)
    img = img.convert("RGBA")
    data = img.tobytes() # 行优先 RGBA
    return data

def extract(png_path, out_path):
    data = read_rgba_bytes(png_path)
    # C 代码直接将头部+有效载荷存储到 RGBA 字节中。
    # 因此 'data' 的前 16 个字节是头部。
    if len(data) < 16:
        raise ValueError("PNG 太小或不包含嵌入数据。")
    header = data[:16]
    crc32_field, key_field_lo, orig_size = struct.unpack("<I Q I", header)
    # key_field_lo 的低 4 字节包含 4 字节的密钥。
    key = struct.pack("<Q", key_field_lo)[:4] # 小端序的前 4 字节
    original_size = orig_size
    encrypted = data[16:16+original_size]
    if len(encrypted) < original_size:
        raise ValueError("PNG 不包含完整的有效载荷(被截断)。")
    # 验证 CRC32: C 函数使用了 crc32(0,..) 然后 crc32(prev, &v71, 12)
    # 这实际上是对从 v71 开始的 12 字节块(key + size)进行 CRC32 计算。
    # 重新创建 12 字节块:
    block12 = key + b'\x00\x00\x00\x00' + struct.pack("<I", original_size)
    check_crc = zlib.crc32(block12) & 0xFFFFFFFF
    if check_crc != crc32_field:
        print("警告: CRC 不匹配(有效载荷完整性检查失败)。")
    # 使用 4 字节密钥重复进行 XOR 解密
    key_bytes = key
    out = bytearray()
    for i, b in enumerate(encrypted):
        out.append(b ^ key_bytes[i % 4])
    with open(out_path, "wb") as f:
        f.write(out)
    print(f"已将 {len(out)} 字节写入 {out_path}")

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("用法: python extractor.py hidden.png recovered.bin")
        sys.exit(1)
    extract(sys.argv[1], sys.argv[2])

现在我们应该能够解压它,并最终获得 CURE.txt 文件的哈希值。

答案:d81c7ad96edfb8e183613f579f105578

Q20) 完成前面的步骤后,攻击者开始清理痕迹。对手删除了各种工件(工具、事件日志、注册表项)。包含初始访问命令的注册表项是何时被清除的?

我们知道威胁行为者使用 filefix 攻击引诱了弗兰肯斯坦博士,那么可能记录该命令的注册表项是 TypedPaths 注册表项。由于它已被清除,威胁行为者清除它的时间以及该项的最后写入时间戳揭示了清除发生的时间。

答案:2025-09-28 02:20:47

Q21) 最后,攻击者清除了 Windows 事件日志以掩盖其踪迹。清除了多少个日志文件?

(图片说明:点击或回车查看全尺寸图像)

最后,我们可以看到威胁行为者执行了 wevutil 来清除 5 个不同的日志。至此,所有问题都已解答。感谢阅读!

答案:5

在 Zeta End 上取得 FIRST-BLOOD! - Blue Team Labs Online 我刚在 Blue Team Labs Online 的 Zeta End 挑战中取得了 First-Blood!这是一个为网络防御者提供测试和… blueteamlabs.online

对于那些真正感兴趣的人,这里是本次事件的调查报告 -> chicken0248zeta9.notion.site/Zeta-9-Secu… CSD0tFqvECLokhw9aBeRqpNzLTXFlojmzFn6OlyTg9UXZ0dCc3IqMwPPOCk+emZ/oAuwo2O7jNMHv+zJ33baH8aQ+ivLF+CDSeSprl7jJFW7Dv0AQXifCEy09e8T4mdA+GAFE50D8NTzCRRiyWK6A9R86LNDCkLq3J39y8vAiRE0n5aaCrMdbXIJlvX+mDCd