※本記事は、https://www.secureworks.com/ で公開されている DUMPING NTHASHES FROM MICROSOFT ENTRA ID を翻訳したもので、 2023年12月20日執筆時点の見解となります。
概要
Microsoft Entra ID(旧称:Azure Active Directory(Azure AD)[1])は、クラウドベースのIDおよびアクセス管理サービスです。ユーザーパスワードは平文ではなく、MD4アルゴリズムを使用して各パスワードからNTハッシュを計算し、解読を防ぐために1,000回再ハッシュ化して保存されます。2022年12月にAzure ADの脆弱性を調査している際、Secureworks® Counter Threat Unit™(CTU)のリサーチャーは、保存されているNTハッシュをMicrosoft Graph API経由で復元し、Azure AD Domain Services(Azure AD DS)[2]ドメインコントローラーに保存されている証明書を使用して復号できることを発見しました。得られたNTハッシュ値はPass-the-Hash攻撃に使用できます。
CTU™リサーチャーは2022年12月23日、この調査結果をMicrosoftと共有しました。Microsoftはこの調査結果を2023年1月27日に確認し、意図した挙動であると述べました。
Azure ADのパスワード
ユーザーのパスワードを保存するとき、Azure ADではパスワードハッシュ同期(PHS)と同じハッシュアルゴリズムが使用されます。PHSはまず、平文パスワードからMD4アルゴリズムを使用して作成されたNTハッシュ値を取得します。次に、NTハッシュ値にランダムな文字列(ソルト)を付加してパスワードベースの鍵導出関数(PBKDF2)に渡し、ストレッチングのためにHMACSHA256ハッシュアルゴリズムを使用して 1,000 回繰り返しハッシュ化します。最終的なハッシュ値は不可逆であるため、平文パスワードもNTハッシュ値も復元できません。
Azure AD Domain Services
Azure AD DSでは、Active Directory Domain Services(AD DS)を必要とするワークロードをAzureで実行でき、ドメインコントローラーを展開したり管理したりする必要がありません。Azure AD DSが展開されると、組織が選択したAzureサブネットに2つのドメインコントローラーが展開されます。これらのドメインコントローラーはMicrosoftによって管理されます。組織は、レプリカセットを介して、サブネットごとに1つずつ、追加のドメインコントローラーを展開できます(図1参照)。ドメインコントローラーはMicrosoftのバックボーンネットワークを介して複製されます。
図1. Azure AD DSトポロジー(出典:Secureworks)
Azure AD DSを展開すると、Azure ADはユーザーのNTハッシュの保存を開始します。次に、これらのハッシュは、Azure AD DSドメインコントローラーと同期されます。組織がハイブリッドIDを使用している場合、Azure AD Connect[3]は、オンプレミスのActive Directory環境からAzure ADへのユーザーのNTハッシュの自動同期を開始します。Azure AD DSがユーザーとNTハッシュをAzure ADから同期するために使用するメカニズムは不明でした(図2参照)。
図2. ユーザーとNTハッシュの同期(出典:Secureworks)
2022年12月、CTU™リサーチャーが発見したこの脆弱性により、攻撃者はAzure AD DSドメインコントローラーを侵害し、ドメイン管理者アクセスを取得し、NTハッシュをダンプすることができます(図3参照)。ドメイン管理者アクセス権を使用して、リサーチャーはAzure AD DS実装の詳細を調査することもできました。
図3. Azure AD DSの攻撃経路(出典:Secureworks)
Azure AD DSのパスワード同期
Microsoftのドキュメントによると、Azure ADは、「暗号化されたHTTPセッションを介した内部同期メカニズム」を使用して、暗号化されたNTHashをAzure AD DSにプッシュします。さらに、Azure AD DSはAzure Key Vaultから復号キーを取得してパスワードを復号します。また、Microsoftは、Azure AD DSだけが復号キーにアクセスできるとも述べています。
CTUリサーチャーは、Azure AD DSドメイン コントローラーを調査した際に、Azure AD DSの同期がDCaaS AadSync Agentサービスによって実行されていると判断しました(図4参照)。DCaaS(Domain Controller as a Service)は、Azure AD DSの技術名です。
図4. Azure AD DS同期エージェント(出典:Secureworks)
DCaaS AadSyncエージェントは、Microsoft Graph APIを使用して、Azure ADからユーザーとNTハッシュを取得します。ユーザーを同期するための最初のリクエストには、Azure ADから同期されるすべてのプロパティが含まれています(図5参照)。プロパティのうち2つ(windowsLegacyCredentialsとwindowsSupplementalCredentials)は、MS Graph APIユーザーオブジェクトスキーマの一部ではありません。
図5. 最初のMS Graph APIリクエスト(出典:Secureworks)
後続のリクエストは、deltaクエリを使用して30秒ごとに実行されました(図6参照)。
図6. 後続のMS Graph APIリクエスト(出典:Secureworks)
Azure AD DS同期エージェントは、同期にAzure AD Domain Services Syncアプリケーションを使用します(図7参照)。このアプリケーションは、Azure AD DSの展開中にインストールされます。このアプリケーションのみが、windowsLegacyCredentialsプロパティとwindowsSupplementalCredentialsプロパティを読み取ることができます。
図7. 同期アプリケーションの名前とID(出典:Secureworks)
アプリケーションは、認証にDCaaS Sync Engine証明書を使用するように設定されています(図8参照)。対応する証明書は、Azure AD DSドメインコントローラー上のローカルマシンの個人ストアに保存されました(図9参照)。
図8. Azure portalで定義された同期アプリケーション認証証明書(出典:Secureworks)
図9. ドメインコントローラー上の同期アプリケーション証明書(出典:Secureworks)
資格情報のBlobの復号に使用されるDCaaS Password Hash Encryption証明書も、ドメインコントローラーの証明書ストアに保存されていました(図10参照)。したがって、ドキュメントに記載されているように、証明書はAzure Key Vaultには保存されていませんでした。
図10. ドメインコントローラーに保存されたパスワードハッシュ復号証明書(出典:Secureworks)
Azure AD DSの展開後にAzure AD Connectがパスワードを同期する場合、同期リクエストにはWindowsLegacyCredentialsとWindowsSupplementalCredentialsが含まれます(図11の34行目と35行目を参照)。どちらの属性にも、Base64でエンコードされた資格情報のBlobが含まれています。
図11. Azure AD Connectのパスワードハッシュ同期リクエスト(出典:Secureworks)
Azure AD Connectは、GetADAuthInfo関数を使用して資格情報のBlobを生成します。この関数はファイルADAuthInfoGenerator.dllに含まれています(図12参照)。
図12. ADAuthInfoGenerator.dllの場所(出典:Secureworks)
図13は、GetADAuthInfo関数が、Encrypt関数を呼び出してパスワードBlobを暗号化し(77行目)、WriteADAuthInfo関数を呼び出して資格情報Blobを生成している(90行目)ことを示しています。
図13. GetADAuthInfo関数(出典:Secureworks)
Encrypt関数を調べると、暗号化の詳細が明らかになります(図14、216~223行を参照)。結果として得られるバイト列は、関数の224行目で反転されます。
図14. Encrypt関数(出典:Secureworks)
WriteADAuthInfo関数には、同期されたBlobの詳細が含まれています(図15の22~29行目を参照)。
図15. WriteADAuthInfo関数(出典:Secureworks)
図16は、資格情報Blobの構造を示しています。
図16. 暗号化Blobの構造(出典:Secureworks)
Encrypt関数で暗号化されたパスワードBlobは、オンプレミスのActive Directory環境からのunicodePwd属性です。図17は、パスワードBlobの構造を示しています。
図17. パスワードBlobの構造(出典:Secureworks)
Azure ADからのNTハッシュのダンプ
ドメイン管理者はドメインコントローラーへのフルアクセス権を持っているため、Azure ADからNTハッシュをダンプするために、同期アプリケーション証明書とパスワードハッシュ復号証明書の両方をエクスポートしリモートから使用できます。図18は、この攻撃経路を含む、更新されたAzure AD DS攻撃チャートを示しています。
図18. Azure AD DSの攻撃チャート図(出典:Secureworks)
Azure AD DSは証明書を定期的に更新するため、攻撃者はAzure AD DSドメインコントローラーへの永続的なアクセスが必要になります。ただし、Azure AD Domain Services Syncアプリケーションは組織のAzure ADテナントに直接展開されるため、グローバル管理者またはクラウドアプリケーション管理者のロールを持つ管理者は、新しいアプリケーション資格情報を追加できます。その結果、DCaaS Sync Engine証明書を必要とせずにユーザーの資格情報にアクセスできるようになります。
新しいユーザーが作成されるとき、またはユーザーがパスワードを変更するとき、Azure ADに保存されているNTハッシュは、現在のDCaaS Password Hash Encryption証明書を使用して暗号化されます。その結果、Azure ADでは、複数の証明書を使って暗号化されたNTハッシュが存在する可能性があります。すべてのパスワードを復号するには、攻撃者はパスワードの暗号化に使用されたすべての証明書にアクセスできる必要があります。
Microsoft社とのやり取り
2022年12月23日、CTUリサーチャーは、特定の管理者がAzure AD Domain Services Syncに追加の資格情報を付与することでレガシー資格情報属性にアクセスできることをMicrosoftセキュリティレスポンスセンター(MSRC)に通知しました。MSRCは2023年1月27日、次のように回答しました:
これは、(中略)攻撃者が復号するための証明書を持っている場合を除き、設計時に考慮されています。証明書部分は(中略)対応されているため、この件は解決済みとみなされます。
これは、クラウドアプリケーション管理者ロールとグローバル管理者ロールの両方がAAD内で高い特権を与えられているため、設計上の構造とみなされています。そして、事例で説明されているように、両者は私たちのアプリケーションを変更する権限を持っています。また、当社が保有する最新のドキュメンテーションによると、クラウドアプリケーション管理者を使用して、権限を昇格し、アプリIDを偽装できます。
結論
組織がAzure AD DSを使用している場合、Azure ADにはNTハッシュを含むユーザーのレガシー資格情報が保存されます。この保存の目的は、これらの資格情報をAzure AD DSドメインコントローラーと同期できるようにすることです。資格情報は、Azure AD DSドメインコントローラー証明書ストアから入手できる定期的に更新される証明書を使用して暗号化されます。特定のAzure AD Domain Services Syncアプリケーションのみが、Azure ADに保存されている資格情報にアクセスできます。グローバル管理者またはクラウドアプリケーション管理者のロールを持つ管理者は、新しいアプリケーション資格情報を追加して、Azure AD DSドメインコントローラーにアクセスせずに、暗号化されたレガシー資格情報を取得できます。レガシー資格情報は、ユーザーのパスワードがリセットされるまでAzure ADに保存され、Azure AD DSドメインコントローラーで利用可能な証明書を使用して暗号化されます。復号するには、これらの証明書へのアクセスが必要です。
Azure AD DSを使用している組織は、疑わしいイベントがないかAzure AD監査ログを定期的に監視する必要があります。これらのイベントには、Azure AD Domain Services Syncアプリケーションへの新しい証明書またはシークレットの追加が含まれます。2023年10月27日、MicrosoftはMicrosoft Graphアクティビティログがパブリックプレビューで利用できると発表しました。これらのログにより、NTハッシュの進行中のダンプを検出できます。組織は、侵害の兆候を検出した場合、直ちにMicrosoftサポートに連絡する必要があります。
付録:KQLクエリ
次のクエリの結果は、将来的にNTハッシュのダンプが実行される可能性を示す場合があります。
- Azure AD DSサービスプリンシパル作成の特定:
AuditLogs | where Category == "ApplicationManagement" | where OperationName == "Add service principal" | where TargetResources[0].displayName == "Azure AD Domain Services Sync" | where InitiatedBy.app.displayName == "Domain Controller Services"
- Azure AD DS同期アプリケーション作成の特定:
AuditLogs | where Category == "ApplicationManagement" | where OperationName == "Add application" | where TargetResources[0].displayName == "Azure AD Domain Services Sync" | where InitiatedBy.app.displayName == "Domain Controller Services"
次のKQLクエリは、Azure AD DS Syncアプリへの追加の資格情報の付与を特定します。資格情報を更新する正当なユースケースがないため、将来的にNTハッシュのダンプが行われる可能性を示します:
AuditLogs | where Category == "ApplicationManagement" | where OperationName contains "Certificates and secrets management" | where TargetResources[0].displayName == "Azure AD Domain Services Sync" | where InitiatedBy.app.displayName != "Domain Controller Services"
次のKQLクエリは、MicrosoftGraphActivityLogs(公開されている場合)から進行中のNTHashダンプを識別できます:
let AADDS_appId = AADServicePrincipalSignInLogs | where TimeGenerated > now() - 10m | where ServicePrincipalName == "Azure AD Domain Services Sync" | distinct AppId;
MicrosoftGraphActivityLogs | where RequestMethod == 'GET' | where AppId == AADDS_appId | where RequestUri !contains '/users/microsoft.graph.delta()?$deltatoken'
[1]この脅威分析は、調査時のAzure ADの用語で記述されています。
[2]現在はMicrosoft Entra Domain Services。
[3]現在はMicrosoft Entra Connect。