Holmes CTF 2025 取证与恶意软件分析实战教学文档
1. 赛事背景与题目概览
Holmes CTF 2025 是一场以数字取证和恶意软件分析为核心的技术竞赛。题目围绕虚构的 Cogwork-1 网络事件展开,参赛者需通过分析日志文件、网络流量、内存镜像、磁盘镜像等数字证据,还原攻击链并回答关键问题。
题目主要分为四大板块:
- The Card:Web 日志分析与威胁狩猎
- The Payload:恶意二进制文件逆向工程
- The Tunnel Without Walls:Linux 内存取证
- The Enduring Echo:Windows 事件日志与系统取证
- The Watchman's Residue:网络流量分析与密码破解
2. The Card 部分:Web 日志分析与威胁狩猎
2.1 题目1:首次访问的 User-Agent
目标:确定攻击者首次访问蜜罐使用的 User-Agent
分析方法:
- 打开
access.log,按时间排序(最早记录优先)。 - 第一行记录为
2025-05-01 08:23:12,对应的 User-Agent 为Lilnunc/4A4D。
答案:Lilnunc/4A4D
2.2 题目2:Web Shell 文件名
目标:找到攻击者部署的 Web Shell 文件名
分析方法:
- 在
access.log中搜索system($_GET["cmd"])(Web Shell 常见特征)。 - 发现记录:
echo "<?php system($_GET[\"cmd\"]); ?>" > /var/www/html/uploads/temp_4A4D.php。
答案:temp_4A4D.php
2.3 题目3:被窃取的数据库名称
目标:找到被窃取的数据库文件名
分析方法:
- 在
access.log末尾附近搜索database_dump或.sql。 - 发现记录:
database_dump_4A4D.sql。
答案:database_dump_4A4D.sql
2.4 题目4:重复出现的无意义字符串
目标:识别攻击活动中反复出现的字符串
分析方法:
- 在多个上下文中出现同一字符串:
- User-Agent:
Lilnunc/4A4D - Web Shell:
temp_4A4D.php - 数据库文件:
database_dump_4A4D.sql - Beacon ID:
id=4A4D - 工具标识:
4A4D RetrieveR/1.0.0
答案:4A4D
- User-Agent:
2.5 题目5:蜜罐相关活动数量
目标:在 CTI 平台中统计与蜜罐相关的活动数量
分析方法:
- 访问提供的 IP:端口(CTI 平台)。
- 使用筛选功能,过滤出与“蜜罐”(Honeypot)相关的记录。
- 统计结果为 5 条。
答案:5
2.6 题目6:攻击组织 JM 的节点数量
目标:统计与攻击组织 JM 相关的恶意软件和工具节点数量
分析方法:
- 在 CTI 平台中,恶意软件节点标识为“细菌图标”,工具节点标识为“扳手图标”。
- 统计两者之和为 9。
答案:9
2.7 题目7:恶意软件 SHA-256 哈希值
目标:找到攻击者使用的恶意软件的 SHA-256 哈希
分析方法:
- 在 CTI 平台中点击任意 JM 节点。
- 查看关联的“警告灯”节点,其中包含哈希值。
答案:(具体哈希值需根据实际数据填写,格式为 64 位十六进制字符串)
2.8 题目8:恶意 IP 地址
目标:通过哈希值在第二个平台中搜索恶意 IP
分析方法:
- 使用给定账号登录第二个平台。
- 将题目7的哈希值输入搜索框。
- 结果中显示的 IP 为
74.77.74.77。
答案:74.77.74.77
2.9 题目9:恶意文件完整路径
目标:找到恶意文件在系统中的完整路径
分析方法:
- 在第二个平台中查看该恶意文件的详细信息(Detail 页面)。
- 路径通常为
C:\Users\Public\Documents\malware.exe(具体路径依实际数据而定)。
答案:(具体路径需根据实际数据填写)
2.10 题目10:恶意服务器开放端口数量
目标:在第三个平台(CogNet 扫描平台)中查找恶意 IP 的开放端口
分析方法:
- 在第三个平台中搜索 IP
74.77.74.77。 - 发现开放端口:22, 25, 53, 80, 110, 143, 443, 3389, 7477, 8080, 8443。
- 总数为 11。
答案:11
2.11 题目11:服务器防护软件
目标:识别服务器上运行的防护软件
分析方法:
- 在第三个平台的 Detail 页面中查看软件信息。
- 答案为
SenseShield MSP。
答案:SenseShield MSP
2.12 题目12:神秘横幅信息
目标:从开放端口的横幅中提取神秘信息
分析方法:
- 在端口扫描结果中,查找未知(unknown)端口的横幅信息。
- 发现信息:
The Payload。
答案:The Payload
3. The Payload 部分:恶意二进制逆向工程
3.1 题目1:COM 初始化 DLL
目标:识别负责初始化 COM 库的 DLL
知识点:Windows COM 功能由 ole32.dll 提供,包含 CoInitialize 等函数。
答案:ole32.dll
3.2 题目2:实例化 COM 对象的 GUID
目标:找到二进制文件中用于实例化 COM 对象的 GUID
分析方法:
- 使用 IDA 反编译附件中的二进制文件。
- 在伪代码中查找
CoCreateInstance调用。 - 第一个参数为
&GUID_dabcd999_1234_4567_89ab_1234567890ff。
答案:DABCD999-1234-4567-89AB-1234567890FF
3.3 题目3:.NET 与原生代码桥接技术
目标:识别用于托管-非托管代码调用的 .NET 功能
知识点:.NET 中通过 P/Invoke(Platform Invoke)机制调用原生 API。
答案:P/Invoke
3.4 题目4:调用托管函数的操作码
目标:找到反汇编中调用托管函数的操作码
知识点:在 .NET IL 中,实例方法调用使用 callvirt 操作码。
答案:callvirt
3.5 题目5:密钥生成算法的常数
目标:找到密钥生成算法中的乘法和加法常数
分析方法:
- 反编译代码,找到密钥生成逻辑。
- 发现算法:
buf[i] = 7 * i + 66。 - 乘法常数:
7,加法常数:66(十六进制0x42)。
答案:乘法7,加法0x42
3.6 题目6:执行 Shellcode 的操作码
目标:识别执行 Shellcode 的机器指令操作码
分析方法:
- 在
ScanAndSpread函数中查找call rax或类似指令。 - 对应机器码为
FF D0。
答案:FF D0
3.7 题目7:解析域名的 Win32 API
目标:找到用于解析 killswitch 域名的 Win32 API
分析方法:
- 在代码中查找域名解析相关调用。
- 发现
getaddrinfo函数。
答案:getaddrinfo
3.8 题目8:枚举 SMB 共享的 API
目标:找到用于枚举 SMB 共享的 Win32 API
知识点:NetShareEnum 是 Windows 中枚举网络共享的标准 API。
答案:NetShareEnum
3.9 题目9:执行 Shellcode 的操作码(地址指定)
目标:在指定地址找到执行 Shellcode 的操作码
分析方法:
- 在地址
00000001400023E4处查看反汇编。 - 指令为
call rax,操作码FF D0。
答案:FF D0
3.10 题目10:Killswitch 域名与 Flag
目标:通过解密算法找到 killswitch 域名并获取 Flag
分析方法:
- 分析加密逻辑(XOR + Base64)。
- 编写脚本爆破 XOR 密钥。
- 解密后得到域名,最终 Flag 为:
HTB{Eternal_Companions_Reunited_Again}
4. The Tunnel Without Walls:Linux 内存取证
4.1 题目1:内核版本
目标:从内存镜像中提取 Linux 内核版本
分析方法:
- 使用 Volatility 分析内存镜像。
- 运行命令:
volatility -f memory.img linux.banner。 - 得到版本:
5.10.0-35-amd64。
答案:5.10.0-35-amd64
5. The Enduring Echo:Windows 事件日志与系统取证
5.1 题目1:攻击者用户名
目标:从安全事件日志中识别攻击者用户名
分析方法:
- 分析
Security.evtx,查找可疑登录或进程创建事件。 - 发现用户
Werni。
答案:Werni
5.2 题目2:攻击者执行的首条命令
目标:找到攻击者执行的第一条非 cd 命令
分析方法:
- 查看
ConsoleHost_history.txt(PowerShell 历史)。 - 第一条命令为
systeminfo。
答案:systeminfo
5.3 题目3:横向移动工具
目标:识别用于横向移动的工具
知识点:wmiexec.py 是常用的 WMI 远程执行工具,用于横向移动。
答案:wmiexec.py
5.4 题目4:攻击者 IP
目标:找到攻击者的源 IP
分析方法:
- 在事件日志中查找远程登录事件(事件 ID 4624)。
- 发现 IP
10.129.242.110。
答案:10.129.242.110
5.5 题目5:伪装成的进程名
目标:找到攻击者伪装的进程名
分析方法:
- 在日志中查找可疑进程创建事件。
- 发现进程名
SysHelper Update。
答案:SysHelper Update
5.6 题目6:持久化脚本路径
目标:找到持久化脚本的完整路径
分析方法:
- 在
C:\Users\Werni\AppData\Local发现JM.ps1。 - 日志证实该脚本被执行。
答案:C:\Users\Werni\AppData\Local\JM.ps1
5.7 题目7:被创建并使用的用户名
目标:识别被创建且用于登录的用户名
分析方法:
- 在
JM.ps1中发现创建的用户:svc_netupd,svc_dns,sys_helper,WinTelemetry,UpdaterSvc。 - 在日志中只有
svc_netupd有登录记录。
答案:svc_netupd
5.8 题目8:C2 域名
目标:找到 C2 服务器域名
分析方法:
- 在
JM.ps1中发现域名NapoleonsBlackPearl.htb。
答案:NapoleonsBlackPearl.htb
5.9 题目9:密码
目标:找到攻击者使用的密码
分析方法:
- 在
JM.ps1中发现密码生成规则:Watson_时间戳。 - 爆破时间戳后得到:
Watson_20250824160509。
答案:Watson_20250824160509
5.10 题目10:内部系统 IP
目标:找到攻击者转向的内部系统 IP
分析方法:
- 查看
C:\Users\Administrator\.ssh\known_hosts。 - 发现 IP
192.168.1.101。
答案:192.168.1.101
5.11 题目11:被转发的端口
目标:找到被转发以启用转向的本地端口
分析方法:
- 在事件日志中查找
netsh命令。 - 发现端口转发规则:
0.0.0.0:9999 -> 192.168.1.101:22。 - 本地端口为
9999。
答案:9999
5.12 题目12:端口转发注册表路径
目标:找到存储端口转发规则的注册表路径
知识点:netsh portproxy 规则存储在:
HKLM\SYSTEM\CurrentControlSet\Services\PortProxy\v4tov4\tcp
答案:HKLM\SYSTEM\CurrentControlSet\Services\PortProxy\v4tov4\tcp
5.13 题目13:MITRE ATT&CK 技术
目标:识别端口转发对应的 MITRE ATT&CK 技术
知识点:端口转发属于 Internal Proxy(T1090.001)。
答案:T1090.001
5.14 题目14:启用命令行日志记录的命令
目标:找到启用命令行日志记录的命令
分析方法:
- 查看管理员 PowerShell 历史。
- 发现命令:
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit" /v ProcessCreationIncludeCmdLine_Enabled /t REG_DWORD /d 1 /f
答案:reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit" /v ProcessCreationIncludeCmdLine_Enabled /t REG_DWORD /d 1 /f
6. The Watchman's Residue:网络流量分析与密码破解
6.1 题目1:攻击者 IP
目标:找到攻击者使用的已退役机器 IP
分析方法:
- 分析
msp-helpdesk-ai-day-5982-section-5-traffic.pcapng。 - 搜索关键词
password,追踪 TCP 流。 - 发现 IP
10.0.69.45。
答案:10.0.69.45
6.2 题目2:第一条消息
目标:找到攻击者发送的第一条消息
分析方法:
- 过滤 IP
10.0.69.45的 HTTP 请求。 - 第一条消息为
Hello Old Friend。
答案:Hello Old Friend
6.3 题目3:提示注入时间
目标:找到提示注入导致信息泄露的时间
分析方法:
- 查找包含敏感信息(如 TeamViewer 凭证)的 HTTP 响应。
- 时间点为
2025-08-19 12:02:06。
答案:2025-08-19 12:02:06
6.4 题目4:TeamViewer 凭证
目标:找到泄露的 TeamViewer 设备 ID 和密码
分析方法:
- 在流量包中搜索
password或TeamViewer。 - 发现凭证:
565963039:CogWork_Central_97&65。
答案:565963039:CogWork_Central_97&65
6.5 题目5:最后一条消息
目标:找到攻击者发送的最后一条消息
分析方法:
- 过滤攻击者 IP 的 HTTP 请求,按时间排序。
- 最后一条消息为
JM WILL BE BACK。
答案:JM WILL BE BACK
6.6 题目6:远程访问时间
目标:找到攻击者远程访问的时间
分析方法:
- 查看
Connections_incoming.log(TeamViewer 日志)。 - 找到连接记录:
2025-08-20 10:14:27。
答案:2025-08-20 10:14:27
6.7 题目7:RMM 账户名
目标:找到攻击者使用的 RMM 账户名
分析方法:
- 在
Connections_incoming.log中查看账户名。 - 发现
James Moriarty。
答案:James Moriarty
6.8 题目8:攻击者内部 IP
目标:找到攻击者连接时使用的内部 IP
分析方法:
- 在 TeamViewer 日志中查找 UDP 穿透记录。
- 发现 IP
192.168.69.213。
答案:192.168.69.213
6.9 题目9:会话结束时间
目标:找到恶意 RMM 会话结束的时间
分析方法:
- 在
Connections_incoming.log中查找会话结束记录。 - 时间为
2025-08-20 11:14:27(注意时区差异)。
答案:2025-08-20 11:14:27
6.10 题目10:Heisen-9-WS-6 凭证
目标:从 KeePass 数据库中提取凭证
分析方法:
- 使用 Hashcat 爆破
critical.kdbx的密码(密码为cutiepie14)。 - 打开数据库,找到凭证
Werni:Quantum1!。
答案:Werni:Quantum1!
7. 总结与核心知识点
7.1 核心技能
- 日志分析:Apache 访问日志、Windows 事件日志、PowerShell 历史、TeamViewer 日志。
- 网络取证:Wireshark 流量分析、HTTP 协议追踪、数据提取。
- 恶意软件分析:IDA 反编译、.NET 与原生代码交互、Shellcode 分析。
- 内存取证:Volatility 使用、Linux 内核信息提取。
- 密码破解:Hashcat 爆破 KeePass 数据库。
7.2 防御建议
- 启用命令行日志记录(注册表键
ProcessCreationIncludeCmdLine_Enabled)。 - 监控敏感注册表路径(如
PortProxy)。 - 检测异常 User-Agent 和 Web Shell 文件上传行为。
- 限制内部设备的出站连接(防止反向 Shell)。
- 使用强密码并定期更换,避免密码重用。
7.3 工具推荐
- 日志分析:Event Viewer, EvtxECmd, PowerShell
- 网络分析:Wireshark, tcpdump
- 逆向工程:IDA Pro, Ghidra, ILSpy
- 内存取证:Volatility 3, Rekall
- 密码破解:Hashcat, John the Ripper
注意:部分答案(如哈希值、具体路径)需根据实际题目数据填写。本文档基于通用方法论编写,实操时需灵活调整。