Az - Pass the PRT
Last updated
Last updated
AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE)
SSOステートセクションでは、AzureAdPrt
がYESに設定されているのが確認できます。
同じ出力で、デバイスがAzureに参加しているか(フィールドAzureAdJoined
で)も確認できます:
PRTクッキーは実際には**x-ms-RefreshTokenCredential
と呼ばれ、JSON Web Token(JWT)です。JWTは3つの部分**、ヘッダー、ペイロード、署名から構成され、.
で区切られ、すべてURLセーフなbase64エンコードされています。典型的なPRTクッキーは以下のヘッダーとボディを含みます:
実際の Primary Refresh Token (PRT) は refresh_token
内にカプセル化されており、これは Azure AD の制御下にあるキーによって暗号化されているため、その内容は私たちには不透明で復号不可能です。フィールド is_primary
は、このトークン内にプライマリリフレッシュトークンがカプセル化されていることを示します。クッキーが意図された特定のログインセッションにバインドされたままになるように、request_nonce
は logon.microsoftonline.com
ページから送信されます。
LSASS プロセスは KDFコンテキスト を TPM に送信し、TPM は セッションキー(デバイスが AzureAD に登録されたときに収集され、TPM に保存されたもの)と前のコンテキストを使用して キーを導出 し、この 導出されたキー が PRTクッキー (JWT) を署名するために使用されます。
KDFコンテキストは AzureAD からのノンスと PRT を混ぜた JWT で、コンテキスト(ランダムバイト)を含みます。
したがって、PRT が TPM 内にあるために抽出できなくても、LSASS を悪用して 新しいコンテキストから導出されたキーを要求し、生成されたキーを使用してクッキーに署名する ことが可能です。
通常のユーザー として、LSASS に SSO データを要求することで PRTの使用を要求する ことが可能です。 これは、Web Account Manager(トークンブローカー)からトークンを要求する ネイティブアプリ のように行うことができます。WAM はリクエストを LSASS に渡し、LSASS は署名された PRT アサーションを使用してトークンを要求します。また、PRTクッキー を ヘッダー として使用して Azure AS ログインページへのリクエストを認証する ブラウザベース(ウェブ)フロー でも行うことができます。
SYSTEM として、TPM によって保護されていない場合は PRTを盗むことができ、または LSASS 内のPRTキーと相互作用する ことができます。
この方法の詳細については この投稿を確認してください。ROADtoken は正しいディレクトリから BrowserCore.exe
を実行し、これを使用して PRTクッキーを取得 します。このクッキーはその後、ROADtools を使用して認証し、永続的なリフレッシュトークンを取得 するために使用できます。
有効な PRT クッキーを生成するために最初に必要なのはノンスです。 これを取得するには:
または roadrecon を使用して:
次に、roadtokenを使用して新しいPRTを取得できます(攻撃するユーザーのプロセスからツールを実行します):
As oneliner:
次に、生成されたクッキーを使用して、Azure AD GraphまたはMicrosoft Graphを使用してログインするためのトークンを生成できます:
Get-AADIntUserPRTToken
ユーザーのPRTトークンを取得します Azure ADに参加したコンピュータまたはハイブリッド参加したコンピュータから。 BrowserCore.exe
を使用してPRTトークンを取得します。
また、Mimikatzからの値がある場合は、AADInternalsを使用してトークンを生成することもできます:
https://login.microsoftonline.com に移動し、login.microsoftonline.com のすべてのクッキーをクリアして、新しいクッキーを入力します。
次に、https://portal.azure.comに移動します。
残りはデフォルトのままで大丈夫です。ページを更新できて、クッキーが消えないことを確認してください。消えた場合は、間違いを犯した可能性があり、プロセスを再度行う必要があります。消えない場合は、問題ありません。
PRT(プライマリリフレッシュトークン)がLSASS(ローカルセキュリティ認証局サブシステムサービス)から抽出され、後で使用するために保存されます。
次にセッションキーが抽出されます。このキーは最初に発行され、その後ローカルデバイスによって再暗号化されるため、DPAPIマスタキーを使用して復号化する必要があります。DPAPI(データ保護API)に関する詳細情報は、これらのリソースで確認できます: HackTricks およびその適用については、Pass-the-cookie attackを参照してください。
セッションキーの復号化後、PRTのための派生キーとコンテキストが取得されます。これらはPRTクッキーの作成に重要です。具体的には、派生キーはクッキーを構成するJWT(JSON Webトークン)に署名するために使用されます。このプロセスの詳細な説明はDirk-janによって提供されており、こちらでアクセスできます。
PRTがTPM内にあり、lsass
内にない場合は、mimikatzはそれを抽出できません。
ただし、TPMからのコンテキストから派生キーを取得し、それを使用してクッキーに署名することは可能です(オプション3を確認してください)。
これらの詳細を抽出するために実行されたプロセスの詳細な説明は、こちらで確認できます: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/
2021年8月の修正以降、他のユーザーのPRTトークンを取得することは正確には機能しません。なぜなら、ユーザーのみが自分のPRTを取得できるからです(ローカル管理者は他のユーザーのPRTにアクセスできません)が、自分のPRTにはアクセスできます。
mimikatzを使用してPRTを抽出できます:
(Images from https://blog.netwrix.com/2023/05/13/pass-the-prt-overview)
Prtとラベル付けされた部分をコピーして保存します。
また、下にハイライトされている**ProofOfPossesionKey
フィールドのKeyValue
**のセッションキーも抽出します。これは暗号化されており、復号化するためにDPAPIマスタキーを使用する必要があります。
PRTデータが表示されない場合、デバイスがAzure ADに参加していないためにPRTがないか、古いバージョンのWindows 10を実行している可能性があります。
セッションキーを復号化するには、SYSTEMに権限を昇格させてコンピュータコンテキストで実行し、DPAPIマスタキーを使用して復号化できるようにする必要があります。次のコマンドを使用して実行できます:
現在、両方のコンテキスト値をコピーしたいです:
そして派生キー値を:
最後に、これらの情報を使用してPRTクッキーを生成できます:
https://login.microsoftonline.comに移動し、login.microsoftonline.comのすべてのクッキーをクリアして、新しいクッキーを入力します。
次に https://portal.azure.com に移動します。
残りはデフォルトのままで大丈夫です。ページを更新できて、クッキーが消えないことを確認してください。消える場合は、間違いを犯した可能性があり、プロセスを再度行う必要があります。消えない場合は、問題ありません。
まずPRTを更新し、roadtx.prt
に保存します:
これで、roadtx browserprtauth
を使用してインタラクティブブラウザでトークンを要求できます。roadtx describe
コマンドを使用すると、アクセス トークンにMFAクレームが含まれていることがわかります。これは、今回使用したPRTにもMFAクレームが含まれていたためです。
コンテキストと mimikatz によってダンプされた derived key があれば、roadrecon を使用して新しい署名付きクッキーを生成することが可能です:
AWSハッキングを学び、練習する:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングを学び、練習する:HackTricks Training GCP Red Team Expert (GRTE)