Skip to content

Cómo detectar tareas programadas maliciosas

Lista práctica para detectar tareas programadas maliciosas: rutas escribibles, PowerShell codificado, LOLBins, SYSTEM, tareas ocultas y discrepancias XML/registro.

Publicado el 8 min de lectura

Resumen. Clasifique cada tarea con unas pocas preguntas: dónde está el comando (¿ruta escribible por el usuario?), qué es (PowerShell -EncodedCommand, rundll32, mshta, certutil...), quién lo ejecuta (¿SYSTEM o privilegios más altos para una tarea ajena a Microsoft?), si se esconde (Hidden, sin SD, nombre aleatorio, carpeta raíz), si es nueva (registro cercano al incidente) y si las copias coinciden (XML frente a TaskCache, hash). Son pistas de triaje, no veredictos. Corrobore antes de escribir «malicioso».

Este artículo forma parte de la serie de investigación y parte de la base de que ya ha analizado juntos el XML y TaskCache, como se describe en la guía de análisis forense de tareas programadas. Las tareas programadas figuran de forma constante entre las técnicas de persistencia más observadas en los informes de respuesta a incidentes, por ejemplo en el Threat Detection Report de Red Canary, y MITRE las cataloga como T1053.005.

Paso 0: separar la línea base

Una instalación de Windows por defecto tiene bastante más de cien tareas, casi todas bajo \Microsoft\Windows\, muchas ocultas y muchas ejecutándose como SYSTEM. Cada uno de los indicadores de abajo salta con alguna de ellas. Antes de buscar lo malicioso:

  • Ordene por ruta y autor. Las tareas de Microsoft están bajo \Microsoft\Windows\ y suelen tener un autor de Microsoft o una cadena de recurso del tipo $(@%SystemRoot%\system32\...).
  • Compruebe que sus acciones siguen apuntando adonde deben: binarios de %windir%\system32\... o un CLSID ComHandler. Un atacante que modifica una tarea existente de Microsoft conserva la ruta y el autor, pero cambia la acción.
  • Compare con una máquina limpia de la misma compilación si puede. Una tarea que no está en la línea base es lo primero que hay que leer.

Los indicadores

IndicadorPor qué importaFalsos positivos habituales
Comando en una ruta escribible por el usuarioLos atacantes dejan sus payloads donde pueden escribirActualizadores por usuario (Teams, OneDrive, navegadores)
PowerShell codificadoOculta el comando realHerramientas de gestión, algunos scripts de fabricantes
LOLBin o host de scripts como comandoBinarios firmados hacen de intermediarios del payloadScripts de administración con cscript, wscript
SYSTEM o HighestAvailable en una tarea ajena a MicrosoftPersistencia con el máximo de privilegiosAgentes de seguridad, software de copias de seguridad, utilidades de controladores
Tarea oculta ajena a MicrosoftMenos visible en la consolaAlgunas tareas de fabricantes están ocultas
Entrada de Tree sin SDOcultación al estilo TarraskNinguno habitual
Tarea solo en el registro o solo en discoLimpieza o manipulaciónHive sucio, desinstalación parcial
Discrepancia de hashXML o registro editados tras el registroRaro; ediciones manuales de administradores
Nombre de aspecto aleatorio, carpeta raízNombre generado o descuidadoTareas de fabricantes con nombre GUID
Registro recienteCerca de la ventana del incidenteDía de parches, instalaciones de software
Ruta de red (\\server\share)Payload alojado en remotoScripts de inicio de sesión en entornos gestionados
Acción .job heredadaHerramientas antiguas en un sistema modernoAplicaciones muy antiguas

Rutas escribibles por el usuario

Fíjese en el Command y en las rutas de archivo dentro de Arguments: C:\Users\Public\, C:\ProgramData\, C:\Users\<user>\AppData\ (Local, Roaming, Temp), C:\Windows\Temp\, C:\Perflogs\ y la raíz de una unidad. C:\ProgramData\Intel\m64.exe parece de un fabricante, pero está en una carpeta en la que, por defecto, cualquier usuario puede crear archivos. Expanda las variables de entorno antes de juzgar: %LOCALAPPDATA% en una tarea de SYSTEM se resuelve al perfil del sistema.

PowerShell codificado

powershell.exe -EncodedCommand <base64> (o abreviaturas como -enc, -e) recibe una cadena Base64 de texto UTF-16LE. Descodifíquela antes de leerla; la entrada del glosario sobre PowerShell codificado explica cómo. Por ejemplo, VwByAGkAdABlAC0ATwB1AHQAcAB1AHQAIAAnAHMAeQBuAHQAaABlAHQAaQBjACAAcwBhAG0AcABsAGUAJwA= se descodifica como Write-Output 'synthetic sample'. Anote también -WindowStyle Hidden, -NoProfile, -ExecutionPolicy Bypass y -NonInteractive: suelen aparecer juntos en tareas maliciosas, pero también en automatizaciones legítimas. Scheduled Tasks Parser descodifica los comandos codificados para mostrarlos, de modo que usted lee el script y no el Base64.

LOLBins y hosts de scripts

Binarios firmados de Windows capaces de ejecutar o descargar otro código (LOLBins): rundll32.exe, regsvr32.exe, mshta.exe, wscript.exe, cscript.exe, certutil.exe, bitsadmin.exe, msiexec.exe, cmd.exe /c y el propio powershell.exe. El proyecto LOLBAS documenta lo que puede hacer cada uno. Una tarea cuyo comando es uno de ellos no es sospechosa por sí misma; lo que decide son los argumentos. rundll32.exe C:\Users\Public\x.dll,Start sí lo es; rundll32.exe con una DLL de System32 y un autor de Microsoft normalmente no.

