Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
ctftool — Interaktives CTF-Erkundungstool | Kitploit
Tools/GitHubGitHub/taviso/ctftool
Exploit-FrameworksFuzzingPenetrationstestsLernen & BildungBinary-Exploitation
GitHubtaviso/ctftool

ctftool

Interaktives CTF-Erkundungstool

Repository anzeigen
1.7k263vor 4 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CTFTOOL

Möchten Sie nur den SYSTEM-Exploit testen? Klicken Sie hier.

Video of Exploit

Ein interaktives CTF-Erkundungstool

Dies ist ctftool, ein interaktives Befehlszeilentool zum Experimentieren mit CTF, einem wenig bekannten Protokoll, das unter Windows zur Implementierung von Textdiensten verwendet wird. Dies könnte nützlich sein für das Studium von Windows-Interna, das Debuggen komplexer Probleme mit Texteingabeprozessoren und die Analyse von Windows-Sicherheit.

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.

Hintergrund

Es gibt einen Blogbeitrag, der die Veröffentlichung dieses Tools begleitet, verfügbar hier.

https://googleprojectzero.blogspot.com/2019/08/down-rabbit-hole.html

Verwendung

ctftool wurde unter Windows 7, Windows 8 und Windows 10 getestet. Sowohl 32-Bit- als auch x64-Versionen werden unterstützt, aber x64 wurde ausführlicher getestet.

Es gibt Online-Hilfe für die meisten Befehle. Geben Sie einfach help ein, um eine Liste der Befehle zu sehen, und help <Befehl>, um detaillierte Hilfe für einen bestimmten Befehl zu erhalten.

root@kitploit:~
$ ./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 Clients verbunden sind.

root@kitploit:~
ctf> connect
The ctf server port is located at \BaseNamedObjects\msctf.serverDefault1
NtAlpcConnectPort("\BaseNamedObjects\msctf.serverDefault1") => 0
Connected to CTF server@\BaseNamedObjects\msctf.serverDefault1, 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 einen der verbundenen Clients senden und empfangen.

Erstellung

Wenn Sie es nicht selbst erstellen möchten, schauen Sie sich den Releases-Tab an.

Ich habe GNU make und Visual Studio 2019 verwendet, um ctftool zu entwickeln. Es werden nur 32-Bit-Builds unterstützt, da dies dem Tool ermöglicht, unter x86- und x64-Windows zu laufen.

Wenn alle Abhängigkeiten installiert sind, sollte die Eingabe von make in einer Entwickler-Eingabeaufforderung ausreichen.

Ich verwende die Variante "Build Tools" von Visual Studio, und die einzigen Komponenten, die ich ausgewählt habe, sind MSVC, MSBuild, CMake und das SDK.

Dieses Projekt verwendet Submodule für einige der Abhängigkeiten. Stellen Sie sicher, dass Sie einen Befehl wie diesen verwenden, um den gesamten erforderlichen Code abzurufen.

root@kitploit:~
git submodule update --init --recursive

Exploit

Die Beispiele funktionieren nur unter Windows 10 x64. Alle Plattformen und Versionen seit Windows XP sind betroffen, aber es ist derzeit kein PoC implementiert.

Dieses Tool wurde verwendet, um viele kritische Sicherheitsprobleme mit dem CTF-Protokoll zu entdecken, die seit Jahrzehnten bestehen.

Wenn Sie nur einen Exploit unter Windows 10 x64 1903 testen möchten, führen Sie ctftool.exe aus oder doppelklicken Sie darauf und geben Sie diesen Befehl ein:

root@kitploit:~
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
Most commands require a connection, see "help connect".
ctf> script .\scripts\ctf-consent-system.ctf

Dies wartet darauf, dass der UAC-Dialog erscheint, kompromittiert ihn und startet eine Shell.

Tatsächlich ist der Exploit-Code in zwei Phasen aufgeteilt, die Sie unabhängig voneinander verwenden können. Sie möchten beispielsweise einen Prozess eines Benutzers in einer anderen Sitzung kompromittieren, indem Sie die optionalen Parameter für connect verwenden.

Die meisten CTF-Clients können kompromittiert werden, da der Kernel Anwendungen, die Fenster zeichnen, dazu zwingt, die anfällige Bibliothek zu laden.

Stellen Sie einfach eine Verbindung zu einer Sitzung her, wählen Sie einen Client aus, den Sie kompromittieren möchten (verwenden Sie die Befehle scan und thread oder einfach wait), dann:

root@kitploit:~
ctf> script .\scripts\ctf-exploit-common-win10.ctf

