システムエクスプロイトをテストしたいですか?ここをクリック。

これは、テキストサービスを実装するためにWindowsで使用されるあまり知られていないプロトコルであるCTFを実験するためのインタラクティブなコマンドラインツールであるctftoolです。これは、Windowsの内部を調査したり、テキスト入力プロセッサで複雑な問題をデバッグしたり、Windowsのセキュリティを分析したりするのに役立ちます。
CTFクライアントまたはサーバーとの対話を自動化するために、 ctftoolを使用して簡単なスクリプトを作成したり、簡単なファジングを実行したりすることができます。
このツールのリリースに伴うブログ投稿があります。
https://googleprojectzero.blogspot.com/2019/08/down-rabbit-hole.html
ctftool Windows 7、Windows 8、およびWindows 10でテストされています。32ビットとX64の両方のバージョンがサポートされていますが、X64はより広範囲にテストされています。
ほとんどのコマンドにはオンラインヘルプがあり、コマンドのリストを表示するためにhelpを入力するだけで、特定のコマンドの詳細なヘルプを確認するためにhelp <command> 。
$ ./ctftool.exe
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
Most commands require a connection, see "help connect".
ctf> help
Type `help <command>` for help with a specific command.
Any line beginning with # is considered a comment.
help - List available commands.
exit - Exit the shell.
connect - Connect to CTF ALPC Port.
info - Query server informaiton.
scan - Enumerate connected clients.
callstub - Ask a client to invoke a function.
createstub - Ask a client to instantiate CLSID.
hijack - Attempt to hijack an ALPC server path.
sendinput - Send keystrokes to thread.
setarg - Marshal a parameter.
getarg - Unmarshal a parameter.
wait - Wait for a process and set it as the default thread.
thread - Set the default thread.
sleep - Sleep for specified milliseconds.
forget - Forget all known stubs.
stack - Print the last leaked stack ptr.
marshal - Send command with marshalled parameters.
proxy - Send command with proxy parameters.
call - Send command without appended data.
window - Create and register a message window.
patch - Patch a marshalled parameter.
module - Print the base address of a module.
module64 - Print the base address of a 64bit module.
editarg - Change the type of a marshalled parameter.
symbol - Lookup a symbol offset from ImageBase.
set - Change or dump various ctftool parameters.
show - Show the value of special variables you can use.
lock - Lock the workstation, switch to Winlogon desktop.
repeat - Repeat a command multiple times.
run - Run a command.
script - Source a script file.
print - Print a string.
consent - Invoke the UAC consent dialog.
reg - Lookup a DWORD in the registry.
gadget - Find the offset of a pattern in a file.
section - Lookup property of PE section.
Most commands require a connection, see "help connect".
ctf>
最初にやりたいことは、セッションに接続し、どのクライアントが接続されているかを確認することです。
ctf> connect
The ctf server port is located at BaseNamedObjectsmsctf.serverDefault1
NtAlpcConnectPort("BaseNamedObjectsmsctf.serverDefault1") => 0
Connected to CTF [email protected], Handle 00000264
ctf> scan
Client 0, Tid 3400 (Flags 0x08, Hwnd 00000D48, Pid 8696, explorer.exe)
Client 1, Tid 7692 (Flags 0x08, Hwnd 00001E0C, Pid 8696, explorer.exe)
Client 2, Tid 9424 (Flags 0x0c, Hwnd 000024D0, Pid 9344, SearchUI.exe)
Client 3, Tid 12068 (Flags 0x08, Hwnd 00002F24, Pid 12156, PROCEXP64.exe)
Client 4, Tid 9740 (Flags 0000, Hwnd 0000260C, Pid 3840, ctfmon.exe)
その後、コマンドをサーバーまたは接続されたクライアントに送信および受信して実験できます。
自分で構築したくない場合は、[リリース]タブをご覧ください
GNU MakeとVisual Studio 2019を使用して、 ctftoolを開発しました。これにより、ツールがx86およびx64ウィンドウで実行できるため、32ビットのみがサポートされています。
すべての依存関係がインストールされている場合は、開発者コマンドプロンプトをmakeするだけで十分です。
Visual Studioの「ビルドツール」バリアントを使用していますが、選択した唯一のコンポーネントはMSVC、MSBuild、Cmake、SDKです。
このプロジェクトでは、一部の依存関係にサブモジュールを使用しています。このようなコマンドを使用して、必要なすべてのコードを取得してください。
git submodule update --init --recursive
例は、Windows 10 x64でのみ機能します。 Windows XPが影響を受けているため、すべてのプラットフォームとバージョンは現在実装されていません。
このツールは、何十年も存在してきたCTFプロトコルで多くの重要なセキュリティ問題を発見するために使用されました。
Windows 10 x64 1903でエクスプロイトをテストするだけの場合は、 ctftool.exeを実行またはダブルクリックしてこのコマンドを入力します。
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
Most commands require a connection, see "help connect".
ctf> script .scriptsctf-consent-system.ctf
これにより、UACダイアログが表示され、妥協してシェルを開始するのが待ちます。
実際、エクスプロイトコードは2つの段階に分割され、独立して使用できます。たとえば、オプションのパラメーターを使用してconnectて、異なるセッションでユーザーに属するプロセスを妥協することをお勧めします。
脆弱なライブラリをロードするためにWindowsを描画するカーネルは強制的なアプリケーションであるため、ほとんどのCTFクライアントは妥協することができます。
セッションに接続するだけで、クライアントを選択して妥協します( scanとthreadコマンドを使用するか、 waitだけです)、次のとおりです。
ctf> script .scriptsctf-exploit-common-win10.ctf
CTFクライアントの大半で機能するCFGジャンプチェーンを構築することは非常に困難でした。最終的なエクスプロイトには2つの主要なコンポーネントがあります。これは、任意の書き込みプリミティブであり、 LoadLibrary()を呼び出すためにレジスタを設定します。
dumpbin /headers /loadconfigを使用して、ホワイトリストのブランチターゲットをダンプできます。
予測可能な場所にオブジェクトを作成するために、任意の書き込みガジェットが必要です。私が見つけることができた最良の使用可能なガジェットはmsvcrt!_init_timeの任意のDWORDの減少でした。
これは、必要な値を設定するだけでなく、LSBが必要な値に達するまで減少し続ける必要があります。これは多くの作業ですが、 (2^8 - 1) * len減少を超える必要はありません。

