Elijah-Cyber-Projects/Badblood-AD-Lab
GitHub: Elijah-Cyber-Projects/Badblood-AD-Lab
一个基于 Azure 部署的 Active Directory 安全评估实验项目,通过 BadBlood 构建脆弱环境、模拟 Kerberoasting 等攻击并记录完整修复过程与 PingCastle 评分对比。
Stars: 0 | Forks: 0
# Active Directory 安全评估实验室





## 概述
在 Azure 托管的 Windows Server 域控制器上,使用 BadBlood 部署了一个故意存在漏洞的 Active Directory 环境。使用 PingCastle 对该环境进行评估,通过从 Kali Linux 发起的 Kerberoasting、AS-REP Roasting 和 LDAP 枚举验证了关键发现,随后修复了所有可利用的漏洞,并通过前后对比的 PingCastle 评分记录了可衡量的改进。
## 攻击链
```
[Kali Linux — Attacker VM]
│
├──▶ SMB/LDAP Enumeration (2,500 users, 500 groups exposed)
│
├──▶ Kerberoasting (51 service accounts targeted)
│ └── Cracked GABRIELLE_MEDINA in 5 seconds
│
├──▶ AS-REP Roasting (183 accounts — zero authentication required)
│ └── 183 hashes extracted without credentials
│
└──▶ Credential Discovery
└── RICKEY_MOSES — plaintext password in AD description field
[PingCastle Assessment]
│
├──▶ Baseline Score: 100/100 (maximum risk)
│
├──▶ Remediation: 9 rules resolved, all exploitable findings eliminated
│
└──▶ Post-Remediation: 37 → 31 rules, Stale Objects 45 → 20
```
## 使用的工具
| 工具 | 角色 |
|---|---|
| Windows Server 2022 (Azure VM) | 域控制器 — `badblood.local` |
| BadBlood | 注入 2,500 个易受攻击的用户、500 个组、配置不当的 ACL 和 SPN |
| PingCastle | AD 安全评估 — 前后评分对比 |
| Kali Linux (UTM) | 攻击模拟 — 枚举、Kerberoasting、AS-REP Roasting |
| Impacket | Kerberos 票据提取和 AD 枚举 |
| CrackMapExec | SMB/LDAP 域枚举 |
| Hashcat | 离线密码哈希破解 |
| PowerShell | 批量修复脚本 |
## 环境设置
### 基础设施
| 组件 | 详情 |
|---|---|
| 域控制器 | Azure VM (B2as),Windows Server 2022,`badblood.local` |
| 攻击机 | 运行在 UTM 上的 Kali Linux (M1 MacBook) |
| 网络访问 | NSG 规则限制为单一 IP — 端口 88、389、445、636、3389 |
### BadBlood 填充数据
| 对象类型 | 数量 |
|---|---|
| 用户 | 2,500 |
| 组 | 500 |
| 计算机 | 100 |
| 可 Kerberoast 的账号 | 51 |
| 可 AS-REP Roast 的账号 | 183 |
| 描述字段中的密码 | 28 |
## PingCastle 评估 — 修复前
初始扫描得分为 **100/100** —— 最差的评级。
| 类别 | 评分 |
|---|---|
| 过时对象 | 45 / 100 |
| 特权账号 | 100 / 100 |
| 信任 | 0 / 100 |
| 异常 | 42 / 100 |
| **总体** | **100 / 100** |
所有类别共触发了 37 条规则。
## 攻击模拟
### 域枚举
通过 CrackMapExec 和 Impacket 以 `labadmin` 身份进行认证,枚举了整个域 —— 2,500 个用户、500 个组以及通过 SMB 和 LDAP 暴露的所有相关元数据。
### Kerberoasting
从设置了 SPN 的所有 51 个账号中提取了 Kerberos 服务票据。使用 Hashcat 结合 rockyou 字典,在 **5 秒内** 破解了 `GABRIELE_MEDINA` 的密码 (`P@ssw0rd123`)。
```
impacket-GetUserSPNs -dc-ip badblood.local/labadmin:'' -request -outputfile kerberoast_hashes.txt
hashcat -m 13100 single_hash.txt /usr/share/wordlists/rockyou.txt
```
这证明了任何经过认证的域用户都可以请求可离线破解的服务票据 —— 没有锁定、没有检测、没有速率限制。
### AS-REP Roasting
从禁用了 Kerberos 预身份验证的 **183 个账号** 中提取了身份验证哈希 —— **无需提供任何凭据**。
```
impacket-GetNPUsers badblood.local/ -dc-ip -usersfile users.txt -no-pass -format hashcat -outputfile asrep_hashes.txt
```
在未经身份验证的情况下提取了 183 个哈希值。虽然实验室随机生成的密码抵挡住了 rockyou 字典,但在生产环境中,薄弱或重复使用的密码将在几分钟内被破解。无论破解是否成功,其漏洞本身 —— 将可破解的材料交给未经身份验证的攻击者 —— 才是关键的发现。
### 关键发现:AD 描述中的明文密码
在 SMB 枚举期间,发现账号 `RICKEY_MOSES` 在 Active Directory 描述字段中以明文形式存储了密码:
默认情况下,任何经过身份验证的域用户都可以通过 LDAP 读取描述字段。这是一个常见的现实世界发现,PingCastle 无法检测到 —— 总共有 **28 个账号** 在描述字段中存储了凭据。
## MITRE ATT&CK 映射
| 阶段 | 攻击 | 战术 | 技术 | ID |
|---|---|---|---|---|
| 侦察 | SMB/LDAP 枚举 | 侦察 | 账号发现:域账号 | T1087.002 |
| 侦察 | 组枚举 | 侦察 | 权限组发现 | T1069.002 |
| 凭据访问 | Kerberoasting | 凭据访问 | Kerberoasting | T1558.003 |
| 凭据访问 | AS-REP Roasting | 凭据访问 | AS-REP Roasting | T1558.004 |
| 凭据访问 | 描述中的密码 | 凭据访问 | 不安全的凭据:文件中的凭据 | T1552.001 |
| 凭据访问 | Hashcat 破解 | 凭据访问 | 暴力破解:密码破解 | T1110.002 |
## 修复措施
### 可 Kerberoast 的账号 (51 → 0)
通过 PowerShell 移除了所有用户分配的 SPN。只有内置的 `krbtgt` 账号按预期保留了其 SPN。
```
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName | ForEach-Object {
$user = $_
$user.ServicePrincipalName | ForEach-Object {
Set-ADUser $user -ServicePrincipalName @{Remove=$_}
}
}
```
### 可 AS-REP Roast 的账号 (183 → 0)
在所有账号上重新启用了 Kerberos 预身份验证。
```
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} | Set-ADAccountControl -DoesNotRequirePreAuth $false
```
### 描述字段中的密码 (28 → 0)
清除了所有包含凭据字符串的描述字段。
```
$descUsers = Get-ADUser -Filter * -Properties Description | Where-Object { $_.Description -match "password|pwd|pass" }
foreach ($user in $descUsers) {
Set-ADUser -Identity $user -Description " "
}
```
### Domain Admins 缩减 (6 → 1)
从 Domain Admins 中移除了 5 个 BadBlood 账号,仅保留 `labadmin`。
### 密码策略强化
| 设置 | 修复前 | 修复后 |
|---|---|---|
| MinPasswordLength | 7 | 14 |
| LockoutThreshold | 0 (无限) | 5 次尝试 |
| LockoutDuration | 00:10:00 | 00:30:00 |
### 额外强化
- 启用了 AD 回收站
- 将机器账号配额设置为 0
- 在 DC 上禁用了 Print Spooler
- 在所有 OU 上启用了删除保护
- 清空了 Schema Admins 组
- 将管理员账号标记为敏感(不可被委派)
- 禁用了 2,306 个非活动账号
## PingCastle 评估 — 修复后
| 类别 | 修复前 | 修复后 | 变化 |
|---|---|---|---|
| 过时对象 | 45 | 20 | 🟢 −25 |
| 特权账号 | 100 | 100 | 🔴 见下方说明 |
| 信任 | 0 | 0 | ✅ 正常 |
| 异常 | 42 | 52 | 🔴 实验室产物 |
| **触发的规则** | **37** | **31** | **🟢 −6 条规则** |
| **已解决的规则** | — | **9** | ✅ |
特权组类别仍为 100 分,原因是 `P-ControlPathIndirectEveryone`(3,968 个对象具有通过 Everyone/Authenticated Users 的间接控制路径)。调查确认这源于 BadBlood 深度嵌套的组结构 —— Protected Users 被嵌套在 4 个 BadBlood 分发组和管理组中,从而在整个域中创建了间接权限链。在生产环境中解决此问题,需要使用 BloodHound 进行阶段性的组成员资格审计,以可视化和拆除间接权限链。
### 持续存在发现中的关键改进
| 发现 | 修复前 | 修复后 |
|---|---|---|
| 不在 Protected Users 中的管理员 | 26 个账号 | 2 个账号 |
| 不使用 AES 的服务账号 | 61 个账号 | 11 个账号 |
| Domain Admins | 6 个账号 | 1 个账号 |
| 操作员组得分 | 30 分 | 10 分 |
## 结果总结
| 指标 | 修复前 | 修复后 |
|---|---|---|
| 可 Kerberoast 的账号 | 51 | 0 |
| 可 AS-REP Roast 的账号 | 183 | 0 |
| 描述中的密码 | 28 | 0 |
| Domain Admins | 6 | 1 |
| PingCastle 触发的规则 | 37 | 31 |
| PingCastle 解决的规则 | — | 9 |
| 过时对象得分 | 45 | 20 |
| 已禁用的非活动账号 | 0 | 2,306 |
| 密码破解 | — | 5 秒 |
| 未经认证提取的 AS-REP 哈希 | — | 183 |
## 故障排除与决策
**Kerberos 加密类型不匹配** —— 初次尝试 Kerberoasting 返回了空的哈希文件。DC 仅支持 AES 加密,而 Impacket 请求的格式为 `$krb5tgs$18$`(破解速度慢)。通过在 SPN 账号上启用 RC4 加密以生成可在几秒钟内破解的 `$krb5tgs$23$` 哈希值来解决。这记录了加密安全性与旧版兼容性之间的现实权衡。
**BloodHound 收集受阻** —— SharpHound 在 DC 上被 Microsoft Defender SmartScreen 阻止。由于 Kali VM 和 Azure 托管的 DC 之间的 DNS 解析限制,通过 bloodhound-python 进行的远程收集也失败了。在生产评估中,SharpHound 将在加入域的本地工作站上执行。
**PingCastle 评分上限** —— 尽管解决了 9 条规则并消除了所有可利用的凭据发现,但由于 3,968 个对象上的结构性 ACL 问题,总体得分仍为 100。调查了根本原因 —— BadBlood 将 Protected Users 嵌套在分发组和管理组中,创建了间接控制路径。这表明安全修复是一个迭代过程,结构性问题需要超出单一评估周期的持续努力。
## 经验教训
- Kerberoasting 和 AS-REP Roasting 是极其简单的攻击。提取可破解的哈希只需几秒钟,需要最少的工具,并且不会产生任何警报。防御手段不需要多复杂 —— 只需从用户账号中移除 SPN,并绝不禁用预身份验证。
- 最关键的发现(AD 描述中的 28 个明文密码)是最简单的漏洞,也是最容易修复的。PingCastle 甚至没有检测到它 —— 是在攻击阶段的手动枚举揭示了它。自动化工具并不能发现所有问题。
- 修复单个漏洞很简单。修复结构性问题(嵌套组的 ACL、间接控制路径)需要理解完整的权限链 —— 像 BloodHound 这样的工具正是为此而存在的,这也是快速修复与真正安全改进之间的区别所在。
## 免责声明
该实验室是在受控环境中出于教育目的构建的,使用 BadBlood 生成虚构的易受攻击 AD 对象。所有攻击模拟均针对隔离的 Azure 租户执行,与生产系统没有任何连接。
📸 Environment Screenshots
📸 PingCastle Before Screenshots
📸 Enumeration Screenshots
📸 Kerberoasting Screenshots
📸 AS-REP Roasting Screenshots
📸 Credential Discovery Screenshot
📸 Remediation Screenshots
📸 PingCastle After Screenshots
标签:Active Directory, AD安全, AI合规, AS-REP Roasting, Azure, BadBlood, Cloudflare, GitHub Advanced Security, Kerberoasting, LDAP枚举, MITRE ATT&CK, OPA, OpenCanary, PingCastle, Plaso, SamuraiWTF, SMB枚举, Web报告查看器, Windows Server, 凭据发现, 反取证, 域控制器, 安全加固, 安全基线, 安全实验, 安全评估, 实验报告, 攻击模拟, 教学环境, 数据展示, 数据集, 无线安全, 漏洞修复, 红队, 网络安全, 网络安全培训, 隐私保护, 靶场, 驱动签名利用