Hinweise zur Ausnutzung

Der Aufbau einer CFG-Sprung-Kette, die bei der Mehrheit der CTF-Clients funktionierte, war recht anspruchsvoll. Es gibt zwei Hauptkomponenten des endgültigen Exploits: eine beliebige Schreibprimitive und dann das Einrichten unserer Register, um LoadLibrary() aufzurufen.

Sie können dumpbin /headers /loadconfig verwenden, um die auf der Whitelist stehenden Sprungziele auszugeben.

Beliebiger Schreibvorgang

Ich benötige ein beliebiges Schreib-Gadget, um Objekte an einem vorhersagbaren Ort zu erstellen. Das beste verwendbare Gadget, das ich finden konnte, war ein beliebiges Dword-Dekrement in msvcrt!_init_time.

Das bedeutet, dass wir nicht einfach die gewünschten Werte setzen können, sondern immer wieder dekrementieren müssen, bis das LSB den gewünschten Wert erreicht. Dies ist eine Menge Arbeit, aber wir müssen nie mehr als (2^8 - 1) * len Dekremente durchführen.

Decrement Write

Mit dieser Primitive erstelle ich ein Objekt wie dieses in einem ungenutzten Slack-Bereich im .data-Abschnitt von kernel32. Es muss Teil eines Images sein, damit ich vorhersagen kann, wo es gemappt wird, da die Image-Randomisierung unter Windows pro Start erfolgt.

Object Layout

Es gab (natürlich) viele beliebige Schreib-Gadgets. Das Problem war, die Kontrolle über die Ausführung nach dem Schreiben zurückzugewinnen. Dies erwies sich als recht anspruchsvoll, und das ist der Grund, warum ich bei einem Dword-Dekrement hängen blieb, anstatt etwas Einfacherem.

MSCTF fängt alle Ausnahmen ab, daher bestand die Herausforderung darin, ein beliebiges Schreibvorgang zu finden, der den Stack nicht so durcheinanderbrachte, dass SEH überlebte, oder der wirklich schnell abstürzte, ohne Schaden anzurichten.

Das msvcrt!_init_time-Gadget war das beste, das ich finden konnte; innerhalb weniger Anweisungen dereferenziert es NULL, ohne weiteren Speicher zu korrumpieren. Das bedeutet, wir können es unendlich oft wiederholen.

Umleitung der Ausführung

Ich habe zwei nützliche Gadgets zum Anpassen von Registern gefunden. Das erste war:

root@kitploit:~
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 das zweite war:

root@kitploit:~
MSCTF!CCompartmentEventSink::OnChange:
      mov     rax,qword ptr [rcx+30h]
      mov     rcx,qword ptr [rcx+38h]
      jmp     qword ptr [MSCTF!_guard_dispatch_icall_fptr]

Durch die Kombination dieser beiden Gadgets mit dem Objekt, das wir mit unserem Schreib-Gadget gebildet haben, können wir die Ausführung umleiten zu kernel32!LoadLibraryA, indem wir zwischen ihnen hin und her springen.

Dies war kompliziert, aber die Sprungsequenz funktioniert so:

Exploit Chain Sequence

Wenn Sie interessiert sind, empfehle ich, es in einem Debugger zu beobachten. Beachten Sie, dass Sie die Befehle sxd av und sxd bpe verwenden müssen, sonst stoppt der Debugger bei jedem Schreibvorgang!

Angriffe auf Bearbeitungssitzungen

Neben Speicherkorruption ist eine weitere wichtige Schwachstellenklasse, die von CTF offengelegt wird, Angriffe auf Bearbeitungssitzungen. Normalerweise wäre es einem unprivilegierten Prozess (z. B. niedriger Integrität) nicht erlaubt, Eingaben zu senden oder Daten von einem hochprivilegierten Prozess zu lesen. Diese Sicherheitsgrenze heißt UIPI, User Interface Privilege Isolation.

CTF bricht diese Annahmen und erlaubt unprivilegierten Prozessen, Eingaben an privilegierte Prozesse zu senden.

Es gibt einige Voraussetzungen, damit dieser Angriff funktioniert. Soweit ich weiß, funktioniert er nur, wenn Sie eine Anzeigesprache installiert haben, die einen OoP TIP verwendet, einen out-of-process text input processor. Benutzer mit Eingabesprachen, die IMEs verwenden (Chinesisch, Japanisch, Koreanisch usw.) und Benutzer mit a11y-Tools fallen in diese Kategorie.