このプリミティブを使用して、kernel32 .dataセクションの未使用のスラックスペースにこのようなオブジェクトを構築します。画像のランダム化がWindowsのブートごとにあるため、マッピングする場所を予測できるように、画像の一部である必要があります。

(もちろん)任意の書き込みガジェットがたくさんありましたが、問題は書き込み後に実行の制御を取り戻すことでした。これは非常に挑戦的であることが証明されました。それが、私がより簡単なものではなく、DWORDの減少に固執した理由です。
MSCTFはすべての例外をキャッチするため、課題はスタックを台無しにしない任意の書き込みを見つけることで、SEHが生き残るか、ダメージを与えずに本当に速くクラッシュしました。
msvcrt!_init_timeガジェットは、私が見つけることができる最高のものでした。いくつかの指示の中で、それ以上のメモリを破壊せずにnullを拒否しました。これは、それを繰り返すことができることを意味します。
レジスタを調整するための2つの便利なガジェットを見つけましたが、1つ目は次のとおりです。
combase!CStdProxyBuffer_CF_AddRef:
mov rcx,qword ptr [rcx-38h]
mov rax,qword ptr [rcx]
mov rax,qword ptr [rax+8]
jmp qword ptr [combase!__guard_dispatch_icall_fptr]
2つ目は次のとおりです。
MSCTF!CCompartmentEventSink::OnChange:
mov rax,qword ptr [rcx+30h]
mov rcx,qword ptr [rcx+38h]
jmp qword ptr [MSCTF!_guard_dispatch_icall_fptr]
これら2つのガジェットを書き込みガジェットと形成したオブジェクトと組み合わせることで、実行を跳ね返すことで実行をkernel32!LoadLibraryAにリダイレクトできます。
これは複雑でしたが、ジャンプシーケンスは次のように機能します。

興味があれば、デバッガーで見ることをお勧めします。コマンドsxd avおよびsxd bpeを使用する必要があるか、デバッガーが書き込みごとに停止する必要があることに注意してください!
メモリの腐敗とは別に、CTFによって公開された主要な脆弱性クラスは、セッション攻撃を編集しています。通常、特権プロセスから入力または読み取りデータを送信することは、特権プロセスから入力データを送信することは許可されません。このセキュリティ境界は、UIPI、ユーザーインターフェイス特権分離と呼ばれます。
CTFはこれらの仮定を打ち破り、特権プロセスに入力を送信できるようにしています。
この攻撃にはいくつかの要件があります。私が知っている限り、OOPチップ、プロセスのテキスト入力プロセッサを使用するディスプレイ言語がインストールされている場合にのみ機能します。 IMES(中国語、日本、韓国語など)を使用する入力言語を持つユーザーとA11Yツールを持つユーザーは、このカテゴリに分類されます。
攻撃の例には...
スクリプトディレクトリには、編集セッションの仕組みを示すためにメモパッドウィンドウに入力を送信する例があります。

