
Active Directory環境におけるリソースベースの制約付き委任攻撃パスを発見するためのツール
Active Directory環境でリソースベースの制約付き委任(Resource-Based Constrained Delegation)攻撃パスを発見するためのツール
ほぼ完全に、Elad Shamirによる素晴らしいブログ記事「Wagging the Dog: Abusing Resource-Based Constrained Delegation to Attack Active Directory」と、harmj0yによる「A Case Study in Wagging the Dog: Computer Takeover」に基づいています。実際に何が起こっているのかを理解したい場合は、これらの2つのブログ記事を読んでください。正直なところ、私自身も半分しか理解していません(それでも甘い見積もりです)。
私はC#にあまり詳しくないので、SharpSploitとSharpViewのソースコードを読みながら、C#でドメインと通信する方法を理解しました。
Get-RBCD-Threadは、現在のドメイン内のすべてのActive Directoryユーザー、グループ(「Domain Admins」や「BUILTIN\Administrators」などの特権グループは除く)、およびコンピュータオブジェクトをクエリし、それらのSIDのリストをコンパイルします。次に、Get-RBCD-Threadedは、ドメイン内のコンピュータオブジェクト上のすべてのDACLをADにクエリします。DACL内の各ACEについて、ユーザー/グループ/コンピュータのSIDのいずれかが、そのコンピュータオブジェクトに対して「GenericAll」「GenericWrite」「WriteOwner」「WriteDacl」の権限を持っているか、またはそのSIDがms-DS-Allowed-To-Act-On-Behalf-Of-Other-Identity属性(GUID:3f78c3e5-f79a-46bd-a0b8-9d18116ddc79)に対して「WriteProp」権限を持っているかがチェックされます。もし持っていれば、あなたはリソースベースの制約付き委任攻撃への道を進んでいることになります!
Visual Studioでコンパイルしてください。DACLオブジェクトの検索を高速化するためにParallel.ForEachを使用しているため、.NET v4以上が必要です。
-u|-username=、認証に使用するユーザー名
-p|-password=、ユーザーのパスワード
-d|-domain=、認証先の完全修飾ドメイン名
-s|-searchforest、信頼関係を通じてドメインとフォレストを探索します。すべてのドメインとフォレストを列挙します
-pwdlastset=、pwdLastSetに基づいてコンピュータをフィルタリングし、古いコンピュータオブジェクトを除外します。これを90に設定すると、pwdLastSetの日付が現在から90日以上前のコンピュータオブジェクトが結果から除外されます
-i|-insecure、LDAPSが接続の問題を引き起こしている場合、安全でないLDAP接続を強制します
-o|-outputfile=、CSVファイルに出力します。ファイルのフルパスとファイル名を指定してください
-h|-?|-help、ヘルプオプションを表示します
ユーザー名、パスワード、ドメインを指定して認証できるようになりました。u/p/dオプションが空白の場合、Get-RBCD-Threadedは現在のユーザーコンテキストでドメインに認証を試みます。
-oはCSVファイルに出力します。出力を保存するためのファイルのフルパスとファイル名を指定してください。
デフォルトの検索では、LDAPSを強制するためにポート636を使用するよう指定されています。これにより問題が発生する可能性があります。サーバーが利用できないなどというエラーが表示された場合は、「-i」フラグを試して接続文字列からポート636を削除してください。
「pwdLastSet」がフィルタリングオプションとして追加されました。大規模な環境では、ACLの「宛先」オブジェクトとして存在しなくなった古いコンピュータオブジェクトが多数存在し、RBCD攻撃に使用できなくなる可能性があります(少なくとも私の知る限りでは)。pwdLastSetを日数で設定します。例:「-pwdlastset=90」とすると、pwdLastSetの日付が現在の日時から90日以上前のコンピュータオブジェクトが結果から除外されます。
20,000以上のユーザー、グループ、コンピュータ(合計60,000以上のオブジェクト)がいる環境でテストしました。Get-RBCD-Threadは約60秒で完了しました。比較として、私がでっち上げたPowerViewコマンド(このgistにあります)で類似の検索を実行すると、数時間実行しても完了しませんでした。
このツールは委任攻撃を実行するわけではありません。その方法を理解するには、Elad Shamir氏とharmj0y氏のブログを読む必要があります。このツールは、RBCD攻撃の可能なターゲットを見つけるのに役立つだけです。
私のADラボでの使用例:

このツールはLDAPクエリを使用してActive Directoryをクエリするだけであり、検出は容易ではないかもしれません。大量のLDAPクエリ/トラフィックを1つのシステムに送信することをネットフローで検出できる可能性があります。
もう1つの検出方法は、ハニーポットアカウントを使用することです。アイデアは、何らかのユーザー/グループが書き込み権限を持つコンピュータオブジェクトを作成することです。RBCD攻撃は、コンピュータオブジェクトを変更し、そこにKerberosチケットを委任することに依存しています。ハニーポットコンピュータオブジェクトの検出ポイントとしては、以下の可能性があります:
私はこのツールをペネトレーションテストに役立てるために作成しました。しかし、防御側/ブルーチーム/システム管理者は、これを簡単に使用して自社環境の脆弱性を見つけ、(できれば)それを修正する方向に進むことができます。