Entidad de seguridad y privilegios

Lea UserId/GroupId, LogonType y RunLevel en el XML (o la entidad de seguridad en la cabecera de Triggers de TaskCache cuando el XML ha desaparecido). S-1-5-18 (SYSTEM) con HighestAvailable en una tarea cuyo autor es un usuario local es la combinación clásica: alguien con derechos de administrador hizo que algo se ejecutara como SYSTEM al arrancar. Un LogonType Password significa que se almacenaron credenciales para la tarea, algo sobre lo que Microsoft recomienda generar alertas (guía sobre el evento 4698). S4U se ejecuta sin contraseña almacenada, pero también sin credenciales de red.

Ocultación

  • <Hidden>true</Hidden> en una tarea ajena a Microsoft.
  • Una clave Tree sin SD, o con un SD que deniega la lectura: vea Tarrask y las tareas programadas ocultas.
  • Nombres que imitan a Microsoft (\Microsoft\Windows\UpdateOrchestrator\... con una acción ajena a Microsoft) o cadenas aleatorias (\a8Xq2LmZ).
  • Tareas en la raíz de la biblioteca: la propia guía de Microsoft sobre el 4698 las señala como el lugar donde suelen acabar las tareas manuales y maliciosas.

Coherencia entre copias

Es la comprobación que la mayoría de los scripts de triaje se saltan, y donde el análisis offline brilla:

  • TaskCache sin XML: se borró el archivo, pero la tarea no se dio de baja. Descodifique el blob Actions.
  • XML sin TaskCache: se dejó el archivo pero nunca se registró, o se limpió el registro; compruebe primero el estado del hive.
  • Discrepancia de hash: el Hash ya no coincide con el XML. Una de las copias se editó al margen del servicio.
  • Discrepancia de acción: el XML dice un comando y el blob Actions, otro.

Cronología

Compare el registro (Date con el desfase UTC correcto, fecha de creación en DynamicInfo) con la ventana del incidente, y revise en DynamicInfo la última ejecución y su último resultado. Una tarea registrada veinte minutos después de un inicio de sesión sospechoso y ejecutada con éxito por última vez es más interesante que otra registrada el día de la instalación. Recuerde que las fechas del XML suelen ser horas locales sin zona: vea la anatomía del XML de una tarea.

Corroborar antes de concluir

Una tarea marcada es una hipótesis. Evidencias que la confirman o la refutan:

  • ¿Se ejecutó? Última ejecución y resultado en DynamicInfo; eventos 200 y 201 de TaskScheduler/Operational; Prefetch para el comando; Amcache para el hash del binario y su primera ejecución.
  • ¿Quién la creó? Evento 4698 de Security (con el XML) y evento 106 de TaskScheduler/Operational, si se registraron. El EVTX parser y su artículo sobre persistencia mediante tareas programadas y el evento 4698 cubren esta parte.
  • ¿Qué es el binario? Calcule su hash, compruebe la firma y revise las marcas de tiempo de $MFT y del diario USN en torno a la hora del registro.
  • ¿Está en otras máquinas? La misma tarea en cincuenta estaciones de trabajo es un despliegue de software; en una sola, es interesante.

Redacte los hallazgos en términos observados: «la tarea \Microsoft\Windows\UPnP\UPnPHostConfigSync ejecuta powershell.exe con un comando codificado que se descodifica como ... como SYSTEM, registrada el 2026-09-14 a las 10:12:40 UTC, última ejecución correcta a las 10:42:41 UTC». Deje que sea la corroboración la que sostenga la palabra «malicioso».

Para un ejemplo ficticio completo con varios de estos indicadores, vea cómo analizar tareas programadas en el navegador.

Preguntas frecuentes

¿Qué hace sospechosa a una tarea programada?

Comandos en carpetas escribibles por el usuario, PowerShell codificado, hosts de scripts y LOLBins, tareas ajenas a Microsoft que se ejecutan como SYSTEM o con los privilegios más altos, tareas ocultas ajenas a Microsoft, nombres de aspecto aleatorio, rutas de red, un registro reciente y cualquier discrepancia entre el archivo XML y la entrada de TaskCache en el registro.

¿Son estos indicadores una prueba de actividad maliciosa?

No. Todos tienen explicaciones legítimas: actualizadores de fabricantes en ProgramData, scripts de TI que usan -EncodedCommand, agentes que se ejecutan como SYSTEM. Sirven para priorizar qué tareas revisar. Un hallazgo necesita corroboración con evidencias de ejecución, registros de eventos o el propio binario.

¿Cómo reduzco el ruido de las tareas de Microsoft?

Ordene por autor y ruta, aparte las tareas bajo \Microsoft\Windows\ con autor de Microsoft tras comprobar que sus acciones apuntan a binarios de System32, y compare el resto con una línea base de una máquina limpia de la misma compilación.

Artículos relacionados

Análisis forense de tareas programadas: XML de tareas, clave TaskCache del registro, archivos .job heredados y registros de eventos, y cómo correlacionarlos.
Paso a paso: cargue XML de tareas, archivos .job y el hive SOFTWARE en un parser gratuito en el navegador, lea tareas ocultas, ajuste la zona horaria y exporte.
Cómo leer los archivos .job heredados: secciones fija y variable de MS-TSCH, desencadenadores, la última ejecución en SYSTEMTIME local y su presencia en Windows actual.