Kerberos Double Hop Problem
はじめに
Kerberosの「ダブルホップ」問題は、Kerberos認証を2つのホップを介して、例えばPowerShell/WinRMを使用しようとするときに発生します。
Kerberosを介した認証が行われると、資格情報はメモリにキャッシュされません。したがって、mimikatzを実行しても、ユーザーの資格情報をマシンで見つけることはできません。
これは、Kerberosで接続する際に次の手順が実行されるためです:
User1が資格情報を提供し、ドメインコントローラーがUser1にKerberos TGTを返します。
User1はTGTを使用してServer1に接続するためのサービスチケットを要求します。
User1はServer1に接続し、サービスチケットを提供します。
Server1にはUser1の資格情報やUser1のTGTがキャッシュされていないため、Server1から2番目のサーバーにログインしようとすると、認証できません。
制約のない委任
PCで制約のない委任が有効になっている場合、サーバーはそれにアクセスする各ユーザーのTGTを取得します。さらに、制約のない委任が使用されている場合、おそらくドメインコントローラーを侵害できるでしょう。 制約のない委任ページで詳細を確認。
CredSSP
この問題を回避する別の方法は、著しく安全でない Credential Security Support Providerです。Microsoftから:
CredSSP認証は、ユーザーの資格情報をローカルコンピューターからリモートコンピューターに委任します。この慣行は、リモート操作のセキュリティリスクを高めます。リモートコンピューターが侵害された場合、資格情報が渡されると、その資格情報を使用してネットワークセッションを制御することができます。
セキュリティ上の懸念から、CredSSPは本番システム、機密ネットワーク、類似環境で無効にすることが強く推奨されます。CredSSPが有効かどうかを確認するには、Get-WSManCredSSP
コマンドを実行できます。このコマンドにより、CredSSPの状態を確認し、WinRMが有効になっていればリモートで実行することもできます。
回避策
Invoke Command
ダブルホップの問題に対処するために、ネストされた Invoke-Command
を使用する方法が提示されています。これは問題を直接解決するのではなく、特別な構成を必要とせずに回避策を提供します。このアプローチにより、初期の攻撃マシンから実行されたPowerShellコマンドまたは最初のサーバーと事前に確立されたPS-Sessionを介して、セカンダリサーバーでコマンド (hostname
) を実行できます。以下に手順を示します:
リモート PSSession の確立
最初のサーバーとの PS-Session を確立し、$cred
を使用して Invoke-Command
を実行することが、タスクを一元化するために提案されています。
PSSession 構成の登録
ダブルホップ問題をバイパスする解決策として、Register-PSSessionConfiguration
と Enter-PSSession
を使用する方法があります。この方法は evil-winrm
とは異なるアプローチが必要であり、ダブルホップの制限を受けないセッションを可能にします。
ポートフォワーディング
中間ターゲットのローカル管理者の場合、ポートフォワーディングを使用してリクエストを最終サーバーに送信できます。 netsh
を使用して、ポートフォワーディングのためのルールを追加し、転送されたポートを許可するためのWindowsファイアウォールルールを追加します。
winrs.exe
winrs.exe
は、WinRMリクエストを転送するために使用でき、PowerShellの監視が懸念される場合には検出されにくいオプションとして機能します。以下のコマンドは、その使用方法を示しています:
OpenSSH
最初のサーバーにOpenSSHをインストールすると、ジャンプボックスシナリオに特に有用なダブルホップの問題の回避策が可能になります。この方法では、Windows用のOpenSSHのCLIインストールとセットアップが必要です。パスワード認証用に構成されている場合、中間サーバーがユーザーの代わりにTGTを取得できるようになります。
OpenSSHのインストール手順
最新のOpenSSHリリースzipをダウンロードして、対象サーバーに移動します。
zipファイルを解凍し、
Install-sshd.ps1
スクリプトを実行します。ポート22を開くためのファイアウォールルールを追加し、SSHサービスが実行されていることを確認します。
Connection reset
エラーを解決するには、アクセス許可を更新してOpenSSHディレクトリで誰もが読み取りおよび実行アクセスを許可する必要がある場合があります。
参考
Last updated