Kerberos Double Hop Problem

Reading time: 9 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

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の資格情報やUser1のTGTをキャッシュしていません。したがって、Server1からUser1が2番目のサーバーにログインしようとすると、認証できません

Unconstrained Delegation

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

CredSSP

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

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

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

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

Workarounds

Invoke Command

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

bash
$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とは異なるアプローチを必要とし、ダブルホップの制限を受けないセッションを可能にします。

bash
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ファイアウォールルールを追加できます。

bash
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 の監視が懸念される場合には、検出されにくいオプションとして機能する可能性があります。以下のコマンドは、その使用法を示しています:

bash
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ディレクトリに対して全員が読み取りおよび実行アクセスを持つように権限を更新する必要があるかもしれません。

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

References

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする