数字取证与事件响应:深入分析Zeta End攻击链中的恶意载荷与C2通信

2 阅读15分钟

[Blue Team Labs Online Write-up] Zeta End (Filefix, rclone, sliver and github attachment file host)

Chicken0248 Follow 15 min read · Dec 2, 2025

8 Listen

Share

事态已经升级! 作为 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 对象和密钥,然后使用组织网站的密钥 Web 门户请求 OAuth 令牌并访问 Azure blob 中的多个敏感对象,最后将网站篡改为恶意的 filefix 托管页面。

环境感知

证据与工具发现

在此次调查中,我们将拥有属于 Zeta-9 研究员弗兰肯斯坦·代码博士工作站的分类证据。

有趣的是,此工作站还安装了 Wing FTP Server,这立刻让我联想到了 CVE-2025–47812,这是一个 Wing FTP Server 的 RCE 漏洞。但我们已经知道,弗兰肯斯坦·代码博士可能已经中了从 Rotten Cloud 调查中发现的 ClickFix 攻击,所以这可能是一个误导项。

此工作站上还有海伦娜博士的账户,但我们的主要关注点是弗兰肯斯坦·代码博士。

现在,我将使用 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

命令:

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 对 base64 大对象进行解码和 gunzip 解压缩,结果显示出另一个 PowerShell 脚本,其中在 $ETPvFICDa 变量中还包含另一个 base64 大对象。为了获得解密的脚本,这次我们需要先反转它,然后再进行 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 的执行策略。这个修改具体是什么时候进行的?

我们可以使用 Registry Explorer 查看弗兰肯斯坦博士的 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:Port)?

有两种方法可以找到答案。第一种是运行这个恶意程序,同时让 Process Monitoring 捕获其网络连接,结果是连接到 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 的 WebCache,我们可以看到它缓存了请求下载 CUREKiller.zip 文件的 HTTP 请求。但是我们如何获得此文件的哈希值呢?

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

b289a7f5fd8bcb22e5452d4fe3e57174

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

从预读取文件时间线中,我们可以看到被认为是用于窃取的可执行文件 KillTheCure.exe2025-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 地址是什么?

因此,假设威胁行为者使用相同的技巧来托管此 zip 文件,我们如何获得 "unique_id"?这比预期的要简单。它就在添加参数 ? 符号之前的 URL 末尾。

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

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

36.157.123.216

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

正如已经确定的,在窃取可执行文件执行期间,Desktop 文件夹中有 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 字节块:
    key_u32 = key  # 4 字节小端序
    block12 = key_u32 + struct.pack("<I", original_size) + b'\x00\x00\x00\x00'[:0]  # 确保布局为 12 字节
    # C 代码写入了:4 字节 CRC,8 字节密钥字段,4 字节大小 -> 所以 CRC 使用的 12 字节是该区域的低 12 字节。
    # 构建代码可能 CRC 的内容:4 字节密钥 + 4 字节零?+ 4 字节大小,因编译而异。
    # 为了与生成者兼容,按照 C 代码的做法重建:对从 8 字节密钥字段(小端序)开始的 12 字节区域进行 CRC 计算
    # 构建 12 字节为:低 4 字节 = 密钥,接下来 4 字节 = 0(Q 的高位),接下来 4 字节 = 大小
    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 不匹配(有效载荷完整性检查失败)。")
    # 仍然尝试提取,也许生成者的确切 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 上获得了首杀!一个供网络防御者测试和提升技能的游戏化平台… blueteamlabs.online

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