Beispielangriffe umfassen...

  • Senden von Befehlen an ein erhöhtes Eingabeaufforderungsfenster.
  • Auslesen von Passwörtern aus Dialogen oder dem Anmeldebildschirm.
  • Ausbrechen aus IL-/AppContainer-Sandboxes durch Senden von Eingaben an nicht gesandboxte Fenster.

Es gibt ein Beispiel-Skript im Skriptverzeichnis, das Eingaben an ein Notepad-Fenster sendet, um zu demonstrieren, wie Bearbeitungssitzungen funktionieren.

Edit Session Screenshot

Monitor-Entführung

Da es im CTF-Protokoll keine Authentifizierung zwischen Clients und Servern gibt, kann ein Angreifer mit den erforderlichen Rechten, um in \BaseNamedObjects zu schreiben, den CTF-ALPC-Port erstellen und vorgeben, der Monitor zu sein.

Dies ermöglicht es, alle vom Monitor durchgesetzten Einschränkungen zu umgehen.

Wenn Sie mit diesem Angriff experimentieren möchten, probieren Sie den Befehl hijack in ctftool.

root@kitploit:~
An interactive ctf exploration tool by @taviso.
Type "help" for available commands.
ctf> hijack Default 1
NtAlpcCreatePort("\BaseNamedObjects\msctf.serverDefault1") => 0 00000218
NtAlpcSendWaitReceivePort("\BaseNamedObjects\msctf.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("\BaseNamedObjects\msctf.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("\BaseNamedObjects\msctf.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
...

Sitzungsübergreifende Angriffe

Es gibt keine Sitzungsisolierung im CTF-Protokoll, jeder Prozess kann sich mit jedem CTF-Server verbinden. Beispielsweise kann ein Terminaldienste-Benutzer mit den Prozessen jedes anderen Benutzers interagieren, sogar des Administrators.

Der Befehl connect in ctftool unterstützt das Herstellen einer Verbindung zu nicht standardmäßigen Sitzungen, wenn Sie mit diesem Angriff experimentieren möchten.

root@kitploit:~
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".

Status

Zum Zeitpunkt der Erstellung dieses Artikels ist unbekannt, wie Microsoft das CTF-Protokoll als Reaktion auf die zahlreichen Designfehler ändern wird, die dieses Tool aufzudecken half.

Aus diesem Grund betrachten Sie dieses Tool als im Proof-of-Concept-Stadium.

Unterstützte Versionen und Plattformen

Alle Windows-Versionen seit Windows XP verwenden CTF auf allen unterstützten Plattformen.

Obwohl CTF erst ab XP Teil des Basissystems war, verwendeten Versionen so früh wie Windows 98 und NT4 CTF, wenn Sie Microsoft Office installiert hatten.

ctftool unterstützt Windows 7 und höher auf x86 und x64, aber frühere Versionen und andere Plattformen könnten unterstützt werden, und Beiträge wären willkommen.

Akronym

Microsoft dokumentiert nicht, wofür CTF steht, es wird in keiner der Textdienste-Dokumentationen, SDK-Beispielen, Symbolnamen, Header-Dateien oder anderswo erklärt. Meine Theorie ist, dass es von CTextFramework stammt, wie man die Klasse in ungarischer Notation nennen würde.

Es gibt einige Websites, die behaupten, dass ctfmon etwas mit ClearType-Schriftarten oder dem Azure Collaborative Translation Framework zu tun hat. Sie liegen falsch.

Update: Jake Nelson findet Belege für "Common Text Framework"

Autoren

Tavis Ormandy [email protected]

Lizenz

Der gesamte Originalcode ist Apache 2.0, siehe LICENSE-Datei für Details.

Die folgenden Komponenten sind importierte Drittanbieter-Projekte.

  • pe-parse, von Andrew Ruef et al.
    • pe-parse wird verwendet, um GetProcAddress() für 64-Bit-Module aus einem 32-Bit-Prozess zu implementieren. Dies wird im Befehl symbol verwendet und ermöglicht es, dass dasselbe Binärprogramm unter x64 und x86 funktioniert.
  • wineditline, von Paolo Tosco.
    • wineditline wird verwendet, um benutzerfreundliche Befehlszeileneingabe und Verlaufsbearbeitung zu implementieren.
  • dynamorio, von Derek Bruening et al.
    • Ich habe einige der Prototypen und Typdefinitionen von DR übernommen.
  • ntdll.h, von Ladislav Zezula.
    • Ladislav hat einige Strukturdefinitionen und Prototypen aus verschiedenen WDK-, DDK- und SDK-Versionen in einer praktischen Datei gesammelt.
Tool herunterladen