Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
ctftool — Outil interactif d'exploration de CTF | Kitploit
Outils/GitHubGitHub/taviso/ctftool
Frameworks d'ExploitationFuzzingTests d'IntrusionApprentissage et ÉducationExploitation de Binaires
GitHubtaviso/ctftool

ctftool

Outil interactif d'exploration de CTF

Voir le dépôt
1.7k263il y a 4 ansVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CTFTOOL

Vous voulez simplement tester l'exploit SYSTEM ? Cliquez ici.

Video of Exploit

Un outil interactif d'exploration CTF

Voici ctftool, un outil interactif en ligne de commande pour expérimenter avec CTF, un protocole peu connu utilisé sur Windows pour implémenter les services de texte. Cela peut être utile pour étudier les internes de Windows, déboguer des problèmes complexes avec les processeurs d'entrée de texte et analyser la sécurité de Windows.

Il est possible d'écrire des scripts simples avec ctftool pour automatiser l'interaction avec les clients ou serveurs CTF, ou effectuer du fuzzing simple.

Contexte

Un article de blog accompagne la sortie de cet outil, disponible ici.

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

Utilisation

ctftool a été testé sur Windows 7, Windows 8 et Windows 10. Les versions 32 bits et x64 sont prises en charge, mais x64 a été testé plus en détail.

Une aide en ligne est disponible pour la plupart des commandes, tapez simplement help pour voir la liste des commandes, et help <commande> pour obtenir une aide détaillée sur une commande particulière.

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 première chose que vous voudrez faire est de vous connecter à une session et voir quels clients sont connectés.

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)

Vous pouvez ensuite expérimenter en envoyant et recevant des commandes au serveur, ou à n'importe lequel des clients connectés.

Construction

Si vous ne voulez pas le construire vous-même, consultez l'onglet releases

J'ai utilisé GNU make et Visual Studio 2019 pour développer ctftool. Seules les builds 32 bits sont prises en charge, car cela permet à l'outil de fonctionner sur Windows x86 et x64.

Si toutes les dépendances sont installées, il suffit de taper make dans une invite de commande développeur.

J'utilise la variante "Build Tools" de Visual Studio, et les seuls composants que j'ai sélectionnés sont MSVC, MSBuild, CMake et le SDK.

Ce projet utilise des sous-modules pour certaines dépendances, assurez-vous d'utiliser une commande comme celle-ci pour récupérer tout le code nécessaire.

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

Exploit

Les exemples ne fonctionnent que sur Windows 10 x64. Toutes les plateformes et versions depuis Windows XP sont affectées, mais aucun PoC n'est actuellement implémenté.

Cet outil a été utilisé pour découvrir de nombreux problèmes de sécurité critiques avec le protocole CTF qui existent depuis des décennies.

Si vous voulez simplement tester un exploit sur Windows 10 x64 1903, exécutez ou double-cliquez sur ctftool.exe et entrez cette commande :

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

Cela attendra que la boîte de dialogue UAC apparaisse, la compromettra et lancera un shell.

En fait, le code de l'exploit est divisé en deux étapes que vous pouvez utiliser indépendamment. Par exemple, vous pourriez vouloir compromettre un processus appartenant à un utilisateur sur une session différente en utilisant les paramètres optionnels de connect.

La plupart des clients CTF peuvent être compromis, car le noyau force les applications qui dessinent des fenêtres à charger la bibliothèque vulnérable.

Connectez-vous simplement à une session, sélectionnez un client à compromettre (utilisez les commandes scan et thread, ou simplement wait), puis :

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

Notes d'exploitation

Construire une chaîne de sauts CFG qui fonctionnait sur la majorité des clients CTF était assez difficile. Il y a deux composants principaux dans l'exploit final : une primitive d'écriture arbitraire, puis la configuration de nos registres pour appeler LoadLibrary().

Vous pouvez utiliser dumpbin /headers /loadconfig pour vider les cibles de branchement autorisées.

Écriture arbitraire

J'avais besoin d'un gadget d'écriture arbitraire pour créer des objets à un emplacement prévisible. Le meilleur gadget utilisable que j'ai pu trouver était un décrément de dword arbitraire dans msvcrt!_init_time.

Cela signifie qu'au lieu de simplement définir les valeurs souhaitées, nous devons continuer à décrémenter jusqu'à ce que l'octet de poids faible atteigne la valeur désirée. C'est beaucoup de travail, mais nous n'avons jamais à faire plus de (2^8 - 1) * len décréments.

Decrement Write

En utilisant cette primitive, je construis un objet comme celui-ci dans un espace libre inutilisé de la section .data de kernel32. Il doit faire partie d'une image pour que je puisse prédire où elle sera mappée, car la randomisation des images est par démarrage sur Windows.

Object Layout

Il y avait (bien sûr) beaucoup de gadgets d'écriture arbitraire, le problème était de reprendre le contrôle de l'exécution après l'écriture. Cela s'est avéré assez difficile, et c'est la raison pour laquelle je me suis retrouvé avec un décrément de dword au lieu de quelque chose de plus simple.

MSCTF attrape toutes les exceptions, donc le défi était de trouver une écriture arbitraire qui ne perturbait pas la pile pour que SEH survive, ou qui plantait très rapidement sans causer de dégâts.

