
このPOCは、BlackHat USA 2022でJames Forshaw(@tiraniddo)氏が発表した「Taking Kerberos To The Next Level」というトピックに触発されたものです。彼は、Kerberosチケットを悪用してUACバイパスを実現するデモを公開しました。サービスチケットにKERB-AD-RESTRICTION-ENTRYを追加し、偽のMachineIDを入力することで、SCMにアクセスしてシステムサービスを作成し、簡単にUACをバイパスしてSYSTEM権限を取得できます。James Forshawは、この原理を「Bypassing UAC in the most Complex Way Possible!」というブログ記事で説明しており、私はそれに非常に興味を持ちました。彼は完全なエクスプロイトコードを提供していませんでしたが、私はRubeusをベースにPOCを構築しました。Rubeusは、生のKerberos操作とチケット悪用のためのC#ツールセットであり、Kerberosリクエストを簡単に開始し、チケットを操作できる便利なインターフェースを提供します。
KRBUACBypassに関する関連記事は、私のブログ「Revisiting a UAC Bypass By Abusing Kerberos Tickets」でご覧いただけます。背景原理や実装方法についても説明しています。記事でも述べたように、この記事は@tiraniddo氏の「Taking Kerberos To The Next Level」に触発されたものです(彼の共有がなければ実現できませんでした)。そして、私は大学卒業前にこれをツールとして実装しました。
現在のユーザーの資格情報を持っていないため、手動でTGTを生成することはできません。しかし、Benjamin Delpy(@gentilkiwi)は、自身のKekeoに、非制約の委任を悪用してセッションキー付きのローカルTGTを取得するトリック(tgtdeleg)を追加しました。
Tgtdelegは、Kerberos GSS-APIを悪用して、ホスト上で昇格した権限を取得することなく、現在のユーザーが利用可能なTGTを取得します。この方法は、AcquireCredentialsHandle関数を使用して現在のユーザーのKerberosセキュリティ資格情報ハンドルを取得し、InitializeSecurityContext関数をHOST/DC.domain.comに対して、ISC_REQ_DELEGATEフラグとターゲットSPNを使用して呼び出し、擬似委任コンテキストを準備してドメインコントローラーに送信します。これにより、GSS-API出力のKRB_AP-REQに、Authenticator Checksum内のKRB_CREDが含まれるようになります。その後、サービスチケットのセッションキーがローカルKerberosキャッシュから抽出され、Authenticator内のKRB_CREDを復号して使用可能なTGTを取得します。Rubeusツールセットにもこの手法が組み込まれています。詳細については、「Rubeus – Now With More Kekeo」を参照してください。
このTGTを使用すると、独自のサービスチケットを生成でき、実行可能な操作手順は次のとおりです。
KERB-AD-RESTRICTION-ENTRYを追加するが、偽のMachineIDを入力する。サービスチケットを取得したら、Kerberos認証を使用して、Service Control Manager (SCM) Named PipesまたはTCP(HOST/HOSTNAMEまたはRPC/HOSTNAME SPN経由)にアクセスできます。SCMのWin32 APIは常にNegotiate認証を使用することに注意してください。James Forshawは簡単なPOCを作成しました:SCMUACBypass.cpp。2つのAPI(AcquireCredentialsHandleとInitializeSecurityContextW)をフックし、SCMが呼び出す認証パッケージの名前(pszPackage)をKerberosに変更することで、ローカル認証時にSCMがKerberosを使用できるようにします。
詳細については、以下をお読みください。
それでは、実行結果を見てみましょう。下図に示すように、まずasktgs関数を使用して現在のサーバーのHOSTサービスのチケットを要求し、次にkrbscmを使用してシステムサービスを作成し、SYSTEM権限を取得します。
KRBUACBypass.exe asktgs
KRBUACBypass.exe krbscm
