Password policy
1. 理论
在攻击 Active Directory 域时,直接针对账号通常是一个很好的起点。这可能为攻击者提供初始访问权限,并帮助其进行横向移动操作。最简单的获取账户控制的方法是进行密码猜测或密码喷洒攻击。这类攻击的效果通常取决于用户的安全意识水平。
然而,通常会有一些技术性防护措施到位,迫使攻击者在密码尝试的次数和速度之间做出权衡。
为了更好地调整攻击策略,攻击者可以获取目标系统的密码策略。这些策略有时可以通过空会话(即 MS-RPC > 2.2. 空会话 或 LDAP 匿名绑定)来枚举获得。
1.1. linux利用
在类 UNIX 系统中,有多种工具可以用来获取密码策略,例如:
- polenum(Python 编写)
- NetExec(Python 编写)
- ldapsearch-ad.py(Python 编写)
- Enum4linux
# polenum(通过 MS-RPC 获取密码策略)
polenum -d $DOMAIN -u $USER -p $PASSWORD -d $DOMAIN
# netexec(通过 MS-RPC 获取密码策略)
nxc smb $DOMAIN_CONTROLLER -d $DOMAIN -u $USER -p $PASSWORD --pass-pol
# ldapsearch-ad(通过 LDAP 获取密码策略)
ldapsearch-ad.py -l $LDAP_SERVER -d $DOMAIN -u $USER -p $PASSWORD -t all
# enum4linux-ng(通过 MS-RPC 获取密码策略)
enum4linux-ng -P -w -u $USER -p $PASSWORD $DOMAIN_CONTROLLER
1.2. windows下利用
# 从加入域的机器上,可以使用 net 命令获取密码策略
net accounts
net accounts /domain
# 从未加入域的机器上,可以使用 PowerView(PowerShell 工具)获取密码策略
Get-DomainPolicy
1.3. 其他
对于能触发账户锁定机制的账号,适合用 SprayHound 这种凭证喷洒攻击工具。因为喷洒攻击通常尝试少量密码,避免触发锁定机制,适合有锁定保护的账号环境。
对于没有账户锁定机制的账号,可以直接用 Kerbrute 进行暴力破解,因为不存在因多次失败而被锁定的问题,可以尽可能多地尝试密码。
2. 修复与防御
2.1. 密码策略要素
- 最小密码长度 - 确定密码必须包含多少个字符。
- 最短密码使用期限 - 密码在更改前必须使用多长时间。
- 强制密码历史记录 - 在可以重复使用旧密码之前,必须使用多少个唯一密码的阈值。有助于阻止密码重复使用。
- 最长密码期限 - 密码在必须更改之前可以使用的天数。
- 密码必须符合复杂性要求 - 启用时,将设置以下要求:密码不得包含用户的 samAccountName 或 displayName 值,密码必须包含四个主要类别中的三个类别的字符(大写字母、小写字母、数字 0-9、非字母数字的特殊字符),
- 账户锁定阈值 - 确定导致用户账户锁定的失败登录尝试次数。
- 账户锁定持续时间 - 账户被锁定后自动解锁所需的分钟数。
- 重置账户锁定计数器 - 从登录失败尝试开始,必须经过的分钟数后锁定计数器才会重置为 0。
- 使用可逆加密存储密码 - 启用此设置后更改或设置的密码将以可检索的格式存储,而非使用单向哈希函数。当攻击者在域被攻陷后获取 NTDS 文件时,任何在此设置启用后设置的密码都可以明文形式检索,无需对 NTLM 密码哈希进行离线破解。启用此设置的一个原因是为了支持需要使用用户明文密码进行身份验证的协议的应用。
2.2. 最佳实践
| 设置项 (Setting) | AD 默认值 (Default) | 微软最佳实践 (Microsoft) | NIST 建议 (NIST) | CIS 基准 (CIS) |
|---|---|---|---|---|
| 最小密码长度 | 7 个字符 | 12-14 个字符 | 至少 8 个字符(鼓励使用密码短语) | 14 个字符 |
| 最短密码使用期限 | 1 天 | 1 天 | 无特定要求 | 1 天 |
| 强制密码历史记录 | 24 个密码 | 24 个密码 | 无特定要求(通过培训阻止重用) | 24 个密码 |
| 最长密码使用期限 | 42 天 | 60–90 天(或永不过期) | 除非有泄露证据,否则永不过期 | 60 天 |
| 密码必须满足复杂性 | 已启用 | 已启用 | 非必需(鼓励强凭证/短语) | 已启用 |
| 账户锁定阈值 | 0(已禁用) | 10 次无效尝试 | 尽可能避免(使用风险检测) | 5-10 次无效尝试 |
| 账户锁定持续时间 | 不适用 | 15 分钟 | 优先采用监控与告警 | 15 分钟 |
| 重置锁定计数器间隔 | 不适用 | 15 分钟 | 避免锁定;使用告警 | 15 分钟 |
| 使用可逆加密存储密码 | 已禁用 | 已禁用(除非旧版应用要求) | 已禁用 | 已禁用 |
其他额外防护
- MFA
- SSO
- Windows Hello
- Microsoft Authenticator
2.2.1. 修复弱密码
在域控制器上启动组策略管理控制台(GPMC)。导航至 Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Account Policies -> Password Policy 并修改设置
同时,在 Computer Configuration -> Policies -> Windows Settings -> Security Settings -> Account Policies -> Account Lockout Policy 中,管理员可根据最佳实践配置适当的账户锁定设置,然后 gpupdate /force
#下次登录时更改密码
Set-ADUser -Identity $accountname -ChangePasswordAtLogon $true

