zavetsec/Invoke-ADSecurityAudit

GitHub: zavetsec/Invoke-ADSecurityAudit

单文件只读 PowerShell 脚本,快速为 Active Directory 生成带 MITRE 映射的 HTML 安全审计报告。

Stars: 1 | Forks: 0

# Invoke-ADSecurityAudit ![PowerShell](https://img.shields.io/badge/PowerShell-5.1+-blue?logo=powershell) ![Platform](https://img.shields.io/badge/platform-Windows-lightgrey) ![License](https://img.shields.io/badge/license-MIT-green) ![RSAT Only](https://img.shields.io/badge/requires-RSAT%20only-brightgreen) ![Read Only](https://img.shields.io/badge/AD%20access-read--only-important) 单文件 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平台, 反取证, 只读审计, 域审计, 安全合规, 安全评估, 安全运维, 快速审计, 无代理, 无数据库, 权限检查, 离线报告, 网络代理, 配置核查