このツールを使用すると、次のことを検出できるようになります。
COM オブジェクトへの不正なアクセス制御 (LaunchPermission 、 AccessPermission) - 悪用可能な COM メソッドを介した LPE、DCOM 認証リレー。それがPermissionHunter
です。
COM オブジェクトに対する不正なレジストリ権限 - COM ハイジャックによる LPE。それがComDiver
です。
新しい標高モニカー - UAC バイパスを見つけます。それがMonikerHound
です。
特定の CLSID に関する詳細情報を取得します。COM オブジェクトを検査して、悪用可能な COM メソッドを見つけます。それがClsidExplorer
です。
権限の低いユーザーに代わってクロスセッション アクティベーションを確認します - LPE のために他の人のセッションでオブジェクトをインスタンス化しようとしています。それがComTraveller
です。
このツールを数か月前 (2024 年春など) に公開していたら、CVE-2024-38100 (FakePotato) と CVE-2024-38061 (SilverPotato) が発見されていたでしょう。
このツールを使い始めると、Windows システムで特権を昇格するさらに多くの方法が見つかります。自動化された OleViewDotnet のようなものです :)
PermissionHunter は、システム上のすべての COM オブジェクトの LaunchPermission と ActivatePermission を検査できるツールです。
PS A:mzhmo> .PermissionHunter.exe -h 、「-。 .-' ,-"`````""-__ | / '-.._ _.-'` '-o, _>--:{{< ) |) .-" '-.__ .-o` '-._____..-/` | 、-'/`-。 ` PermissionHunter - 不正な LaunchPermission および ActivatePermission を探す CICADA8 研究チーム Michael Zhmaylo (MzHmO) より PermissionHunter.exe 不正な LaunchPermission および ActivatePermission を持つ脆弱な COM オブジェクトを見つけることができる小さなツール [OPTIONS]-outfile : 出力ファイル名-outformat : 出力形式。受け入れられる 'csv' および 'xlsx'-h/--help : このウィンドウを表示します
ここでの引数は 2 つだけです。
-outfile
- 権利レポートが含まれるファイルの名前。
-outformat
- レポートを含むファイルの形式。csv と xlsx の両方で出力できます。 Excelが無いとxlsx形式で出力できないのでcsvで出力した方が良いです。
例:
PS A:mzhmo> .PermissionHunter -outfile result -outformat xlsx 、「-。 .-' ,-"`````""-__ | / '-.._ _.-'` '-o, _>--:{{< ) |) .-" '-.__ .-o` '-._____..-/` | 、-'/`-。 ` PermissionHunter - 間違った LaunchPermission と ActivatePermission を探します CICADA8 研究チーム Michael Zhmaylo (MzHmO)[+] より 結果は結果に表示されます、形式は xlsx[+] 成功
その後、result.xlsx ファイルを取得します。このファイルには、既存の COM オブジェクトに対するすべての権限がリストされます。
次の列を出力します。
ApplicationID
- 特定の COM オブジェクトのアプリケーション ID。例: {69AD4AEE-51BE-439b-A92C-86AE490E8B30}
;
ApplicationName
- 特定の COM オブジェクトの ApplicationName。例: Background Intelligent Transfer Service
;
RunAs
- COM オブジェクトの RunAs レジストリ キー。例: Interactive User
;
LaunchAccess
、 LaunchType
、 LaunchPrincipal
、 LaunchSid
- LaunchPermission レジストリ キー。 LaunchPrincipal は、COM オブジェクトに対する LaunchAccess 権限を持つユーザーを指定します。 LaunchType - ACE のタイプ: 有効化または無効化。 LaunchSID - LaunchPrincipal の SID。元:
ローカル起動。リモート起動。ローカルアクティベーション。 RemoteActivation AccessAllowed NT AUTHORITYSYSTEM S-1-5-18
これは、システムがこの COM オブジェクトに対する LocalLaunch、RemoteLaunch、LocalActivation、RemoteActivation のアクセス許可を持っていることを意味します。
AccessAccess
、 AccessType
、 AccessPrincipal
、 AccessSID
- フィールドは、AccessPermission のコンテキストでのみ LaunchPermissions と同じ意味を持ちます。
AuthLevel
、 ImpLevel
- 認証レベルと偽装レベル。デフォルトでは、これらはRPC_C_AUTHN_LEVEL_CONNECT
およびRPC_C_IMP_LEVEL_IDENTIFY
に設定されます。
CLSIDs
- COM オブジェクト CLSID。
たとえば、権限の低いユーザーの代わりにアクセスできる COM オブジェクトを見つけた場合は、次のように悪用できます。
インスタンスを作成し、その COM オブジェクトのメソッドを呼び出して、たとえばシステムに代わって任意のファイルを書き込みます。 たとえば、 NT AUTHORITYSYSTEM
アカウントに代わって実行されるDeployCmdShell()
メソッドを含む COM オブジェクトが見つかり、 LaunchPermissions
とAccessPermissions
あるとします。この COM オブジェクトを開始し、 DeployCmdShell()
メソッドを呼び出して、システムに代わってコードを実行できます。 ClsidExplorer
使用して、使用可能なメソッドを表示できます。
DCOM 認証を悪用します。これについては、「RemoteKrbRelay」を参照してください。
COM オブジェクトに関するすべての情報はレジストリにあります。しかし、登録が間違っていたらどうなるでしょうか?このような場合、実行可能ファイルをハイジャックするなど、COM 設定をオーバーライドする可能性があります。
このツールを使用すると、このような脆弱性を検出でき、COM オブジェクトの検索時に表示されるキーの優先順位に従ってレジストリをスキャンします。このようにして、Shadow COM ハイジャックを見つけることもできます。優先順位は次のとおりです。
1.HKCUSoftwareClasses(GUID)の扱い 2.HKLMSoftwareClasses(GUID)の扱い 3.HKCUSoftwareClasses(GUID)InprocServer32 4.HKLMSoftwareClasses(GUID)InprocServer32 5. HKCUSoftwareClasses(GUID)LocalServer32 6. HKLMSoftwareClasses(GUID)LocalServer32
したがって、特権昇格には少なくとも 2 つのベクトルが現れます。
HKCU...TreatAs
への書き込み権限があり、元の COM 実行可能ファイルがHKCU...LocalServer32
にある場合、実行可能ファイルをHKCU..TreatAs
に書き込むことでシャドウ COM ハイジャックを実行できます。
COM オブジェクトがHKCU..LocalServer32
にあり、 HKCU..LocalServer32
に書き込むことができる場合、COM ハイジャックを行うことができます。
ツールを詳しく見てみましょう。
PS A:ssdgitrepoCOMThanasiaComDiverx64Debug> .ComDiver.exe -h / o ^ o / ( ) / ____________(%%%%%%%)____________ ( / / )%%%%%%%( ) (__/__/__/________) ( / /(%%%%%%%) ) (__/___/ (%%%%%%%) _____) /( ) / (%%%%%) (%%%) !--------------- コムダイバー -------------- [?] com オブジェクトの安全でないレジストリとディスクのアクセス許可をチェックするための小さなツール [?] ARGS -h/--help <- このメッセージを表示 --from<- この clsid から CLSID を分析します --target <- 1 つのターゲット CLSID を分析します --no-context <- 別の COM サーバー コンテキストをチェックしません。レジストリの解析のみ。 --no-create <- ターゲットの COM オブジェクトを作成しません。これが最速モードです
次の引数を受け入れます。
--from
- Windows システムには多数の CLSID があります。ツールで最初からすべての CLSID を調べたくない場合は、たとえば--from {50FDBB99-5C92-495E-9E81-E2C2F48CDDA}
のように開始する CLSID を指定できます。
--target
- 特定の clsid を分析します。
--no-context
- COM オブジェクトを起動するユーザーの名前をチェックしません。
--no-create
- 検出された COM オブジェクトを作成しません。これにより、それに関して取得できる情報が制限されます。ただし、これはレジストリの権利のみを調べる最も速い方法です。
例:
.ComDiver.exe --no-create
この場合、HKCU 内にはキーがなく、それらのキーへの書き込み権限があることがわかります。したがって、このパスに独自の値を書き込むと、COM ハイジャックが行われてしまいます。
ツールの出力に赤い線が表示される場合、これは COM オブジェクトを悪用する可能性があります。 COM ハイジャック (既存の実行可能ファイルのスプーフィング) またはシャドウ COM ハイジャック (見つからない実行可能ファイルのスプーフィング) を実行できます。 COM ハイジャックの詳細については、こちらをご覧ください。
Windows システムでは UAC をバイパスする組み込みの方法があり、これは昇格モニカーを通じて行われます。詳細については、こちらをご覧ください。この種の UAC バイパスには、COM オブジェクトをレジストリに登録する非標準的な方法が必要ですが、これは追跡が非常に簡単です。したがって、私のツールを使用して、UAC バイパスの新しい方法を見つけることができます。
例:
PS A:ssdgitrepoCOMThanasiaMonikerHoundx64Debug> .MonikerHound.exe 、_ _ _、おお/ 、(.-.)、 _/ |) (| _ /=-=/ ,| =/ |, _/ | / _ _!_/ MonikerHound - 独自の UAC バイパスを見つけてください! CICADA8研究チーム マイケル・ズマイロ (MzHmO) より [+] 標高モニカの潜在的な COM サーバーが見つかりました!名前: CEIPLuaElevationHelper CLSID: {01D0A625-782D-4777-8D4E-547E6457FAD5} LocalizedString: @%systemroot%system32werconcpl.dll,-351 有効: 1 IconReference: @%systemroot%system32werconcpl.dll,-6 アクティブ化: 成功 PID: 15800 DllHost.exe [+]................................[+] [+] 昇格モニカーの潜在的な COM サーバーが見つかりました!名前: CTapiLuaLib クラス CLSID: {03e15b2e-cca6-451c-8fb0-1e2ee37a27dd} LocalizedString: @%systemroot%system32tapiui.dll,-1 有効: 1 IconReference: @%systemroot%system32tapiui.dll,-201 アクティブ化: 成功 PID: 440 DllHost.exe [+]................................[+]
UAC バイパスの潜在的な候補を見つけたら、それらのチェックを開始できます。 Elevation Moniker を実行するための優れたテンプレートとして、この関数またはこのプログラムを使用できます。
ClsidExplorer を使用すると、特定の CLSID に関する情報を取得できます。プログラムは次のデータを出力します。
AppID
- 特定の COM オブジェクトのアプリケーション ID。
ProgID
- 特定の COM オブジェクトの ProgID。
PID
- この COM オブジェクトが実行されている PID。
Process Name
- PID プロセスの名前。
Username
- プロセスを実行しているユーザーの名前。
Methods
- COM オブジェクトの使用可能なメソッド。 TypeLib を解析して作成されます。
PS A:ssdgitrepoCOMThanasiaClsidExplorerx64Debug> .CLSIDExplorer.exe -h CLSIDExplorer.exe - clsid によってすべての情報を識別します 使用法: .CLSIDExplorer.exe --clsid "{00000618-0000-0010-8000-00aa006d2ea4}"
プログラムは引数を 1 つだけ受け入れます。
--clsid
- 分析するターゲット CLSID
PS A:ssdgitrepoCOMThanasiaClsidExplorerx64Debug> .CLSIDExplorer.exe --clsid "{00000618-0000-0010-8000-00aa006d2ea4}"[{00000618-0000-0010-8000-00aa006d2ea4}] アプリID: 不明 プログID: 不明 PID: 1572 プロセス名: CLSIDExplorer.exe ユーザー名: WINPCマイケル 方法: [0] __stdcall void QueryInterface(IN GUID*, OUT void**) [1] __stdcall unsigned long AddRef() [2] __stdcall unsigned long Release() [3] __stdcall void GetTypeInfoCount(OUT unsigned int*) [4] __stdcall void GetTypeInfo(IN unsigned int, IN unsigned long, OUT void**) [5] __stdcall void GetIDsOfNames(IN GUID*, IN char**, IN unsigned int, IN unsigned long, OUT long*) [6] __stdcall void Invoke(IN long, IN GUID*, IN unsigned long, IN unsigned short, IN DISPPARAMS*, OUT VARIANT*, OUT EXCEPINFO*, OUT unsigned int*) [7] __stdcall BSTR Name() [8] __stdcall void 名(IN BSTR) [9] __stdcall RightsEnum GetPermissions(IN VARIANT、IN ObjectTypeEnum、IN VARIANT) [10] __stdcall void SetPermissions(IN VARIANT, IN ObjectTypeEnum, IN ActionEnum, IN RightsEnum, IN InheritTypeEnum, IN VARIANT) [11] __stdcall void ChangePassword(IN BSTR, IN BSTR) [12] __stdcall グループ* Groups() [13] __stdcall プロパティ* Properties() [14] __stdcall _Catalog* ParentCatalog() [15] __stdcall void ParentCatalog(IN _Catalog*) [16] __stdcall void ParentCatalog(IN _Catalog*) [終わり]
このプログラムは、 ComTraveller
、 PermissionHunter
、またはMonikerHound
で検出された COM クラスをチェックして、悪用される可能性のある興味深いメソッドがないかを確認するのに最適です。
ComTraveller - このツールを使用すると、利用可能なすべての COM オブジェクトを探索できます。まず、興味深い値 (RunAs Interactive User)、TypeLib の可用性、およびクロスセッション アクティベーション機能を持つ COM オブジェクトを迅速に識別できます。したがって、別のユーザー セッションでインスタンス化され、権限昇格につながる可能性のあるオブジェクトを迅速に検出できます。
PS A:SSDgitrepoCOMThanasiaComTravellerx64Debug> .ComTraveller.exe -h 、、_ zd$$??= z$$P? F:`c, _ d$$, `c'cc$$i ,cd$?R $$$$ cud$,?$$$i ,=P"2?z " $" " ?$$$, ?$$$。 ,-''`>, bzP 'cLdb,?$$,?$$$ ,h' "I$'J$P ... `?$$$,"$$,`$$h $$PxrF'd$"d$PP""?-,"?$$,?$h`$$,,$$'$F44 "?,,_`=4c,?=,"?hu?$`?L4$'? ' `""?==""=-"" `""-`'_,,,, .ccu? m?e?JC,-,"=? """=='?"ComTraveller - システム上のすべての登録済み CLSID に関する情報を解析して抽出するための小さなツール使用法:--file <出力> - 出力ファイル名。デフォルト:output.csv--from- この clsid から clsid の探索を開始します。 (例: デフォルトの列挙型は 1 から 9 まで。--from 4 を指定すると 4 から 9 になります)--session - 特定のセッションでのクロスセッション アクティベーションを確認する場合に使用します。 「対話型ユーザー COM オブジェクトとして実行」でのみ有効 -- ターゲット - この CLSID を分析します - h/--help - この画面を表示します
--file
- COM オブジェクトに関する情報が出力されるファイルの名前。
--from
- Windows システムには多数の CLSID があります。ツールで最初からすべての CLSID を調べたくない場合は、たとえば--from {50FDBB99-5C92-495E-9E81-E2C2F48CDDA}
のように開始する CLSID を指定できます。
--session
- 他の人のセッションでオブジェクトをインスタンス化しようとします
--target
- 1 つのターゲット clsid のみを分析します
例:
.ComTraveller.exe --file rep.csv --session 1
その後、COM オブジェクトに関する情報が含まれた rep.csv ファイルが見つかります。 ここにはいくつかの列があります。
CLSID
- COM オブジェクトの CLSID。
AppId
- COM オブジェクトの APPID。
ProgId
- COM オブジェクトの APPID。
RunAs
- RunAs レジストリ内の値。値がThe Interactive User
またはNT AUTHORITYSYSTEM
の場合は、LPE の作成を試行できます。
Username
- COM オブジェクトを実行するユーザーの名前。
PID
- COM オブジェクトが実行されている PID。
ProcessName
- COM オブジェクトが実行されているプロセスの名前。
HasTypeLib
- COM オブジェクトに TypeLib があるかどうか。存在する場合は、このオブジェクトをClsidExplorer
に渡して、使用可能なメソッドを確認できます。
canCrossSessionActivate
- 他の人のセッションでのアクティブ化を通じて、LPE 用にこの COM クラスを悪用できるかどうか。値が+
であるか、エラーがACCESS DENIED
である場合、これは LPE の潜在的な候補である可能性があります。
たとえば、フィルターを適用すると、興味深い COM クラスがすぐに見つかります :) うわー、これはセッション間でアクティブ化でき、システムに代わって動作する COM クラスですか?
COM オブジェクトが大量にあるため、プログラムがクラッシュする可能性があることに注意してください。この場合、次のように再起動できます。
.ComTraveller.exe --file rep.csv --session 1 --from "{0006F071-0000-0000-C000-000000000046}"