arkanzasfeziii/Sovereign
GitHub: arkanzasfeziii/Sovereign
一款针对 Windows 域环境的 Active Directory 进攻套件,通过 LDAP 枚举、凭据攻击、ACL 滥用与横向移动模块实现端到端的 AD 杀伤链模拟。
Stars: 0 | Forks: 0
# Sovereign — Windows 与 Active Directory 进攻套件
## 威胁模型
Active Directory 是每个 Windows 企业环境的单一信任点。单个受损的域凭据——即使是低权限用户——也是完整 AD 杀伤链的起点,最终会导致目录中的每个哈希值泄露。
Sovereign 模拟了攻击者以 `domain\lowpriv:password` 为起点,系统性地映射出 Active Directory 配置中暴露的每一条权限提升路径:
| 阶段 | 故障点 | 对手行动 |
|---|---|---|
| **Domain 枚举** | 任何经过身份验证的用户均可读取 LDAP —— 无读取限制 | 通过 LDAP 绑定转储所有用户、组、SPN、委派配置、信任关系和 ACL |
| **弱锁定策略** | 锁定阈值为 0 —— 账户锁定被禁用 | 在大规模执行凭据攻击前确认密码喷射的安全性 |
| **描述中的密码** | 服务台习惯在 LDAP description 属性中设置临时密码 | 遍历所有 300 多个用户对象提取 description 字段 —— 标记凭据模式 |
| **Kerberoasting** | 服务账户 (SPN) 使用弱密码;AS-REP 票据可离线检索 | 为所有 SPN 账户请求 TGS;导出 $krb5tgs$23$ 哈希用于离线破解 |
| **AS-REP Roasting** | 账户设置了 `DONT_REQ_PREAUTH` 标志 —— 预身份验证被禁用 | 无需密码请求 AS-REP;导出 $krb5asrep$23$ 哈希用于离线破解 |
| **DCSync** | 错误配置的 ACL 将 DS-Replication-Get-Changes-All 权限授予非 DC 账户 | 复制整个 NTDS —— 通过 DRSUAPI 转储所有域用户的 NTLM 哈希 |
| **ACL 滥用** | GenericAll、ForceChangePassword、WriteSPN、WriteDACL 权限被分配给了错误的主体 | 利用每一项:强制添加组成员身份、重置密码、创建定向 Kerberoast SPN、修改 DACL |
| **横向移动** | 在不知道明文密码的情况下重用 NTLM 哈希 | 通过 Impacket 进行 Pass-the-Hash;PSExec 风格的服务创建;以 SYSTEM 权限执行命令 |
**范围:** 针对 Windows 域环境的授权 Active Directory 渗透测试和红队演练。
## 存在原因
涉及 Windows 环境的每一次重大企业违规事件都遵循相同的模式。初始访问 → 域用户凭据 → AD 枚举 → 权限提升 → Domain Admin → DCSync → 组织中的每个密码哈希。
这条杀伤链的各个组件都已有充分记录。Sovereign 提供的是操作连续性:LDAP 枚举识别出可被 Kerberoast 的账户;Kerberoast 模块提取它们的哈希;破解出的哈希驱动 ACL 滥用模块;受损的管理员账户驱动 DCSync;DCSync 输出为横向移动模块提供数据。
Sovereign 围绕 `EngagementContext` 构建——这是一个数据类,用于保存域控制器 IP、域名、当前凭据和 LDAP 连接对象。在 Enum 模块中枚举域的会话,同样也是在 ACL 滥用模块中修改 ACL 的会话。DCSync 提取出的 Administrator 哈希立即可用于 Pass-the-Hash。
## 功能特性
### 通过 LDAP 进行 Domain 枚举
所有枚举均通过经过身份验证的 LDAP 绑定完成 —— 无需额外工具:
- **Domain 基线** — 功能级别、PDC 模拟器、域 SID、密码策略(最小长度、锁定阈值、锁定观察窗口)
- **用户枚举** — 所有具有 UAC 标志的域用户(`DONT_EXPIRE_PASSWORD`、`PASSWD_NOTREQD`、`DONT_REQ_PREAUTH`)、`adminCount`、`lastLogon`、`badPwgCount`;标记 description 字段中的密码
- **SPN 用户 (Kerberoastable)** — 过滤 `servicePrincipalName=*`;标记同时也是管理组成员的账户
- **AS-REP 候选者** — 过滤 `userAccountControl:1.2.840.113556.1.4.803:=4194304`;所有禁用预身份验证的账户
- **计算机账户** — 所有具有 OS 版本、上次登录和 DNS 主机名的机器账户
- **特权组** — 10 个组:Domain Admins、Enterprise Admins、Schema Admins、Administrators、Account Operators、Backup Operators、Server Operators、Group Policy Creator Owners、DnsAdmins、Exchange Trusted Subsystem
- **委派** — 跨计算机和用户的非约束委派(`TRUSTED_FOR_DELEGATION`)和约束委派(`msDS-AllowedToDelegateTo`)
- **ACL 分析** — 读取高价值 AD 对象上的 `nTSecurityDescriptor`;展示向非特权用户授予的异常权限分配
- **Domain 信任** — 枚举目录林/外部/快捷方式信任及其方向和传递性
- **密码策略** — `minPwdLength`、`lockoutThreshold`(0 = 可自由进行密码喷射)、`lockoutDuration`
### Kerberoasting
- 使用 Impacket `getKerberosTGT` + `getKerberosTGS` 为每个承载 SPN 的账户请求 TGS (Ticket Granting Service) 票据
- 从 TGS 响应中提取 etype 23 (`$krb5tgs$23$`) 或 etype 17/18 (AES)
- 输出为 hashcat 兼容格式:`$krb5tgs$23$*user*domain*SPN*` → 使用 `-m 13100` 破解
- SPN 账户中的管理组成员被标记为破解的关键优先级
### AS-REP Roasting
- 为每个禁用预身份验证的账户在无密码的情况下请求 AS-REP 票据
- 从 AS-REP 响应中提取 `$krb5asrep$23$` 格式
- 输出为 hashcat 兼容格式 → 使用 `-m 18200` 破解
- 不需要任何域凭据 — 可在零身份验证的情况下从网络执行
### DCSync — 完整 NTDS 提取
- 通过 DRSUAPI 复制协议使用 Impacket `RemoteOperations` + `NTDSHashes`
- 复制所有域用户对象并提取 NTLM 哈希对 (LM:NT)
- 单独存储 Administrator 和 krbtgt 哈希 — 立即获得特权和黄金票据(Golden Ticket)能力
- 需要 DS-Replication-Get-Changes-All 权限 — 通过 ACL 分析或以 Domain Admin 身份运行来确认
### ACL 滥用
对由 `sAMAccountName` 或 CN 指定的目标用户/组进行操作:
| ACL 权限 | 技术 | Impacket/LDAP 方法 |
|---|---|---|
| `GenericAll` | 将当前用户添加到目标组 | 对 `member` 属性执行 LDAP `MODIFY_ADD` |
| `ForceChangePassword` | 在不知道当前密码的情况下重置目标账户密码 | 对 `unicodePwd` 属性执行 LDAP `MODIFY_REPLACE` |
| `WriteSPN` | 在目标账户上设置 SPN → 定向 Kerberoasting | 对 `servicePrincipalName` 属性执行 LDAP `MODIFY_REPLACE` |
| `WriteDACL` | 修改高价值对象上的 DACL → 授予自身 DCSync 权限 | 已确认的路径;生成 PowerView `Add-DomainObjectAcl` 输出 |
| `DS-Replication-Get-Changes-All` | 从具有此权限的任何账户执行 DCSync | 通过 DRSUAPI 提取完整 NTDS |
### 横向移动 — Pass-the-Hash
- 通过 Impacket 使用 LM/NT 哈希对进行 SMBConnection(无需明文密码)
- PSExec 风格的执行:创建临时 SCMR 服务,执行命令,从 `C$` 检索输出
- 执行后移除服务 — 最小化的痕迹足迹
- 直接接受来自 DCSync 输出的已获取哈希
## 架构
```
Domain Controller IP + Domain + Credentials/Hashes
│
▼
EngagementContext
┌──────────────────────────────────────────┐
│ dc_ip · domain · username · password │
│ lm_hash · nt_hash · base_dn │
│ ldap_conn (shared LDAP session) │
└──────────────────────────────────────────┘
│
┌───────────┼────────────┐
▼ ▼ ▼
EnumModule Kerberoast ASREPRoast
LDAP full TGS per SPN AS-REP no-auth
10 classes etype 23/18 etype 23
│
├────────────────────────┐
▼ ▼
DCsyncModule ACLAbuseModule
DRSUAPI replication GenericAll/ForceChangePwd
full NTLM dump WriteSPN/WriteDACL
Administrator + krbtgt targeted Kerberoast
│
▼
LateralModule
Pass-the-Hash
PSExec / SMB exec
│
▼
JSON Report
(technique · account · hash)
```
## 攻击流程
1. **LDAP 绑定** — 使用提供的凭据(或 Kerberos 票据)通过 LDAP 向域控制器进行身份验证;建立存储在 `EngagementContext.ldap_conn` 中的会话
2. **Domain 基线** — 获取域功能级别、SID、锁定策略;在任何喷射活动之前确认锁定阈值为 0
3. **完整用户枚举** — 转储所有具有 UAC 标志、adminCount、上次登录和 description 字段的域用户;标记在描述中包含密码的账户
4. **SPN 枚举 (Kerberoasting 候选者)** — 列出所有承载 SPN 的账户;将 Domain Admin 成员标记为关键目标
5. **AS-REP 候选者识别** — 列出所有禁用预身份验证的账户;这些可以在没有任何凭据的情况下被攻击
6. **特权组成员身份** — 枚举所有 10 个特权组;映射包括嵌套组在内的完整成员身份
7. **ACL 审计** — 从高价值 AD 对象读取 `nTSecurityDescriptor`;标记向非特权主体授予的非标准权限;识别 DCSync 权限持有者
8. **Kerberoast** — 为每个 SPN 账户请求 TGS;提取 etype 23 哈希;以 hashcat 格式写入 `kerberoast.hash`
9. **AS-REP Roast** — 为每个无预身份验证账户请求 AS-REP;提取 etype 23 哈希;写入 `asreproast.hash`
10. **ACL 利用** — 如果发现 GenericAll、ForceChangePassword 或 WriteSPN,则执行相应的 LDAP 修改
11. **DCSync** — 如果确认了 DS-Replication 权限(通过 ACL 审计或在提权之后),则复制 NTDS;提取所有哈希;单独存储 Administrator 和 krbtgt
12. **横向移动** — 将提取出的 NTLM 哈希用于通过 Impacket 进行 Pass-the-Hash;PSExec 风格的服务创建;在目标上执行命令;检索并显示输出
## 用法
```
# 安装 dependencies
pip install -r requirements.txt
# 通过 LDAP 进行完整域枚举
python sovereign.py --dc 10.0.0.5 --domain corp.local \
--username lowpriv --password "Found1234" --modules enum
# 对所有 SPN 账户进行 Kerberoast
python sovereign.py --dc 10.0.0.5 --domain corp.local \
--username lowpriv --password "Found1234" --modules kerberoast
# 无凭据 AS-REP roast
python sovereign.py --dc 10.0.0.5 --domain corp.local --modules asreproast
# DCSync — 导出所有 NTLM hashes (需要 replication 权限)
python sovereign.py --dc 10.0.0.5 --domain corp.local \
--username Administrator --password "Compromised!" --modules dcsync
# ACL 滥用 — 通过 GenericAll 强制设置组成员身份
python sovereign.py --dc 10.0.0.5 --domain corp.local \
--username lowpriv --password "Found1234" --modules aclabuse \
--target "Domain Admins"
# Pass-the-Hash 横向移动
python sovereign.py --dc 10.0.0.5 --domain corp.local \
--username Administrator --nt-hash aad3b435b51404eeaad3b435b51404ee \
--modules lateral --target-host 10.0.0.20 --command "whoami"
# 完整 AD kill chain
python sovereign.py --dc 10.0.0.5 --domain corp.local \
--username lowpriv --password "Found1234" --modules all \
--output ad-engagement.json
# 非交互模式
python sovereign.py --dc 10.0.0.5 --domain corp.local \
--username lowpriv --password "Found1234" --modules all --yes
```
## 输出
```
18:44:01 [INFO] [Enum] Domain: corp.local | Functional Level: Windows 2016
18:44:01 [WARN] [Enum] Lockout threshold: 0 — password spraying is SAFE
18:44:02 [INFO] [Enum] Users: 312 | Computers: 47 | Groups: 28
18:44:02 [CRIT] [Enum] Password in description → svc-db: "InitialPass2023"
18:44:02 [CRIT] [Enum] Password in description → helpdesk01: "Temp@1234"
18:44:03 [CRIT] [Enum/SPNs] Kerberoastable accounts: 4
18:44:03 [CRIT] [Enum/SPNs] svc-mssql (MSSQLSvc/db01.corp.local) → Domain Admin member!
18:44:03 [INFO] [Enum/ASREPRoast] Pre-auth disabled: john.temp, test-account
18:44:04 [CRIT] [Enum/ACL] GenericAll on Domain Admins → SELF (lowpriv)
18:44:04 [CRIT] [Enum/ACL] DS-Replication-Get-Changes-All → svc-backup
18:44:05 [CRIT] [Kerberoast] TGS extracted: svc-mssql | etype: 23
18:44:05 [INFO] [Kerberoast] Hash: $krb5tgs$23$*svc-mssql*CORP.LOCAL*MSSQLSvc/db01*...
18:44:05 [INFO] [Kerberoast] Crack: hashcat -m 13100 kerberoast.hash wordlist.txt
18:44:06 [CRIT] [ASREPRoast] Hash extracted: john.temp | etype: 23
18:44:06 [INFO] [ASREPRoast] Crack: hashcat -m 18200 asreproast.hash wordlist.txt
18:44:07 [CRIT] [ACL] Executed GenericAll → added lowpriv to Domain Admins
18:44:08 [CRIT] [DCSync] Replication started — extracting all NTLM hashes
18:44:09 [CRIT] [DCSync] Administrator: aad3b435b51404eeaad3b435b51404ee:8846f7eaee8fb117...
18:44:09 [CRIT] [DCSync] krbtgt: aad3b435b51404eeaad3b435b51404ee:dfb518984a7bea62...
18:44:10 [CRIT] [Lateral] PTH success → 10.0.0.20 as CORP\Administrator
18:44:10 [INFO] [Lateral] Command output: nt authority\system
[✓] AD engagement complete — 9 critical findings | report: ad-engagement.json
```
## MITRE ATT&CK 覆盖范围
| 技术 | ID | 模块 |
|---|---|---|
| OS Credential Dumping: DCSync | T1003.006 | DCsyncModule |
| Steal or Forge Kerberos Tickets: Kerberoasting | T1558.003 | KerberoastModule |
| Steal or Forge Kerberos Tickets: AS-REP Roasting | T1558.004 | ASREPRoastModule |
| Account Discovery: Domain Account | T1087.002 | EnumModule |
| Domain Policy Discovery | T1615 | EnumModule (密码策略、委派) |
| Abuse Elevation Control Mechanism | T1548 | ACLAbuseModule |
| Use Alternate Authentication Material: Pass-the-Hash | T1550.002 | LateralModule |
| Remote Services: SMB/Windows Admin Shares | T1021.002 | LateralModule |
| Permission Groups Discovery: Domain Groups | T1069.002 | EnumModule |
**战术:** TA0006 Credential Access · TA0007 Discovery · TA0004 Privilege Escalation · TA0008 Lateral Movement · TA0003 Persistence
## CWE 覆盖范围演练
| CWE | 描述 | 位置 |
|---|---|---|
| CWE-522 | Insufficiently Protected Credentials | LDAP description 字段中的密码、弱 SPN 账户密码 |
| CWE-269 | Improper Privilege Management | ACL 错误配置(特权组上的 GenericAll) |
| CWE-732 | Incorrect Permission Assignment for Critical Resource | 非 DC 账户上的 DS-Replication-Get-Changes-All |
| CWE-308 | Use of Single-Factor Authentication | NTLM 哈希重用(横向移动无 MFA) |
| CWE-284 | Improper Access Control | 所有经过身份验证的用户均可读取 LDAP |
| CWE-262 | Not Using Password Aging | 服务账户上的 `DONT_EXPIRE_PASSWORD` 标志 |
| CWE-521 | Weak Password Requirements | 带有可破解密码的可被 Kerberoast 的 SPN 账户 |
## 法律声明
Sovereign 专为已获得域所有者明确书面授权的 Active Directory 渗透测试和红队演练而设计。未经授权对域环境执行 DCSync、Kerberoasting 或 Pass-the-Hash 攻击是非法的,可能构成对计算机系统的未经授权访问。作者对滥用行为不承担任何责任。
标签:Checkov, HTTP, PE 加载器, Python, 无后门, 模拟器, 活动目录, 逆向工具