Kerberos Double Hop Problem

Support HackTricks

Introduction

Kerberosの「ダブルホップ」問題は、攻撃者が2つのホップを介してKerberos認証を使用しようとするときに発生します。例えば、PowerShell/WinRMを使用する場合です。

Kerberosを介して認証が行われると、資格情報メモリにキャッシュされません。したがって、mimikatzを実行しても、ユーザーがプロセスを実行している場合でも、そのマシンにユーザーの資格情報は見つかりません。

これは、Kerberosで接続する際の手順が以下の通りだからです:

  1. User1が資格情報を提供し、ドメインコントローラーがUser1にKerberosのTGTを返します。

  2. User1がTGTを使用して、Server1に接続するためのサービスチケットを要求します。

  3. User1がServer1に接続し、サービスチケットを提供します。

  4. Server1はUser1の資格情報TGTをキャッシュしていません。したがって、Server1からUser1が別のサーバーにログインしようとすると、認証できません

Unconstrained Delegation

PCで制約のない委任が有効になっている場合、これは発生しません。なぜなら、サーバーはアクセスする各ユーザーのTGTを取得するからです。さらに、制約のない委任が使用されている場合、ドメインコントローラーを侵害する可能性があります。 制約のない委任のページでの詳細

CredSSP

この問題を回避する別の方法は、特に安全でない Credential Security Support Providerです。Microsoftによると:

CredSSP認証は、ローカルコンピュータからリモートコンピュータにユーザーの資格情報を委任します。この実践は、リモート操作のセキュリティリスクを高めます。リモートコンピュータが侵害された場合、資格情報が渡されると、その資格情報を使用してネットワークセッションを制御できます。

セキュリティ上の懸念から、CredSSPは本番システム、敏感なネットワーク、および同様の環境では無効にすることを強く推奨します。CredSSPが有効かどうかを確認するには、Get-WSManCredSSPコマンドを実行できます。このコマンドは、CredSSPの状態を確認することができ、WinRMが有効であればリモートで実行することも可能です。

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

Workarounds

Invoke Command

ダブルホップの問題に対処するために、ネストされた Invoke-Command を使用する方法が提示されています。これは問題を直接解決するものではありませんが、特別な設定を必要とせずに回避策を提供します。このアプローチでは、最初の攻撃マシンから実行されたPowerShellコマンドまたは最初のサーバーとの以前に確立されたPS-Sessionを通じて、二次サーバー上でコマンド(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を使用して実行することが、タスクの中央集約に推奨されます。

PSSession構成の登録

ダブルホップ問題を回避するための解決策は、Enter-PSSessionとともにRegister-PSSessionConfigurationを使用することです。この方法はevil-winrmとは異なるアプローチを必要とし、ダブルホップの制限を受けないセッションを可能にします。

Register-PSSessionConfiguration -Name doublehopsess -RunAsCredential domain_name\username
Restart-Service WinRM
Enter-PSSession -ConfigurationName doublehopsess -ComputerName <pc_name> -Credential domain_name\username
klist

PortForwarding

中間ターゲットのローカル管理者にとって、ポートフォワーディングはリクエストを最終サーバーに送信することを可能にします。netshを使用して、ポートフォワーディングのルールを追加し、転送されたポートを許可するWindowsファイアウォールルールを追加できます。

netsh interface portproxy add v4tov4 listenport=5446 listenaddress=10.35.8.17 connectport=5985 connectaddress=10.35.8.23
netsh advfirewall firewall add rule name=fwd dir=in action=allow protocol=TCP localport=5446

winrs.exe

winrs.exe は、WinRM リクエストを転送するために使用でき、PowerShell モニタリングが懸念される場合には、検出されにくいオプションとして機能する可能性があります。以下のコマンドは、その使用法を示しています:

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

OpenSSH

最初のサーバーにOpenSSHをインストールすることで、ダブルホップの問題に対する回避策が可能になり、特にジャンプボックスシナリオに役立ちます。この方法では、Windows用のOpenSSHのCLIインストールと設定が必要です。パスワード認証用に設定されると、これにより中間サーバーがユーザーの代わりにTGTを取得できます。

OpenSSH インストール手順

  1. 最新のOpenSSHリリースzipをダウンロードしてターゲットサーバーに移動します。

  2. 解凍してInstall-sshd.ps1スクリプトを実行します。

  3. ポート22を開くためのファイアウォールルールを追加し、SSHサービスが実行中であることを確認します。

Connection resetエラーを解決するには、OpenSSHディレクトリに対して全員が読み取りおよび実行アクセスを持つように権限を更新する必要があるかもしれません。

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

参考文献

HackTricksをサポートする

Last updated