Az - Pass the PRT
PRTとは何ですか
pageAz - Primary Refresh Token (PRT)PRTを持っているかどうかを確認します
PRT クッキー
PRT クッキーは実際には x-ms-RefreshTokenCredential
と呼ばれ、JSON Web トークン(JWT)です。JWT には 3つの部分、ヘッダー、ペイロード、署名 が含まれており、.
で区切られ、すべて URL セーフな base64 エンコードされています。典型的な PRT クッキーには、以下のヘッダーと本文が含まれています。
実際の**プライマリリフレッシュトークン(PRT)は、Azure ADの管理下にあるキーによって暗号化されたrefresh_token
内にカプセル化されており、その内容は不透明で解読不能です。is_primary
**フィールドは、このトークン内にプライマリリフレッシュトークンがカプセル化されていることを示します。クッキーが意図された特定のログインセッションにバインドされたままであることを確認するために、request_nonce
がlogon.microsoftonline.com
ページから送信されます。
TPMを使用したPRT Cookieフロー
LSASSプロセスはKDFコンテキストをTPMに送信し、TPMはセッションキー(AzureADに登録されたときに収集され、TPMに保存された)と前のコンテキストを使用してキーを派生し、この派生キーを使用してPRTクッキー(JWT)を署名します。
KDFコンテキストはAzureADからのノンスとPRTがJWTを作成し、コンテキスト(ランダムバイト)と混合されたものです。
したがって、TPM内にPTRがあるため抽出できなくても、LSASSを悪用して新しいコンテキストから派生キーを要求し、生成されたキーを使用してクッキーに署名することが可能です。
PRTの悪用シナリオ
通常のユーザーとして、LSASSにSSOデータを要求することが可能です。 これは、ネイティブアプリがWeb Account Manager(トークンブローカー)からトークンを要求するように行うことができます。WAMはリクエストをLSASSに渡し、LSASSは署名されたPRTアサーションを使用してトークンを要求します。また、ブラウザベース(Web)フローでは、PRTクッキーがヘッダーとして使用され、Azure ASログインページへのリクエストの認証に使用されます。
SYSTEMとしては、TPMによって保護されていない場合はPRTを盗むか、暗号APIを使用してLSASS内のPRTキーとやり取りすることができます。
PRTの渡し攻撃の例
攻撃 - ROADtoken
この方法についての詳細はこの投稿を参照してください。ROADtokenは、BrowserCore.exe
を適切なディレクトリから実行し、それを使用してPRTクッキーを取得します。このクッキーは、ROADtoolsを使用して認証し、永続的なリフレッシュトークンを取得するために使用できます。
有効なPRTクッキーを生成するためには、最初にノンスが必要です。 これは次のようにして取得できます:
または、roadreconを使用する:
次に、新しいPRTを取得するためにroadtokenを使用できます(ユーザーのプロセスから攻撃を実行するためにツールを実行します):
以下は、PRTを渡す方法についての情報です。PRTを取得するためには、Azure ADのデバイス登録情報を使用して、デバイスコンテキストで認証を行う必要があります。これにより、クラウド上の権限を使用してオンプレミスネットワークにアクセスできます。
次に、生成されたクッキーを使用して、Azure AD GraphまたはMicrosoft Graphを使用してログインするためのトークンを生成できます:
攻撃 - roadrecon を使用
攻撃 - AADInternals と漏洩した PTR を使用
Get-AADIntUserPRTToken
は、Azure AD に参加しているかハイブリッドに参加しているコンピュータからユーザーの PRT トークンを取得します。BrowserCore.exe
を使用して PRT トークンを取得します。
また、Mimikatzから値を取得している場合は、AADInternalsを使用してトークンを生成することもできます:
https://login.microsoftonline.comに移動し、login.microsoftonline.comのすべてのクッキーを削除して新しいクッキーを入力します。
次に、https://portal.azure.com に移動してください。
残りの手順はデフォルトのままにしてください。ページを更新してもクッキーが消えないことを確認してください。もし消えてしまった場合は、間違いがある可能性があり、手順をやり直す必要があります。消えない場合は、問題ありません。
攻撃 - Mimikatz
手順
LSASS (Local Security Authority Subsystem Service) から PRT (Primary Refresh Token) が抽出され、後続の使用のために保存されます。
次に、セッションキーが抽出されます。このキーは最初に発行され、その後ローカルデバイスによって再暗号化されるため、DPAPI マスターキーを使用して復号する必要があります。DPAPI (Data Protection API) に関する詳細情報は、次のリソースで見つけることができます: HackTricks およびその適用については、Pass-the-cookie attack を参照してください。
セッションキーの復号後、PRT の派生キーとコンテキストが取得されます。これらは、PRT クッキーの作成に不可欠です。具体的には、派生キーは、クッキーを構成する JWT (JSON Web Token) に署名するために使用されます。このプロセスの包括的な説明は、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 を抽出できます:
Prtとラベルされた部分をコピーして保存します。
また、以下でハイライトされている**ProofOfPossesionKey
フィールドのKeyValue
**(セッションキー)も抽出します。これは暗号化されており、DPAPIマスターキーを使用して復号する必要があります。
PRTデータが表示されない場合は、デバイスがAzure ADに参加していないか、Windows 10の古いバージョンを実行している可能性があります。
セッションキーを復号化するには、DPAPIマスターキーを使用して復号するために権限を昇格してSYSTEMで実行する必要があります。次のコマンドを使用してください:
オプション1 - フルMimikatz
今、あなたは両方のコンテキスト値をコピーしたいと思います:
そして導出されたキー値:
最後に、この情報をすべて使用してPRTクッキーを生成できます:
https://login.microsoftonline.com に移動し、login.microsoftonline.com のすべてのクッキーをクリアして新しいクッキーを入力します。
次に、https://portal.azure.com に移動します。
残りの手順はデフォルトのままにしてください。ページを更新してもクッキーが消えないことを確認してください。もし消えてしまった場合は、何か間違いがある可能性があり、手順をやり直す必要があります。消えない場合は、問題ありません。
オプション2 - PTRを使用したroadrecon
まずPRTを更新し、それを
roadtx.prt
に保存します:
これで、
roadtx browserprtauth
を使用してインタラクティブブラウザから トークンをリクエスト できます。roadtx describe
コマンドを使用すると、アクセス トークンには MFA クレームが含まれていることがわかります。なぜなら、この場合に使用した PRT にも MFA クレームが含まれていたからです。
オプション3 - 派生キーを使用したroadrecon
mimikatzによってダンプされたコンテキストと派生キーを持っていると、roadreconを使用して新しい署名付きクッキーを生成することが可能です:
参考文献
最終更新