zavetsec/Invoke-ADSecurityAudit
GitHub: zavetsec/Invoke-ADSecurityAudit
单文件只读 PowerShell 脚本,快速为 Active Directory 生成带 MITRE 映射的 HTML 安全审计报告。
Stars: 1 | Forks: 0
# Invoke-ADSecurityAudit





单文件 PowerShell 脚本。在域加入的机器上运行,生成包含发现结果、MITRE ATT&CK 映射和修复建议的结构化 HTML 报告。无代理、无数据库、无持久化组件。
## 预览
111
## 与其他工具的对比
| | 本工具 | BloodHound | PingCastle |
|---|---|---|---|
| 安装要求 | ❌ 仅需 RSAT | ✅ 需要 Neo4j + 代理 | ✅ 需要安装 |
| 只读模式 | ✅ | ❌ | ✅ |
| 离线报告 | ✅ 单个 HTML | ❌ | ✅ |
| MITRE ATT&CK 映射 | ✅ | ✅ | ❌ |
| GPO 设置分析 | ✅ | ❌ | ❌ |
| 大域精简模式 | ✅ | ❌ | ❌ |
## 本工具能做什么与不能做什么
**能做的:**
- 检查经常被利用或造成高影响攻击条件的错误配置
- 将每个发现映射到适用的 MITRE ATT&CK 技术
- 直接从 SYSVOL 读取 GPO 安全设置,无需 GPMC
- 生成自包含的 HTML 报告 + 结构化 CSV
**不能做的:**
- 枚举攻击路径或基于图的横向移动链(请为此使用 BloodHound)
- 审计 Active Directory 证书服务(ADCS / ESC1–ESC8)
- 检测影子凭证或基于证书的攻击
- 分析混合 / Azure AD 环境
- 替代完整的渗透测试或红队演练
## 设计理念
聚焦三件事:
- **可利用性优先于理论** — 检查具有真实世界滥用记录的错误配置,而非边缘情况
- **信号优先于噪声** — 每个发现都包含严重性、证据和具体的修复步骤
- **无需基础设施** — 在任何域加入的机器上运行,不留下持久化组件
严重性基于简单的、文档化的阈值(密码年龄、组成员关系、标志存在)。风险分数(`CRITICAL×10 + HIGH×5 + MEDIUM×2 + LOW×1`)仅用于分类辅助,并非合规度量。
## 设计原则
- **只读** — 仅执行 LDAP 读取、SYSVOL 文件读取和 `Get-ACL` 调用。不执行 `Set-AD*`、`New-AD*`、`Remove-AD*`,无 RPC 执行、无 WMI、无 PowerShell 远程执行
- **优雅降级** — 缺失权限或模块时输出控制台警告而非崩溃
- **输出一致** — 相同环境始终产生相同发现结果;无随机性或采样
- **完整数据** — CSV 包含完整对象列表;HTML 为性能考虑对每个发现最多显示 100 个对象
## 工作原理
- **LDAP 查询** — 通过 RSAT 的 `ActiveDirectory` 模块执行,尽可能使用服务器端筛选以避免不必要的全域枚举
- **SYSVOL 读取** — 通过 SMB 读取 GPP 密码扫描(第 19 项检查)和 GPO 安全设置(第 22 项检查)
- **ACL 检查** — 对特定 AD 对象路径(域根、AdminSDHolder、DC OU 及最多 10 个特权用户对象)执行 `Get-ACL` 检查
- **无 RPC 执行、无 WMI、无 PowerShell 远程执行** — 所有数据收集均为被动只读
## 使用场景
- **事件响应分级** — 在深入调查前快速识别最高风险的错误配置
- **预渗透测试基线** — 在红队演练前记录域的状态
- **内部 AD 审计** — 提供适合报告和工单的结构化输出
- **持续卫生维护** — 每周运行精简模式,每月运行完整模式
- **加固验证** — 在修复后重新运行以确认发现结果已解决
## 快速开始
```
# Clone
git clone https://github.com/zavetsec/Invoke-ADSecurityAudit
cd Invoke-ADSecurityAudit
# 或者直接下载脚本并从其目录运行
# https://github.com/zavetsec/Invoke-ADSecurityAudit/raw/main/Invoke-ADSecurityAudit.ps1
# 完整审计 — 自动检测 PDC,保存报告到脚本目录
.\Invoke-ADSecurityAudit.ps1
# 精简模式 — 9 个高影响检查,约 2–5 分钟
.\Invoke-ADSecurityAudit.ps1 -LiteMode
# 非域计算机或显式凭据
.\Invoke-ADSecurityAudit.ps1 -Server dc01.corp.local -Credential (Get-Credential)
```
报告将保存在脚本目录,文件名为 `ADSecurityAudit_.html` 和 `.csv`。
## 示例发现
```
[HIGH] Kerberoastable account — password age 847 days
Account : svc_sql
SPN : MSSQLSvc/sql01.corp.local
Password age : 847 days
AdminCount : 0
TTP : T1558.003
Any domain user can request a Kerberos service ticket for this account.
The ticket is encrypted with the account password and can be cracked offline.
Recommendation: rotate password to 25+ chars; enforce AES-256 encryption on SPN;
consider migrating to gMSA for automatic password management.
```
## 安装
无需安装。克隆后直接运行。
**需要 RSAT ActiveDirectory 模块:**
```
# Windows Server
Add-WindowsFeature RSAT-AD-PowerShell
# Windows 10/11
Add-WindowsCapability -Online -Name Rsat.ActiveDirectory.DS-LDS.Tools
```
**可选 — 用于第 15 项检查(通过 GPMC 进行 GPO 枚举):**
```
# Windows Server
Add-WindowsFeature GPMC
# Windows 10/11
Add-WindowsCapability -Online -Name Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0
```
仅第 15 项检查需要 GPMC。若不存在则静默跳过。第 22 项检查无需额外模块即可覆盖关键 GPO 安全设置。
## 检查项
### 完整模式 — 22 项检查
| # | 检查 | 严重性范围 | MITRE TTP | 备注 |
|---|-------|---------------|-----------|-------|
| 1 | 域 / 森林功能级别 | 高 | [T1078.002](https://attack.mitre.org/techniques/T1078/002/) | |
| 2 | 权限组组成员关系(DA、EA、SA、BA 及其他 6 项) | 严重–中 | [T1078.002](https://attack.mitre.org/techniques/T1078/002/) | |
| 3 | KRBTGT 密码年龄 | 严重–中 | [T1558.001](https://attack.mitre.org/techniques/T1558/001/) | |
| 4 | 默认域密码策略 + 细粒度策略 | 严重–中 | — | |
| 5 | 可 Kerberoast 的账户(SPN + 密码年龄 + AdminCount) | 严重–中 | [T1558.003](https://attack.mitre.org/techniques/T1558/003/) | |
| 6 | AS-REP 可爆破账户 | 严重–高 | [T1558.004](https://attack.mitre.org/techniques/T1558/004/) | |
| 7 | 无约束委派 + 约束委派(带协议转换) | 严重–高 | [T1558](https://attack.mitre.org/techniques/T1558/) | |
| 8 | AdminSDHolder 孤儿对象(AdminCount=1 但不在特权组) | 高 | [T1078.002](https://attack.mitre.org/techniques/T1078/002/) | |
| 9 | DCSync 权限 — 域根上的复制 ACE | 严重 | [T1003.006](https://attack.mitre.org/techniques/T1003/006/) | 需要 DA 权限 |
| 10 | 停滞且从未登录的用户账户 | 高–低 | [T1078](https://attack.mitre.org/techniques/T1078/) | |
| 11 | 密码标志(NeverExpires、可逆加密、DES 仅) | 严重–高 | [T1078](https://attack.mitre.org/techniques/T1078/) | |
| 12 | LAPS 部署覆盖率 | 高–中 | — | `-CheckLAPS` |
| 13 | 停滞及已停用操作系统计算机账户 | 严重–低 | — | |
| 14 | 域信任问题(SID 过滤、选择性身份验证) | 严重–中 | — | |
| 15 | GPO 枚举(禁用、未链接的 GPO) | 低 | — | 需要 GPMC |
| 16 | 受保护用户组覆盖率 | 高 | — | |
| 17 | 权限账户上的敏感委派标志 | 高 | — | |
| 18 | 用户的 SIDHistory(及计算机账户) | 严重–中 | [T1134.005](https://attack.mitre.org/techniques/T1134/005/) | |
| 19 | SYSVOL 中的 GPP 密码(cpassword) | 严重 | [T1552.006](https://attack.mitre.org/techniques/T1552/006/) | |
| 20 | MachineAccountQuota > 0 | 高–中 | [T1136.002](https://attack.mitre.org/techniques/T1136/002/) | |
| 21 | 域根、AdminSD、DC OU 上的 ACL 异常 | 严重 | [T1222.001](https://attack.mitre.org/techniques/T1222/001/) | 需要 DA 权限 |
| 22 | 通过 SYSVOL 的 GPO 安全设置(无需 GPMC) | 严重–中 | 多项 | |
**第 22 项检查 — GPO 安全设置** 会读取每个 GPO 中的 `GptTmpl.inf` 和 `Registry.xml`,并基于模式匹配检查以下高风险设置:
| 检查项 | 条件为真时产生发现 | MITRE |
|---|---|---|
| WDigest(`UseLogonCredential`) | = 1 | [T1003.001](https://attack.mitre.org/techniques/T1003/001/) |
| NTLMv1(`LmCompatibilityLevel`) | < 3 | [T1557.001](https://attack.mitre.org/techniques/T1557/001/) |
| LM 哈希存储(`NoLMHash`) | = 0 | [T1110.002](https://attack.mitre.org/techniques/T1110/002/) |
| SMB 签名 — 客户端 + 服务器 | 已禁用 | [T1557.001](https://attack.mitre.org/techniques/T1557/001/) |
| Windows 防火墙 | 已禁用 | — |
| Windows Defender | 已禁用 | — |
| 匿名访问(`RestrictAnonymous`) | = 0 | [T1135](https://attack.mitre.org/techniques/T1135/) |
| SeDebugPrivilege | 非管理员主体拥有 | [T1134.001](https://attack.mitre.org/techniques/T1134/001/) |
| AutoRun(`NoDriveTypeAutoRun`) | < 255 | — |
| PowerShell 执行策略 | Unrestricted / Bypass | — |
### 精简模式 — 9 项检查
仅执行 **2、3、5、6、7、9、19、20、21**。覆盖 Golden Ticket、Kerberoasting、AS-REP、DCSync、GPP 凭证、RBDC、无人约束委派、ACL 滥用。不进行完整用户/计算机枚举。适用于大型域或计划每周运行。
## 参数
| 参数 | 类型 | 默认值 | 说明 |
|-----------|------|---------|-------------|
| `-Server` | 字符串 | PDC 仿真器 | DC FQDN 或 IP。在非域机器上运行时必需 |
| `-Credential` | PSCredential | 当前用户 | 用于非域或跨域运行的显式凭据 |
| `-OutputPath` | 字符串 | 脚本目录 | HTML 报告的完整输出路径 |
| `-CsvPath` | 字符串 | 脚本目录 | CSV 导出的完整路径 |
| `-StaleAccountDays` | 整数 | 90 | 用户账户登录不活动阈值 |
| `-StaleComputerDays` | 整数 | 90 | 计算机账户登录不活动阈值 |
| `-LiteMode` | 开关 | 关闭 | 仅运行 9 项关键检查 |
| `-CheckLAPS` | 开关 | 关闭 | 包含 LAPS 覆盖率检查(在大型域中可能较慢) |
## 预估运行时间
| 域规模 | 用户数 | 完整模式 | 精简模式 |
|-------------|-------|-----------|-----------|
| 小型 | < 500 | ~1 分钟 | ~20 秒 |
| 中型 | 500–5k | ~3–5 分钟 | ~45 秒 |
| 大型 | 5k–20k | ~8–15 分钟 | ~1–2 分钟 |
| 超大型 | 20k+ | ~20–35 分钟 | ~2–5 分钟 |
`-CheckLAPS` 在拥有 10k+ 台计算机的域中会增加约 5–10 分钟,因此默认关闭。
## 已知限制
- 发现结果需在上下文中审核 — 并非所有标记的配置都代表即时风险。停滞账户不意味着已被破坏;MAQ > 0 也不是活跃利用。请将发现结果作为优先调查列表使用,而非最终判决
- `LastLogonDate` 在约 14 天的最佳努力周期内复制。停滞账户发现可能包含最近已在其他 DC 登录的账户
- 第 9 和 21 项检查需要域管理员或等效的读取权限。若权限不足将优雅跳过
- 严重性阈值(90 天停滞账户、365 天密码年龄等)为可配置的起始点 — 在采取行动前请在上下文中审查发现结果
- 不检测 ADCS 错误配置、攻击链、影子凭证或混合/Azure AD 问题
## 贡献
欢迎提交问题和拉取请求。如需建议新检查,请在问题中描述错误配置及其真实世界滥用场景。
## 免责声明
仅在你被授权审核的环境中使用。
*属于 [ZavetSec](https://github.com/zavetsec) DFIR 工具包的一部分。*
标签:Active Directory, AD安全, AI合规, Cloudflare, CSV报告, GPO分析, HTML报告, IPv6, Libemu, MITRE ATT&CK, PB级数据处理, Plaso, PowerShell, RSAT, Windows平台, 反取证, 只读审计, 域审计, 安全合规, 安全评估, 安全运维, 快速审计, 无代理, 无数据库, 权限检查, 离线报告, 网络代理, 配置核查