环境感知与证据发现
在此次调查中,我们将分析Zeta-9研究员Dr. Frankenstein Code工作站的镜像证据。
有趣的是,该工作站还安装了Wing FTP Server,这立刻让我联想到CVE-2025-47812——Wing FTP Server的一个RCE漏洞。但鉴于我们从Rotten Cloud调查中已知Dr. Frankenstein Code可能中了ClickFix攻击,这或许是一个误导方向。
该工作站上还有Dr. Helena的账户,但我们的主要关注点将是Dr. Frankenstein Code。
现在,我将使用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) 调查人员发现Dr. Frankenstein访问了一个被入侵的Zeta-9网页,该网页提供了对Secret Division网络的初始访问。他是什么时候访问该页面的?
从Rotten Cloud调查中我们已经知道,攻击者篡改了组织网站(zeta9-research-portal.azurewebsites.net/)以托管恶意的file…. Frankenstein访问该站点的浏览器历史记录。
我们可以看到Dr. Frankenstein在 2025-09-27 11:17:33 访问了被篡改的网站,这应该作为我们事件时间线的起始点,并重点关注此后发生的任何可疑事件。
答案: 2025-09-27 11:17:33
Q2) 在查看共享的Zeta-9文档时,Frankenstein无意中运行了通过该站点传送的payload。他被诱骗执行的PowerShell脚本的名称是什么?
现在我们需要查看组织网站的网页存档,复制命令以揭示在工作站上执行了什么。
我们可以看到,当此命令被输入到文件资源管理器地址栏时,托管在提供的Gist URL上的PowerShell脚本即被执行。此次执行导致攻击者获得了工作站的初始访问权限。
答案: Microsoft.PowerShell.DataV4Adapter.ps1
Q3) 根据受害者被诱骗执行payload的方式,识别攻击者使用的确切技术名称。
正如我们已经发现的,这里使用的技术是"filefix"。
答案: filefix
Q4) 当Frankenstein被诱骗在其系统上运行恶意命令后,导致执行了shellcode,从而使攻击者获得了对他机器的完全访问权限。该shellcode的MD5哈希值是多少?
现在我们来分析这个脚本,可以看到它有一个$compressedBase64变量存储了base64数据块,该数据块将被解码并解压缩(gunzip)以获得另一个PowerShell脚本,然后使用Invoke-Expression执行它。
我们可以使用CyberChef解码并gunzip该base64数据块,这会显示出另一个PowerShell脚本,其中也包含另一个$ETPvFICDa变量中的base64数据块。要获得解密后的脚本,这次我们需要先反转它,然后再进行base64解码。
这应该是最终的脚本,它会从另一个Gist URL获取shellcode,将其从十六进制转换为原始字节,解压缩(gunzip),最后与0xFF进行XOR异或,得到最终的shellcode,准备注入并执行。
为了获得此shellcode的MD5,我们应该复现脚本中的步骤。但需要注意的是,作者A1l4m要求我们在计算MD5哈希之前,将原始shellcode转换回十六进制并移除空白字符。
答案: d3cf756ebbdf7b015a2ee4e154b638ee
Q5) 由于shellcode的运行,Frankenstein的机器回连到了一个命令与控制(C2)主机。提供其外部IP和端口。
有多种方法可以找到答案。第一种是运行shellcode,同时让Process Monitor捕获powershell进程的任何网络连接;第二种是在沙箱中复现filefix攻击。根据any.run报告,powershell.exe回连的IP和端口是 35.158.153.237:34651。
答案: 35.158.153.237:34651
Q6) C2连接成功后,攻击者运行了一个简单的命令来确认身份和环境。他们运行了哪个命令来枚举机器?
我们可以查看预读取文件时间线,了解Dr. Frankenstein访问被篡改网站后发生的情况。我们看到whoami.exe随后被执行,接着多次执行rclone.exe和位于公共用户主文件夹下的runtimebroker.exe——这根本不是该可执行文件的标准位置。现在可以确认,在获得此工作站的访问权限后,攻击者在使用rclone从云端传输工具之前,先执行了whoami以确认其在主机上的身份。
答案: whoami
Q7) 获得访问权限后不久,入侵者更改了PowerShell的执行策略。该修改具体是在何时进行的?
我们可以使用Registry Explorer查看Dr. Frankenstein的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 payload)。
答案: C:\Users\Public\RunTimeBroker.exe
Q9) 攻击者使用哪个工具检索了该持久化二进制文件?
现在让我们通过USN日志查找此文件的来源。正如我们已经发现的,它可能来自rclone。USN日志证实了这一点,因为它最初是以rclone临时文件的名称创建的,随后被重命名为其原始名称(sapi.cpl),接着又重命名为RunTimeBroker.exe,并最终移动到C:\Users\Public\。
答案: rclone
Q10) 持久化机制实际是在何时建立的(即触发可执行文件的内容是何时写入的)?
这个问题相当棘手。从预读取文件中,我们可以看到Sliver植入物每次都在PowerShell之后执行,这让我相信它必定与PowerShell的持久化有关。
在查看USN日志后,我们可以看到在事件时间范围内的 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
Q13) 一旦入侵者确认了持续的访问权限,他们便开始肆无忌惮地探索secret division的网络。他们下载了一个包含其外泄工具包的ZIP文件。提供该ZIP文件的MD5哈希值。
首先,我们需要确定ZIP文件是什么以及它是如何下载到此工作站的。使用USN日志,我们可以看到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) 最终, adversaries 从侦察转向了数据窃取。用于外泄的可执行文件具体是在何时运行的?
从预读取文件时间线中,我们看到被认为是用于外泄的可执行文件KillTheCure.exe在 2025-09-27 15:49:58 执行,随后是mysdelete,用于安全删除此工作站中的6个不同文件。
同时,我们可以看到Exfiltrated_data.zip是在KillTheCure.exe执行期间创建的。
观察到SDelete.exe在KillTheCURE.exe执行后立即执行,删除了桌面上的6个文件,分别是:
C:\Users\Dr.FrankensteinCode\Desktop\confidential.pngC:\Users\Dr.FrankensteinCode\Desktop\CURE.txtC:\Users\Dr.FrankensteinCode\Desktop\gunman.pngC:\Users\Dr.FrankensteinCode\Desktop\Helena.txtC:\Users\Dr.FrankensteinCode\Desktop\test.txtC:\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日志中已发现的5个文件。
我们可以使用任何喜欢的工具反编译该可执行文件。可以看到,在执行时,它会搜索执行该文件的用户的Downloads和Desktop文件夹中的.png和.jpg文件,将它们移动到临时文件夹,压缩为Exfiltrated_data.zip,然后嵌入到BetterCallSaul.png文件中(我们在调查机器的Downloads文件夹中有这个文件),接着使用sdelete删除原始文件,之后删除所有临时文件(不使用sdelete)。
最后,它会通过HTTP POST请求将BetterCallSaul.png发送到 36.157.123.216 的 /upload 路径。
答案: 36.157.123.216
Q16) 攻击者窃取并删除了Secret Division网络中的关键文件。按字母顺序列出被盗文件。
如前所述,在外泄可执行文件执行期间,Desktop文件夹中有6个.png或.txt文件,分别是:confidential.png, cure.txt, gunman.png, Helena.txt, outbreak.png 和 test.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
# Requires: Pillow (PIL)
# Usage: 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() # row-major RGBA
return data
def extract(png_path, out_path):
data = read_rgba_bytes(png_path)
if len(data) < 16:
raise ValueError("PNG too small or not containing embedded data.")
header = data[:16]
crc32_field, key_field_lo, orig_size = struct.unpack("<I Q I", header)
key = struct.pack("<Q", key_field_lo)[:4]
original_size = orig_size
encrypted = data[16:16+original_size]
if len(encrypted) < original_size:
raise ValueError("PNG does not contain full payload (truncated).")
block12 = key + b'\x00\x00\x00\x00' + struct.pack("<I", original_size)
check_crc = zlib.crc32(block12) & 0xFFFFFFFF
if check_crc != crc32_field:
print("Warning: CRC mismatch (payload integrity check failed).")
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"Wrote {len(out)} bytes to {out_path}")
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: python extractor.py hidden.png recovered.bin")
sys.exit(1)
extract(sys.argv[1], sys.argv[2])
现在我们可以解压它,最终获得CURE.txt文件的哈希值。
答案: d81c7ad96edfb8e183613f579f105578
Q20) 完成前面的步骤后,攻击者转而开始清除痕迹。adversaries 删除了各种工件(工具、事件日志、注册表项)。包含初始访问命令的注册表项是何时被清除的?
由于我们知道攻击者使用filefix攻击诱骗了Dr. Frankenstein,那么可能记录该命令的注册表项是TypedPaths。既然它已被清除,攻击者清除它的时间戳就是最后一次写入该项的时间。
答案: 2025-09-28 02:20:47
Q21) 最后,攻击者清除了Windows事件日志以掩盖其痕迹。有多少个日志文件被清除?
最后,我们可以看到攻击者执行了wevutil来清除5个不同的日志。
答案: 5
CSD0tFqvECLokhw9aBeRqpNzLTXFlojmzFn6OlyTg9UXZ0dCc3IqMwPPOCk+emZ/oAuwo2O7jNMHv+zJ33baH8aQ+ivLF+CDSeSprl7jJFW7Dv0AQXifCEy09e8T4mdA+GAFE50D8NTzCRRiyWK6A9R86LNDCkLq3J39y8vAiRE0n5aaCrMdbXIJlvX+mDCd