fatihpurtas/PasswdNotReqd-scanner
GitHub: fatihpurtas/PasswdNotReqd-scanner
一款轻量级 PowerShell 脚本,用于审计 Active Directory 中存在 PASSWD_NOTREQD 标志的高风险账户,无需管理员权限或 AD 模块即可运行。
Stars: 0 | Forks: 0
# PASSWD_NOTREQD 扫描器
此 PowerShell 脚本会审计 **Active Directory** 中被标记为
**`PASSWD_NOTREQD`**(无需密码)的账户,并将结果导出为 CSV 文件。
## 目的
`PASSWD_NOTREQD` 标志(`userAccountControl` 位 `0x20`)使得账户可以豁免
域的**最小密码长度**策略。此类账户可以被设置
**空密码或极短的密码**,使其成为密码喷洒攻击的首选目标,并成为入侵域的轻松跳板。
- 检测所有设置了 `userAccountControl` 位 `0x20` (32) 的用户账户。
- 标记特权账户(`adminCount >= 1`)以及**从未设置**密码的账户。
- 默认排除已禁用的账户。
## 关键特性
- 仅使用内置的 **System.DirectoryServices** 类,**不需要 ActiveDirectory 模块**。
- **无需管理员权限**即可运行;只需对 AD 具有读取权限。
- 适用于已加入域的环境,或通过 `-Server` 针对特定 DC 运行。
- 分页 LDAP 查询(每页 1000 条),适用于大型域。
## 工作原理
1. 绑定到 `RootDSE` 以发现默认命名上下文(或使用 `-SearchBase`)。
2. 运行 LDAP 过滤器:
(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=32))
(除非使用 `-IncludeDisabled`,否则会追加 `(!(...:=2))` 子句以跳过已禁用的账户)
3. 提取相关属性,将 FileTime 值转换为可读的 UTC 时间。
4. 导出结果并打印摘要。
## 用法
```
.\PasswdNotReqd.ps1
.\PasswdNotReqd.ps1 -Server dc01.example.com -OutputPath C:\Audit\passwd_notreqd.csv
.\PasswdNotReqd.ps1 -IncludeDisabled
```
| 参数 | 描述 |
|-----------|-------------|
| `-Server` | 直接查询的域控制器(`dc01.example.com` 或 `:636`)。 |
| `-SearchBase` | 用于限定搜索范围的可分辨名称。 |
| `-OutputPath` | CSV 输出路径。默认为 `.\passwd_notreqd_.csv`。 |
| `-IncludeDisabled` | 包含已禁用的账户(默认排除)。 |
## CSV 列
Name, SamAccountName, Enabled, AdminCount, PwdLastSet, NeverSetPassword, LastLogon, DistinguishedName。
## 要求
- PowerShell 5.1 或更高版本
- 域连接(已加入域或可通过 `-Server` 连接到 DC)
- 对 Active Directory 具有读取权限
## 安全影响
- 对任何并非真正需要该标志的账户**清除该标志**。该标志通常是账户配置脚本或迁移遗留的产物。
- 在清除标志后,**重置受影响账户**的密码为一个强密码,以替换任何现有的空/弱密码。
- **优先处理特权账户**以及 `NeverSetPassword = True` 的账户,这些账户当前可能拥有空白密码。
- **监控**这些账户的成功登录情况,在修复之前将其视为高风险账户。
标签:Active Directory, AI合规, Checkov, IPv6, LDAP, Libemu, Plaso, PowerShell, Terraform 安全, 多人体追踪