CTFプロトコルのクライアントとサーバーの間に認証が含まれていないため、 BaseNamedObjectsに書き込むために必要な特権を持つ攻撃者は、CTF ALPCポートを作成してモニターのふりをすることができます。
これにより、モニターによって実施されるあらゆる制限をバイパスすることができます。
この攻撃を試してみたい場合は、 ctftoolのhijackコマンドを試してください。
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
ctf> hijack Default 1
NtAlpcCreatePort("BaseNamedObjectsmsctf.serverDefault1") => 0 00000218
NtAlpcSendWaitReceivePort("BaseNamedObjectsmsctf.serverDefault1") => 0 00000218
000000: 18 00 30 00 0a 20 00 00 00 11 00 00 44 11 00 00 ..0.. ......D...
000010: a4 86 00 00 b7 66 b8 00 00 11 00 00 44 11 00 00 .....f......D...
000020: e7 12 01 00 0c 00 00 00 80 01 02 00 20 10 d6 05 ............ ...
A a message received
ProcessID: 4352, SearchUI.exe
ThreadId: 4420
WindowID: 00020180
NtAlpcSendWaitReceivePort("BaseNamedObjectsmsctf.serverDefault1") => 0 00000218
000000: 18 00 30 00 0a 20 00 00 ac 0f 00 00 0c 03 00 00 ..0.. ..........
000010: ec 79 00 00 fa 66 b8 00 ac 0f 00 00 0c 03 00 00 .y...f..........
000020: 12 04 01 00 08 00 00 00 10 01 01 00 00 00 00 00 ................
A a message received
ProcessID: 4012, explorer.exe
ThreadId: 780
WindowID: 00010110
NtAlpcSendWaitReceivePort("BaseNamedObjectsmsctf.serverDefault1") => 0 00000218
000000: 18 00 30 00 0a 20 00 00 ac 0f 00 00 0c 03 00 00 ..0.. ..........
000010: fc 8a 00 00 2a 67 b8 00 ac 0f 00 00 0c 03 00 00 ....*g..........
000020: 12 04 01 00 08 00 00 00 10 01 01 00 58 00 00 00 ............X...
A a message received
ProcessID: 4012, explorer.exe
ThreadId: 780
...
CTFプロトコルにはセッション分離はありません。どのプロセスもCTFサーバーに接続できます。たとえば、ターミナルサービスユーザーは、他のユーザーのプロセス、管理者でさえも対話できます。
ctftoolのconnectコマンドは、この攻撃を実験したい場合は、非デフォルトセッションへの接続をサポートします。
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
Most commands require a connection, see "help connect".
ctf> help connect
Connect to CTF ALPC Port.
Usage: connect [DESKTOPNAME SESSIONID]
Without any parameters, connect to the ctf monitor for the current
desktop and session. All subsequent commands will use this connection
for communicating with the ctf monitor.
If a connection is already open, the existing connection is closed first.
If DESKTOPNAME and SESSIONID are specified, a connection to ctf monitor
for another desktop and session are opened, if it exists.
If the specified port does not exist, wait until it does exist. This is
so that you can wait for a session that hasn't started
yet in a script.
Examples
Connect to the monitor for current desktop
ctf> connect
Connect to a specific desktop and session.
ctf> connect Default 1
Most commands require a connection, see "help connect".
執筆時点では、このツールが露出した多数の設計上の欠陥に応じて、MicrosoftがCTFプロトコルをどのように変更するかは不明です。
そのため、このツールは概念実証状態にあると考えてください。
Windows XP以降のWindowsのすべてのバージョンは、すべてのサポートされているプラットフォームでCTFを使用しています。
XPまでベースシステムの一部ではありませんが、Microsoft Officeをインストールした場合、Windows 98とNT4は早くもCTFを使用します。
ctftool Windows 7以降のX86およびX64でサポートしていますが、以前のバージョンやその他のプラットフォームがサポートされ、貢献が評価されます。
Microsoftは、CTFが象徴するものを文書化しておらず、テキストサービスのドキュメント、SDKサンプル、シンボル名、ヘッダーファイルなどで説明されていません。私の理論は、それはCTextFrameworkからのものであり、ハンガリー語の表記でクラスに名前を付けるかもしれません。
ctfmonクリアタイプフォントまたはAzure Collaborative Translation Frameworkと関係があると主張するいくつかのWebサイトがあります。彼らは間違っています。
更新:ジェイクネルソンは「一般的なテキストフレームワーク」の証拠を見つけます
Tavis ormandy [email protected]
すべての元のコードはApache 2.0です。詳細については、ライセンスファイルを参照してください。
次のコンポーネントは、インポートされたサードパーティプロジェクトです。
GetProcAddress()実装するために使用されます。これはsymbolコマンドで使用され、同じバイナリがx64およびx86で動作できるようにします。