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 安全评估实验室 ![Active Directory](https://img.shields.io/badge/Active%20Directory-003366?style=flat&logo=windows&logoColor=white) ![PingCastle](https://img.shields.io/badge/PingCastle-Assessment-orange?style=flat) ![Kali Linux](https://img.shields.io/badge/Kali%20Linux-Attack%20Simulation-557C94?style=flat&logo=kalilinux&logoColor=white) ![MITRE ATT&CK](https://img.shields.io/badge/MITRE%20ATT%26CK-Mapped-red?style=flat) ![Status](https://img.shields.io/badge/Status-Complete-brightgreen?style=flat) ## 概述 在 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 |
📸 Environment Screenshots
## PingCastle 评估 — 修复前 初始扫描得分为 **100/100** —— 最差的评级。 | 类别 | 评分 | |---|---| | 过时对象 | 45 / 100 | | 特权账号 | 100 / 100 | | 信任 | 0 / 100 | | 异常 | 42 / 100 | | **总体** | **100 / 100** | 所有类别共触发了 37 条规则。
📸 PingCastle Before Screenshots
## 攻击模拟 ### 域枚举 通过 CrackMapExec 和 Impacket 以 `labadmin` 身份进行认证,枚举了整个域 —— 2,500 个用户、500 个组以及通过 SMB 和 LDAP 暴露的所有相关元数据。
📸 Enumeration Screenshots
### 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 ``` 这证明了任何经过认证的域用户都可以请求可离线破解的服务票据 —— 没有锁定、没有检测、没有速率限制。
📸 Kerberoasting Screenshots
### AS-REP Roasting 从禁用了 Kerberos 预身份验证的 **183 个账号** 中提取了身份验证哈希 —— **无需提供任何凭据**。 ``` impacket-GetNPUsers badblood.local/ -dc-ip -usersfile users.txt -no-pass -format hashcat -outputfile asrep_hashes.txt ``` 在未经身份验证的情况下提取了 183 个哈希值。虽然实验室随机生成的密码抵挡住了 rockyou 字典,但在生产环境中,薄弱或重复使用的密码将在几分钟内被破解。无论破解是否成功,其漏洞本身 —— 将可破解的材料交给未经身份验证的攻击者 —— 才是关键的发现。
📸 AS-REP Roasting Screenshots
### 关键发现:AD 描述中的明文密码 在 SMB 枚举期间,发现账号 `RICKEY_MOSES` 在 Active Directory 描述字段中以明文形式存储了密码: 默认情况下,任何经过身份验证的域用户都可以通过 LDAP 读取描述字段。这是一个常见的现实世界发现,PingCastle 无法检测到 —— 总共有 **28 个账号** 在描述字段中存储了凭据。
📸 Credential Discovery Screenshot
## 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 个非活动账号
📸 Remediation Screenshots
## 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 分 |
📸 PingCastle After Screenshots
## 结果总结 | 指标 | 修复前 | 修复后 | |---|---|---| | 可 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 租户执行,与生产系统没有任何连接。
标签: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, 凭据发现, 反取证, 域控制器, 安全加固, 安全基线, 安全实验, 安全评估, 实验报告, 攻击模拟, 教学环境, 数据展示, 数据集, 无线安全, 漏洞修复, 红队, 网络安全, 网络安全培训, 隐私保护, 靶场, 驱动签名利用