Skip to content
h0km4
Go back

Token Stealing en Windows de Administrador a NT AUTHORITY\SYSTEM

Updated:
Edit page

Token Stealing en Windows de Administrador a NT AUTHORITY\SYSTEM

NT AUTHORITY\SYSTEM (comúnmente llamado SYSTEM) es una cuenta interna de Windows que representa al propio sistema operativo.

Su SID es:

S-1-5-18

Ese identificador aparece dentro del Access Token de los procesos que ejecuta el kernel o los servicios críticos del sistema. Muchos de los componentes más críticos del sistema se ejecutan con esa identidad. Por ejemplo:

Todos ellos funcionan con privilegios SYSTEM porque necesitan control total sobre el sistema operativo.

Desde la perspectiva del kernel, el token de seguridad de SYSTEM representa algo parecido a:

Identidad: NT AUTHORITY\SYSTEM
Privilegios: prácticamente todos
Integridad: System Integrity Level
Acceso: control completo del sistema

Si inspeccionas uno de esos procesos verás algo como:

User Name: NT AUTHORITY\SYSTEM

Esto significa que el proceso no pertenece a ningún usuario humano. Pertenece al núcleo del sistema operativo.

Muchos desarrolladores creen que Administrador = control total. En realidad no es así.

Un administrador sigue siendo un usuario. SYSTEM es parte del sistema operativo.

Un administrador puede instalar programas, modificar el registro o crear usuarios. Pero hay ciertas cosas que están reservadas para procesos SYSTEM.

Por ejemplo:

Cuando un proceso corre como SYSTEM, muchas de esas barreras desaparecen.

Por qué es tan poderoso

Un proceso que se ejecuta como SYSTEM puede hacer cosas que normalmente están restringidas incluso a administradores.

Entre ellas:

Desactivar defensas del sistema

Muchos mecanismos de seguridad se ejecutan como servicios del sistema. Si tienes privilegios SYSTEM puedes:

Eso incluye productos de seguridad, monitoreo o protección.

Ese es el motivo por el que muchas técnicas de post-explotación buscan SYSTEM.

La consecuencia curiosa es que muchos mecanismos de seguridad en Windows están diseñados bajo una premisa implícita: si alguien ya es SYSTEM, entonces ya ganó. El sistema asume que ese nivel pertenece al propio sistema operativo.

Por eso, en investigación de seguridad, llegar a NT AUTHORITY\SYSTEM suele marcar el momento exacto en que la máquina deja de ser confiable.

code

Bueno despues de esta breve introduccion a NT SYSTEM iniciemos con lo tecnico.

En teoria cuando un proceso crea otro proceso, el nuevo proceso hereda un token. Esto significa que si logras obtener el token de un proceso SYSTEM, puedes ejecutar código con los mismos privilegios que el sistema operativo; Esta sera nuestro objetivo.

Nuestro flujo sera:

Admin Process

 habilita SeDebugPrivilege

Abre proceso SYSTEM


Obtiene su Access Token


Duplica el token


CreateProcessWithTokenW()


cmd.exe NT AUTHORITY\SYSTEM

y nuestro flujo del exploit sera algo como:

Este codigo se encuentra aqui: repo

explicacion de codigo

Verificación de privilegios actuales

BOOL IsRunningAsSystem()

Esta función verifica si el proceso actual ya se ejecuta como SYSTEM.

Pasos internos:

  1. Abrir el token del proceso actual
OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)
  1. Obtener la información del usuario del token
GetTokenInformation(TokenUser)
  1. Convertir el SID a string
ConvertSidToStringSidA
  1. Comparar contra el SID de SYSTEM
S-1-5-18

Si coincide:

Already running as SYSTEM

Habilitar SeDebugPrivilege

SetPrivilege(SE_DEBUG_NAME)

Este privilegio permite abrir cualquier proceso del sistema, incluso si pertenece a otro usuario.

Internamente hace tres cosas:

1. Obtener el token del proceso

OpenProcessToken(...)

2. Obtener el identificador del privilegio

LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)

3. Activar el privilegio

AdjustTokenPrivileges(...)

Sin este privilegio, Windows bloquearía el acceso a procesos como:

lsass.exe
winlogon.exe
services.exe

Búsqueda de un proceso SYSTEM

FindTargetProcess()

Esta función recorre todos los procesos del sistema usando:

CreateToolhelp32Snapshot
Process32First
Process32Next

Lista de objetivos:

lsass.exe
winlogon.exe
services.exe
csrss.exe

Estos procesos normalmente se ejecutan bajo:

NT AUTHORITY\SYSTEM

Por eso sus tokens son valiosos.

Apertura del proceso

OpenProcess(PROCESS_QUERY_INFORMATION)

Esto crea un handle al proceso SYSTEM.

Un handle es simplemente un índice en la tabla de handles del proceso que apunta a un objeto del kernel.

Obtención del Access Token

OpenProcessToken(hProcess, TOKEN_DUPLICATE, &hToken)

Esto recupera el token del proceso objetivo.

Ahora tenemos algo como:

Handle → Token de SYSTEM

Pero aún no podemos usarlo directamente.

Duplicación del token

DuplicateTokenEx(...)

Esto crea una copia del token original.

Parámetros importantes:

SecurityImpersonation
TokenPrimary

Un TokenPrimary es necesario para crear procesos nuevos.

Resultado:

Token duplicado con privilegios SYSTEM

Crear proceso como SYSTEM

El paso final:

CreateProcessWithTokenW()

Se pasa el token duplicado y el ejecutable a lanzar.

Ejemplo:

cmd.exe

Windows ahora crea un nuevo proceso usando ese token.

Resultado:

cmd.exe
NT AUTHORITY\SYSTEM

¿Por qué funciona?

La clave está en el modelo de seguridad de Windows.

Si un proceso tiene:

SeDebugPrivilege

puede:

abrir cualquier proceso
leer su token
duplicarlo
crear procesos con él

Windows asume que solo administradores confiables tendrán ese privilegio.

Cuando un atacante lo obtiene, puede escalar privilegios hasta SYSTEM.

Sobre Windows 11 y PPL

En Windows 11 muchos procesos críticos usan:

PPL
Protected Process Light

Ejemplo:

lsass.exe

PPL impide que incluso administradores puedan abrir el proceso o su token.

Por eso el código comenta:

necesitas bypass de PPL en win11

Sin bypass, el acceso será bloqueado.

Uso de NtQuerySystemInformation

El código incluye una función opcional:

GetHandleAddress()

Esta usa la syscall:

NtQuerySystemInformation(SystemHandleInformation)

Esto devuelve la tabla global de handles del sistema.

Permite ver:

Handle
PID
Objeto del kernel
Permisos

Es útil para debugging y para entender cómo Windows mapea handles a objetos internos.

Resultado final

Si todo funciona:

[+] SeDebugPrivilege enabled
[+] Found target process: lsass.exe
[+] OpenProcess successful
[+] OpenProcessToken successful
[+] DuplicateTokenEx successful
[+] Process spawned successfully

La nueva consola tendrá identidad:

NT AUTHORITY\SYSTEM

Ese es el máximo nivel de privilegio en Windows userland.

Conclusión

El ataque demuestra algo importante:

La seguridad en Windows no depende solo de permisos de archivos o UAC.

Depende de quién controla los tokens del sistema.

Si un atacante puede:

habilitar SeDebugPrivilege
abrir procesos SYSTEM
duplicar tokens

entonces puede convertirse en el sistema operativo. bye


Edit page
Share this post on:

Previous Post
Hablando con el kernel
Next Post
Deserialization RCE en React Server Components