hacktricks/windows-hardening/active-directory-methodology/kerberos-double-hop-problem.md
2023-08-03 19:12:22 +00:00

12 KiB
Raw Blame History

Kerberos双跳问题

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

简介

当攻击者尝试在两个跳跃中使用Kerberos身份验证就会出现Kerberos“双跳”问题例如使用PowerShell/WinRM

当通过Kerberos进行身份验证时,凭据不会被缓存在内存中。因此即使用户正在运行进程如果你运行mimikatz你也找不到用户的凭据

这是因为当使用Kerberos连接时以下是步骤

  1. 用户1提供凭据域控制器返回一个Kerberos TGT给用户1。
  2. 用户1使用TGT请求一个服务票据连接到Server1。
  3. 用户1连接Server1并提供服务票据
  4. Server1没有缓存用户1的凭据或用户1的TGT。因此当来自Server1的用户1尝试登录到第二个服务器时无法进行身份验证

无限制委派

如果PC上启用了无限制委派,则不会发生这种情况,因为服务器获取每个访问它的用户的TGT。此外,如果使用无限制委派,你可能可以从中妥协域控制器
在无限制委派页面上获取更多信息

CredSSP

另一个建议的选项是系统管理员避免这个问题的方法是明显不安全凭证安全支持提供程序CredSSP。启用CredSSP是多年来各种论坛上提到的解决方案。来自Microsoft的说法

“CredSSP身份验证将用户凭据从本地计算机委派给远程计算机。这种做法增加了远程操作的安全风险。如果远程计算机受到攻击当凭据传递给它时凭据可以用于控制网络会话。”

如果在生产系统、敏感网络等地方发现启用了CredSSP,建议将其禁用。可以通过运行Get-WSManCredSSP快速检查CredSSP状态。如果启用了WinRM还可以远程执行该命令。

Invoke-Command -ComputerName bizintel -Credential ta\redsuit -ScriptBlock {
Get-WSManCredSSP
}

解决方法

调用命令

这种方法可以说是在处理双跳问题时的一种“合作方式”,并不是真正解决问题的方法。它不依赖于任何配置,你可以直接从攻击者的机器上运行它。它基本上是一个嵌套的Invoke-Command

这将在第二台服务器上运行 hostname

$cred = Get-Credential ta\redsuit
Invoke-Command -ComputerName bizintel -Credential $cred -ScriptBlock {
Invoke-Command -ComputerName secdev -Credential $cred -ScriptBlock {hostname}
}

您还可以与第一个服务器建立一个PS-Session,然后直接从那里使用Invoke-Command$cred运行命令,而不是嵌套执行。尽管如此,从攻击者的机器上运行可以集中任务:

# From the WinRM connection
$pwd = ConvertTo-SecureString 'uiefgyvef$/E3' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential('DOMAIN\username', $pwd)
# Use "-Credential $cred" option in Powerview commands

注册 PSSession 配置

如果不使用 evil-winrm,而是使用 Enter-PSSession 命令,您可以使用 Register-PSSessionConfiguration 并重新连接以绕过双跳问题:

# Register a new PS Session configuration
Register-PSSessionConfiguration -Name doublehopsess -RunAsCredential domain_name\username
# Restar WinRM
Restart-Service WinRM
# Get a PSSession
Enter-PSSession -ConfigurationName doublehopsess -ComputerName <pc_name> -Credential domain_name\username
# Check that in this case the TGT was sent and is in memory of the PSSession
klist
# In this session you won't have the double hop problem anymore

端口转发

由于我们在中间目标 bizintel: 10.35.8.17 上拥有本地管理员权限,您可以添加一个端口转发规则,将您的请求发送到最终/第三个服务器 secdev: 10.35.8.23

可以使用 netsh 快速提取一个一行命令并添加规则。

netsh interface portproxy add v4tov4 listenport=5446 listenaddress=10.35.8.17 connectport=5985 connectaddress=10.35.8.23

所以第一个服务器正在监听端口5446并将命中5446端口的请求转发到第二个服务器的5985端口也称为WinRM

然后在Windows防火墙中打开一个洞这也可以通过一个简洁的netsh命令完成。

netsh advfirewall firewall add rule name=fwd dir=in action=allow protocol=TCP localport=5446

现在建立会话,它将把我们转发到第一个服务器

winrs.exe

当使用**winrs.exe**时,端口转发 WinRM 请求似乎也可以工作。如果你意识到 PowerShell 正在被监视,这可能是一个更好的选择。下面的命令将返回hostname的结果为“secdev”。

winrs -r:http://bizintel:5446 -u:ta\redsuit -p:2600leet hostname

就像Invoke-Command一样这可以很容易地通过脚本化来实现以便攻击者可以将系统命令作为参数发出。一个通用的批处理脚本示例_winrm.bat_

OpenSSH

这种方法需要在第一个服务器上安装OpenSSH。在Windows上安装OpenSSH可以完全通过CLI完成,而且不需要太多时间 - 而且它不会被标记为恶意软件!

当然在某些情况下这可能不可行过于繁琐或者可能是一种一般的OpSec风险。

这种方法在跳板机设置上可能特别有用 - 可以访问一个否则无法访问的网络。一旦建立了SSH连接用户/攻击者可以根据需要发起多个New-PSSession来针对分段网络进行操作,而不会遇到双跳问题。

当配置OpenSSH使用密码身份验证而不是密钥或Kerberos登录类型为8也就是_网络明文登录_。这并不意味着您的密码以明文形式发送 - 实际上它是通过SSH加密的。到达目的地后它通过其身份验证包解密为明文以便为您的会话进一步请求有价值的TGT

这允许中间服务器代表您请求和获取一个TGT并在中间服务器上本地存储。然后您的会话可以使用此TGT对其他服务器进行身份验证PS远程

OpenSSH安装场景

从github下载最新的OpenSSH发布zip到您的攻击机,并将其移动到(或直接下载到)跳板机。

将zip文件解压到您想要的位置。然后运行安装脚本 - Install-sshd.ps1

最后,只需添加一个防火墙规则来打开端口22。验证SSH服务是否已安装并启动它们。这两个服务都需要运行才能使SSH工作。

如果收到Connection reset错误请更新权限以允许根OpenSSH目录上的Everyone: Read & Execute

icacls.exe "C:\Users\redsuit\Documents\ssh\OpenSSH-Win64" /grant Everyone:RX /T

参考资料

☁️ HackTricks 云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