0x00はじめに
2018年3月に、私は信頼されているAauthfordelegationプロパティが無意味であり、そのプロパティなしで「プロトコル変換」を実装できることを証明するために、意味のない議論を開始しました。制約代表団が有効になっている限り(MSDS-AllowedTodeLegatetoは空ではない)、「Kerberosのみ」または「認証プロトコル」を使用して機能するように構成されていると思います。
ベンジャミンデルピー(@gentilkiwi)の助けを借りてこの研究プロセスを開始しました。彼は、PACなしでS4U2Proxyをシルバーノートで呼び出す特定の攻撃をサポートするためにケケケオの修正を支援しました。それ以来、私はこの問題を研究してきました。皮肉なことに、私が最終的に失敗を受け入れるまで、他の興味深いエクスプロイトと新しい攻撃技術とともに解決策が続きました。
0x01 TL; Dr
この記事は非常に長く、多くの人がそれを読む時間や忍耐力がないことを非常によく知っているので、午後にこの記事の重要なポイントをリストします。
リソースベースの制約委任は、S4U2Proxyを呼び出す際に前向きなTGSを必要としません。
S4U2Selfは、信頼されたAOUTHFORDELEGATIONプロパティのステータスに関係なく、SPNを使用して任意のアカウントで実行できます。 TrustedToAuthFordeLegationが設定されている場合、S4U2Selfによって生成されたTGSは、委任または保護されたユーザーグループのメンバーに敏感な情報でない限り、前向きです。
上記のポイントは、攻撃者がActiveディレクトリ内のコンピューターオブジェクトを制御できる場合、ホストを破壊するためにオブジェクトを悪用する可能性があることを意味します。
S4U2Proxyは、リクエストで提供されている追加のTGSが転送されていない場合でも、フォワーダー容易なTGSを生成できます。
上記のポイントは、攻撃者がSPNと従来の制約代表団を備えたアカウントを使用して他のアカウントを攻撃する場合、TrustedToAuthFordeLegationプロパティが設定されているかどうかは関係ないことを意味します。
デフォルトでは、ドメインユーザーはMachineaCcountQuotaを悪用してコンピューターアカウントを作成し、そのためにSPNを設定できます。これにより、リソースベースの制約委任シミュレーションプロトコル変換が容易になりやすくなります(ユーザーのために破損したサービスに転送可能なTGを取得します)。
S4U2Selfは、委任に敏感なユーザーグループまたは保護されたユーザーグループとしてマークされたものを含む、すべてのユーザーに有効なTGを生成できます。生成されたTGSには、有効なKDC署名を備えたPACがあります。必要なのは、コンピューターアカウント資格情報またはTGTだけです。
上記のポイントは、制約のない代表団と「印刷エラー」と組み合わされて、リモートコード実行(RCE)につながる可能性があります。
KRBTGTアカウントのリソースベースの制約代表団により、TGTを任意のユーザーに対して生成することができ、永続的なテクノロジーとして悪用される可能性があります。
リソースベースの制限委任を介してHTTPからLDAPへのNTLMリレー構成は、MSSQLサーバーでのリモートコード実行(RCE)またはローカル許可エスカレーション(LPE)を容易にする可能性があります。
コンピューターアカウントはもっと楽しくなります。攻撃チェーンをトリガーするためのより多くのエクスプロイトポイントを探し始めます
0x02 Kerberos Delegation 101
Kerberos委任承認の乱用の分析に遅れをとっていない場合は、最初にWill Schroeder(@harmj0y)とLee Christensen(@tifkin_uuu)s4u2pwnageの記事を読む必要があります。その投稿では、彼らは私よりもそれについて詳しく説明しましたが、私はそれを可能な限り簡潔に概説しようとします。
まず、Kerberosの簡単な概要:
ユーザーがログインすると、パスワードから生成された暗号化キーを使用して情報(タイムスタンプ)を暗号化して、パスワードを知っていることを確認サーバーに証明します。このステップは、「事前認証」と呼ばれます。
Active Directory環境では、認証サーバーはドメインコントローラーです。
事前認証が成功した後、認証サーバーは、チケット助成金チケット(TGT)の限られた有効期間をユーザーに提供します
ユーザーがサービスの認証を希望する場合、ユーザーはTGTを認証サーバーに送信します。 TGTが有効な場合、ユーザーは「サービスチケット」とも呼ばれるチケット助成サービス(TGS)を受け取ります。
その後、ユーザーはTGSをアクセスするサービスに送信できます。これにより、ユーザーが認証され、TGSに含まれるデータに基づいて承認決定を下すことができます。
Kerberosについてのいくつかの重要なメモメモ:
各チケットには、プレーンテキストセクションと暗号化されたセクションがあります
法案のプレーンテキスト部分には、法案が対象となるサービスのサービスプリンシパル名(SPN)が含まれています
チケットの暗号化部分に使用される暗号化キーは、ターゲットサービスのアカウントのパスワードからエクスポートされます。
TGTは、組み込みアカウント「krbtgt」用に暗号化されています
TGTのSPNはKRBTGT/ドメインです
通常、サービスには、別のサービスにアクセスするためにユーザーのなりすましが必要です。これを容易にするために、Kerberosプロトコルに次の委任機能が紹介されています。
TrustedFordElegation:ユーザーはTGSを送信してTGTとともにサービスにアクセスし、サービスはユーザーのTGTを使用して他のサービスからユーザーを要求し、ユーザーをシミュレートできます。
制約付き委任(S4U2Proxy):ユーザーはTGSを送信してサービスにアクセスします( "Service A")。サービスを別の事前定義されたサービス(「サービスB」)に委任することが許可されている場合は、ユーザーが提供するTGSを認証されたサービスに提供し、ユーザーのサービスBにTGを取得できます。 TGSは、S4U2Proxyリクエストでは、フォローダブルフラグを設定する必要があることに注意してください。フォローダブルフラグは、「代表団に敏感」として構成されたアカウントに設定されることはありません(ユーザーは、Trueに設定された委任属性のメンバーを持っていません)または保護されたユーザーグループです。
プロトコル変換(S4U2Self/TrustedToedToeAuthFordElegation):S4U2Proxyは、認証サービスがユーザーが別のサービスにTGSを生成する前に、ユーザーにTGSを提供するサービスを必要とします。多くの場合、「添付のチケット」と呼ばれますが、ユーザーが実際にS4U2Proxyを呼び出すサービスを認証したという「証拠」と呼ぶのが好きです。ただし、ユーザーがNTLMやフォームベースの認証などの他のプロトコルを介してサービスを認証する場合があるため、TGSをサービスに送信しません。この場合、サービスはS4U2Selfを呼び出して認証サービスを要求して、任意のユーザーのTGSを生成し、S4U2Proxyを呼び出すときに「証拠」として使用できます。この機能により、ユーザーを模倣することができ、S4U2Selfを呼び出すサービスアカウントに信頼できるAOUTHFORDELEGATIONフラグが設定されている場合にのみ可能です。
0x03その他の制限された代表団
2018年10月には、リソースベースの制約委任の乱用に関する基本的な議論を提供するために、ウィルシュローダー(@harmj0y)と協力しました。ウィルはこのトピックに関する優れた記事を書いており、継続する前にそれを読むべきです。繰り返しになりますが、その投稿では、私よりもそれについて詳しく説明しますが、ここで非常に簡潔に概説します。
制約委任を構成するには、seadabledelegationの許可を持たなければなりません。これは敏感で、通常はドメイン管理者にのみ付与されます。ユーザー/リソースをより独立させるために、リソースベースの制約委任がWindows Server 2012に導入されました。リソースベースの制約代表団を使用すると、リソースがどのアカウントを委任できるかを構成できます。
このスタイルの制約付き委任は、従来の制約付き委任に非常に似ていますが、反対の構成があります。アカウントAからアカウントBへの従来の制約代表団は、MSDS-AllowedTodeLegatetoプロパティのアカウントAで構成され、AからBへの「発信」信頼を定義し、リソースベースの制約委任はMSDS-Allowed-ActonbehalfofofofofofofofofofofofofofofofofofofofofoforyのプロパティのアカウントBで構成され、B。
重要な点は、各リソースがそれ自体のリソースベースの制約委任を構成できることです。私の意見では、リソースが自分で信頼できる自分で決めさせることは理にかなっています。
ウィルと私は、特定のホストを破るために、次の虐待事件を思いつきました。
攻撃者は、信頼されたaauthfordelegationフラグ( "Service A")を設定したアカウントを破壊します
また、攻撃者は、ターゲットホストのコンピューターアカウント(「サービスB」)のリソースベースの制約付き委任許可を構成することにより、アカウントを攻撃します。
攻撃者は、サービスAからサービスBにリソースベースの制約代表団を構成します
攻撃者は、S4U2SelfとS4U2ProxyをサービスAとして呼び出して、特権ユーザーのTGSを取得してターゲットホストを破壊するためにBにサービスを提供します。
次の図は、この乱用のケースを示しています:
これは良いトリックですが、TrustedToeAuthFordeLegationフラグ設定を使用してアカウントを破ることは簡単な作業ではありません。私の研究で信頼されている研究がより効果的であれば、そのような虐待の場合に役立ちます。
0x04乱用ケース:S4U2自己スキップ
上記のACLベースのコンピューターIDの元の引数を使用するために、Rubeusをわずかに変更して、攻撃者がS4U2Proxyを呼び出すときにS4U2をスキップできるようにしました。ベンジャミンデルピーは、2018年4月にケケオにも変更を加えました。ただし、執筆時点では、Kekeoはリソースベースの制約委任をサポートしていません。
より一般的な虐待のケースは次のとおりです。
攻撃者はサービスAとDACLを妥協し、サービスBにリソースベースの制約代表団を構成します
ソーシャルエンジニアリングまたは水たまり攻撃を通じて、被害者はサービスにサービスを提供することを認証します(CIFSやHTTPなど)
攻撃者はMimikatz sekurlsa:を使用します:にサービスを提供するために、被害者のTGSを捨てるチケットまたはその他の方法
攻撃者は、サービスAからサービスBにリソースベースの制約代表団を構成します
攻撃者はRubeusを使用してS4U2Proxyを実行し、以前に得られたTGSは、被害者がサービスAからサービスBに必要とする「証拠」でした。
攻撃者はチケットを介してサービスにアクセスし、被害者Bになりすまします。
次の図は、この状況を示しています:
このシーンのビデオデモンストレーション:(https://youtu.be/7odfalcmldo)
S4U2Proxyは以前にTGS:を取得しています
S4U2Proxy応答(サービスBに対する)で生成されたTGSは、プリンシパルがデリゲートセンシティブまたは保護されたユーザーグループのメンバーとしてマークされない限り、前向きなフラグが設定されているように見えることに注意してください。
0x05セレンディピティ(偶発性)
Rubeusの変更をテストしていたときに、リクエストの送信の準備をしているとき、サービスAで信頼できるAauthfordelegation useraccountControlフラグをリセットし、S4U2自問を実行するときにエラーメッセージプロンプトが表示されることを期待しています。ただし、S4U2とS4U2Proxyの両方が実行され、生成されたTGSはサービスBにアクセスする許可を与えてくれます。
S4U2Selfから入手したチケットは前向きではありませんが、S4U2Proxyはまだそれを受け取り、サービスBのユーザーにTGS応答を実行します
この時点で、私は自分のラボ環境を完全に誤解したのだろうかと思います。
このシーンのビデオデモンストレーション:(https://youtu.be/iz6bjpr28r4)
信頼できる任意のアカウントでフォアロドラブルTGT:を入手してください
0x05誤解された機能
1。誤解された特性1
数時間のテスト、デバッグ、MSSFUの読み取りの後、S4U2自己の理解が間違っていることに気付きました。 S4U2は、TrustedToAuthFordElegation userAccountControlフラグが設定されているかどうかに関係なく、適切に機能しているようです。ただし、設定されていない場合、生成されたTGSはMS-SFUセクション3.2.5.1.2に従って転送されません。
「Service 1ボディのTrustedToAuthenticationFordElegationパラメーターが次のように設定されている場合:
True:KDCは、S4U2Selfサービスチケット([RFC4120]セクション2.6)に、フォワーダブルチケットフラグを設定する必要があります。
false and Servicesallowedtosendforwardedticketstoは空ではありません。KDCは、S4U2Selfサービスチケット([RFC4120]セクション2.6)でフォードバブルチケットフラグを設定できません。
2。誤解された特性2
それで、S4U2Proxyはまだ好調なチケットを使用してはいけませんか?
従来の(「外出」)制約代表団を備えた非軌道TGを使用してS4U2Proxyを呼び出しようとすると、失敗します。ただし、リソースベースの制約代表団( "in")は常に有効です。バグだと思ったので、2018年10月26日にMicrosoft Response Center(MSRC)に報告しました。
返信を待っている間に、MS-SFUをもう一度読み、セクション3.2.5.2を見つけました
「添付のチケットフィールドのサービスチケットがFordoundable20に設定されていない場合、PA-PACオプション[167]([MS-Kile]セクション2.2.10)Padataタイプには、リソースベースの制約委任ビットがあります。
設定されていない場合、KDCはStatus status_no_matchでkrb-err-badoptionオプションを返す必要があります。
kerb_validation_info構造([ms-pac]セクション2.5)のuseraccountcontrolフィールドにuser_not_delegatedビットを設定すると、kdcはkrb-err-badoptionオプションをステータスstatus_not_foundで返す必要があります。
これはデザインの欠陥のようであり、Microsoftの言葉では、「機能」でもあります。リソースベースの制約付き委任S4U2Proxyは、設計に装備不可能なTGを提供します!
上記のドキュメントによれば、TGSがリソースベースの制約委任のために転送する必要がない場合でも、ユーザーが「委任に敏感」に設定されている場合、S4U2Proxyは失敗することに注意してください。
0x06一般的なDACL乱用
これら2つの誤解された「機能」は、ACLベースのコンピューターターゲットの元の引数の唯一の要件は、コンピューターオブジェクトと別のアカウントでのDACL構成がリソースベースの制約代表団であることを意味します。 SPNのアカウントはすべてを行います。他のアカウントのTGTにすぎない場合でも、大丈夫です。
SPNの必要性の理由は、S4U2SelfがSPNなしでアカウントで動作しないように見えるからです。ただし、MachineaCcountQuota(デフォルトは10に設定されている)を乱用して、新しいコンピューターアカウントの作成を許可することにより、DomainユーザーはSPNでアカウントを取得できます。新しいコンピューターアカウントを作成すると、ユーザーはSPNを設定したり、後で追加したりできます。 Kevin Robertson(@netspi)は、PowerMadと呼ばれるツールを提供します。これにより、LDAPを介して実装できます。
一般虐待事件の実用的な原則は次のとおりです。
攻撃者は、SPNを持つか、アカウントを作成するか(「サービスA」)妥協し、DACLを使用してコンピューターアカウントでリソースベースの制約委任を構成します(「サービスB」)。
攻撃者はSPNを使用してアカウントを侵害するか、A(サービスA)を作成して、コンピューターアカウントでリソースベースの制約委任を構成します(「サービスB」)
攻撃者は、サービスAからサービスBにリソースベースの制約委任を構成します
攻撃者は、Rubesを使用して、サービスAからサービスB(S4U2SelfおよびS4U2Proxy)への完全なS4U攻撃を実行します。
攻撃者はチケットを渡してユーザーをシミュレートしてサービスBにアクセスできます。
次の図は、この状況を示しています:
このシーンのビデオデモンストレーション:(https://youtu.be/ayavtg7j_tq)
RBCDは、ACLベースのコンピューターの元のオブジェクトとして引き継ぎます。
ステップ3でS4U2Selfから取得したTGSは転送されていませんが、S4U2Proxyを呼び出す場合、「証拠」として使用されます。
0x07フォローダブル結果
S4U2Proxy応答で生成されたTGSをチェックすると、フォワーダブルフラグを設定します。 S4U2Proxyを「証拠」として再現不可能なTGSを備えたS4U2Proxyを提供し、前向きなTGSを取得しました。
これはバグですか、それとも機能ですか?
私はMS-SFUセクション3.2.5.2.2に戻り、以下を見つけました。
「KDCは、以下の場合はサービスチケットに応答する必要があります。
スナムフィールドには含まれています
Recommended Comments