Le gadget msvcrt!_init_time était le meilleur que j'ai trouvé ; en quelques instructions, il déréférence NULL sans corrompre plus de mémoire. Cela signifie que nous pouvons le répéter ad infinitum.

Redirection de l'exécution

J'ai trouvé deux gadgets utiles pour ajuster les registres. Le premier était :

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]

Et le second était :

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]

En combinant ces deux gadgets avec l'objet que nous avons formé avec notre gadget d'écriture, nous pouvons rediriger l'exécution vers kernel32!LoadLibraryA en rebondissant entre eux.

C'était compliqué, mais la séquence de saut fonctionne comme ceci :

Exploit Chain Sequence

Si cela vous intéresse, je recommande de l'observer dans un débogueur. Notez que vous devrez utiliser les commandes sxd av et sxd bpe sinon le débogueur s'arrêtera à chaque écriture !

Attaques de session d'édition

Outre les corruptions mémoire, une classe majeure de vulnérabilités exposées par CTF sont les attaques de session d'édition. Normalement, un processus non privilégié (par exemple, de basse intégrité) ne serait pas autorisé à envoyer des entrées ou à lire des données depuis un processus hautement privilégié. Cette frontière de sécurité est appelée UIPI, User Interface Privilege Isolation.

CTF brise ces hypothèses et permet aux processus non privilégiés d'envoyer des entrées aux processus privilégiés.

Il y a quelques conditions pour que cette attaque fonctionne ; à ma connaissance, elle ne fonctionnera que si vous avez une langue d'affichage installée qui utilise un TIP OoP, out-of-process text input processor. Les utilisateurs avec des langues d'entrée qui utilisent des IME (chinois, japonais, coréen, etc.) et les utilisateurs avec des outils d'accessibilité entrent dans cette catégorie.

Les exemples d'attaques incluent...

  • Envoyer des commandes à une fenêtre de commande élevée.
  • Lire des mots de passe depuis des boîtes de dialogue ou l'écran de connexion.
  • S'échapper des sandbox IL/AppContainer en envoyant des entrées à des fenêtres non sandboxées.

Il y a un exemple de script dans le répertoire des scripts qui enverra des entrées à une fenêtre de bloc-notes pour démontrer comment fonctionnent les sessions d'édition.

Edit Session Screenshot

Détournement du moniteur

Parce qu'il n'y a pas d'authentification entre les clients et les serveurs dans le protocole CTF, un attaquant disposant des privilèges nécessaires pour écrire dans \BaseNamedObjects peut créer le port ALPC CTF et se faire passer pour le moniteur.

Cela permet de contourner toutes les restrictions imposées par le moniteur.

Si vous voulez expérimenter cette attaque, essayez la commande hijack dans 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
...

Attaques inter-sessions

Il n'y a pas d'isolation de session dans le protocole CTF, tout processus peut se connecter à n'importe quel serveur CTF. Par exemple, un utilisateur de services Terminal peut interagir avec les processus de tout autre utilisateur, même l'Administrateur.

La commande connect dans ctftool permet de se connecter à des sessions non par défaut si vous voulez expérimenter cette attaque.

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

Statut

Au moment de la rédaction, on ne sait pas comment Microsoft modifiera le protocole CTF en réponse aux nombreuses failles de conception que cet outil a aidé à exposer.

Pour cette raison, considérez cet outil comme étant à l'état de preuve de concept.

Versions et plateformes prises en charge

Toutes les versions de Windows depuis Windows XP utilisent CTF, sur toutes les plateformes prises en charge.

Bien qu'il ne fasse pas partie du système de base avant XP, des versions aussi anciennes que Windows 98 et NT4 utilisaient CTF si vous installiez Microsoft Office.

ctftool prend en charge Windows 7 et versions ultérieures sur x86 et x64, mais les versions antérieures et d'autres plateformes pourraient être prises en charge, et les contributions seraient appréciées.

Acronyme

Microsoft ne documente pas ce que signifie CTF, ce n'est expliqué dans aucun document sur les services de texte, les exemples SDK, les noms de symboles, les fichiers d'en-tête, ou ailleurs. Ma théorie est que cela vient de CTextFramework, nom que l'on pourrait donner à la classe en notation hongroise.

Certains sites Web prétendent que ctfmon a un rapport avec Clear Type Fonts ou le Azure Collaborative Translation Framework. Ils se trompent.

Mise à jour : Jake Nelson trouve des preuves pour "Common Text Framework"

Auteurs

Tavis Ormandy [email protected]

Licence

Tout le code original est sous Apache 2.0. Consultez le fichier LICENSE pour plus de détails.

Les composants suivants sont des projets tiers importés.

  • pe-parse, par Andrew Ruef et al.
    • pe-parse est utilisé pour implémenter un GetProcAddress() pour les modules 64 bits à partir d'un processus 32 bits. Cela est utilisé dans la commande symbol, et permet au même binaire de fonctionner sur x64 et x86.
  • wineditline, par Paolo Tosco.
    • wineditline est utilisé pour implémenter une saisie en ligne de commande conviviale et l'édition de l'historique.
  • dynamorio, par Derek Bruening et al.
    • J'ai emprunté certains prototypes et définitions de types de DR.
  • ntdll.h, par Ladislav Zezula.
    • Ladislav a rassemblé des définitions de structures et des prototypes provenant de diverses version du WDK, DDK et SDK en un seul fichier pratique.
Télécharger l’outil