hacktricks/windows-hardening/active-directory-methodology/kerberos-double-hop-problem.md
2023-07-07 23:42:27 +00:00

14 KiB
Raw Blame History

Kerberosダブルホップ問題

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

はじめに

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

Kerberosを介した認証が行われると、資格情報はメモリにキャッシュされません。したがって、mimikatzを実行しても、ユーザーの資格情報はマシンに存在しません。

これは、Kerberosで接続する場合の手順です。

  1. ユーザー1が資格情報を提供し、ドメインコントローラがユーザー1にKerberos TGTを返します。
  2. ユーザー1はTGTを使用して、Server1に接続するためのサービスチケットを要求します。
  3. ユーザー1はServer1接続し、サービスチケットを提供します。
  4. Server1には、ユーザー1の資格情報やユーザー1のTGTがキャッシュされていません。そのため、Server1から2番目のサーバーにログインしようとすると、ユーザー1は認証できません

制約のない委任

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

CredSSP

この問題を回避するために、システム管理者に提案される別のオプションは、明らかに安全ではない Credential Security Support Providerです。CredSSPを有効にすることは、さまざまなフォーラムで何年も言及されてきた解決策です。Microsoftからの引用

「CredSSP認証は、ユーザーの資格情報をローカルコンピュータからリモートコンピュータに委任します。この方法は、リモート操作のセキュリティリスクを増加させます。リモートコンピュータが侵害された場合、資格情報が渡されると、ネットワークセッションを制御するために資格情報が使用される可能性があります。」

本番システム、機密ネットワークなどでCredSSPが有効になっている場合は、無効にすることをお勧めします。CredSSPのステータスを確認する簡単な方法は、Get-WSManCredSSPを実行することです。WinRMが有効になっている場合、リモートで実行することもできます。

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

回避策

Invoke Command

この方法は、二重ホップの問題を「一緒に動作させる」方法であり、必ずしも解決するものではありません。構成に依存せず、攻撃ボックスから簡単に実行できます。基本的には**ネストされたInvoke-Command**です。

これにより、2番目のサーバーで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にローカル管理者権限があるため、リクエストを最終/3番目のサーバーである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

以下は、Kerberosのダブルホップ問題に関する内容です。

最初のサーバーはポート5446でリッスンし、ポート5985WinRMとも呼ばれるにリクエストを転送します。

次に、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のインストールシナリオ

最新のOpenSSHリリースzipをgithubからダウンロードし、攻撃ボックスに移動させるか、直接ジャンプボックスにダウンロードします。

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 Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