
Una herramienta en C# con mayor flexibilidad para personalizar tareas programadas tanto para persistencia como para movimiento lateral en operaciones de equipo rojo.
La tarea programada es una de las técnicas de ataque más populares en la última década y aún hoy es utilizada comúnmente por hackers/red teamers para persistencia y movimiento lateral.
Ya se han desarrollado varias herramientas en C# para simular el ataque mediante tareas programadas. He estado probando algunas de ellas, pero cada una tiene sus propias limitaciones a la hora de personalizar la tarea programada. Por lo tanto, este proyecto pretende ofrecer una herramienta en C# (compatible con execute-assembly de CobaltStrike) que incluya las funcionalidades que necesito y proporcione suficiente flexibilidad para personalizar la tarea programada.

| Método | Función |
|---|---|
| create | Crear una nueva tarea programada |
| delete | Eliminar una tarea programada existente |
| run | Ejecutar una tarea programada existente |
| query | Consultar detalles de una tarea programada o de todas las tareas programadas bajo una carpeta |
| queryfolders | Consultar todas las subcarpetas en la tarea programada |
| move | Realizar movimiento lateral usando tarea programada (crear, ejecutar y eliminar automáticamente) |
[*] son campos obligatorios.
[*] son campos obligatorios.
| Método | Función |
|---|---|
| [*] /taskname | Especificar el nombre de la tarea programada |
| /folder | Especificar la carpeta donde se almacena la tarea programada (predeterminado: \) |
| /remoteserver | Especificar el nombre de host o dirección IP de un equipo remoto |
[*] son campos obligatorios.
| Método | Función |
|---|---|
| /taskname | Especificar el nombre de la tarea programada |
| /folder | Especificar la carpeta donde se almacena la tarea programada (predeterminado: \) |
| /remoteserver | Especificar el nombre de host o dirección IP de un equipo remoto |
[*] son campos obligatorios.
[*] son campos obligatorios.
Crear una tarea programada llamada "Cleanup" que se ejecutará todos los días a las 23:30.
ScheduleRunner.exe /method:create /taskname:Cleanup /trigger:daily /starttime:23:30 /program:calc.exe /description:"Some description" /author:netero1010
Crear una tarea programada llamada "Cleanup" que se ejecutará cada 4 horas en un servidor remoto
ScheduleRunner.exe /method:create /taskname:Cleanup /trigger:hourly /modifier:4 /program:rundll32.exe /argument:c:\temp\payload.dll /remoteserver:TARGET-PC01
Eliminar una tarea programada llamada "Cleanup"
ScheduleRunner.exe /method:delete /taskname:Cleanup
Ejecutar una tarea programada llamada "Cleanup"
ScheduleRunner.exe /method:run /taskname:Cleanup
Consultar detalles de una tarea programada llamada "Cleanup" bajo la carpeta "\Microsoft\Windows\CertificateServicesClient" en un servidor remoto
ScheduleRunner.exe /method:query /taskname:Cleanup /folder:\Microsoft\Windows\CertificateServicesClient /remoteserver:TARGET-PC01
Consultar todas las tareas programadas bajo una carpeta específica "\Microsoft\Windows\CertificateServicesClient" en un servidor remoto
ScheduleRunner.exe /method:query /folder:\Microsoft\Windows\CertificateServicesClient /remoteserver:TARGET-PC01
Consultar todas las subcarpetas en la tarea programada
ScheduleRunner.exe /method:queryfolders
Realizar movimiento lateral mediante tarea programada a un servidor remoto usando una cuenta de usuario específica
ScheduleRunner.exe /method:move /taskname:Demo /remoteserver:TARGET-PC01 /program:rundll32.exe /argument:c:\temp\payload.dll /user:netero1010
Crear una tarea programada llamada "Cleanup" usando la técnica de ocultar tarea programada:
ScheduleRunner.exe /method:create /taskname:Cleanup /trigger:daily /starttime:23:30 /program:calc.exe /description:"Some description" /author:netero1010 /technique:hide
Eliminar una tarea programada llamada "Cleanup" que usó la técnica de ocultar tarea programada:
ScheduleRunner.exe /method:delete /taskname:Cleanup /technique:hide
Esta técnica fue utilizada por el actor de amenazas HAFNIUM y descubierta recientemente por Microsoft. Su objetivo es hacer que la tarea programada no se pueda consultar mediante herramientas y que no sea visible en el Programador de tareas.
Para usar esta técnica, se requiere tener "NT AUTHORITY/SYSTEM" y ScheduleRunner hará lo siguiente por usted:
Para eliminar una tarea programada creada con esta técnica, es necesario agregar "/technique:hide" en el método de eliminación para eliminarla correctamente.
La tarea continuará ejecutándose hasta el próximo reinicio del sistema incluso si se elimina mediante el registro. Por lo tanto, es mejor no usar esta técnica en servidores para su operación.

| Biblioteca | Enlace |
|---|---|
| TaskScheduler | https://github.com/dahall/TaskScheduler |
| Referencia | Enlace |
|---|---|
| SharpPersist | https://github.com/mandiant/SharPersist |
| Técnica de ocultar tarea programada | https://www.microsoft.com/security/blog/2022/04/12/tarrask-malware-uses-scheduled-tasks-for-defense-evasion/ |
| Método | Función |
|---|
| [*] /taskname | Especificar el nombre de la tarea programada |
| [*] /program | Especificar el programa que ejecuta la tarea |
| [*] /trigger | Especificar el tipo de programación. Los valores válidos incluyen: "minute", "hourly", "daily", "weekly", "onstart", "onlogon" y "onidle" |
| /modifier | Especificar la frecuencia con la que se ejecuta la tarea dentro de su tipo de programación. Aplicable solo para tipos de programación como "minute" (ej., 1-1439 minutos), "hourly" (ej., 1-23 horas) y "weekly" (ej., lun,sáb,dom) |
| /starttime | Especificar la hora de inicio para el tipo de programación diaria (ej., 23:30) |
| /argument | Especificar el argumento de línea de comandos para el programa |
| /folder | Especificar la carpeta donde se almacena la tarea programada (predeterminado: \) |
| /workingdir | Especificar el directorio de trabajo en el que se ejecutará la tarea programada |
| /author | Especificar el autor de la tarea programada |
| /description | Especificar la descripción de la tarea programada |
| /remoteserver | Especificar el nombre de host o dirección IP de un equipo remoto |
| /user | Ejecutar la tarea con una cuenta de usuario especificada |
| /technique | Especificar técnica de evasión: - "hide": Una técnica utilizada por el malware HAFNIUM que oculta la tarea programada de la consulta de tareas [!] https://www.microsoft.com/security/blog/2022/04/12/tarrask-malware-uses-scheduled-tasks-for-defense-evasion/ [!] Esta técnica no soporta ejecución remota debido a privilegios del registro remoto. Requiere "NT AUTHORITY\SYSTEM" y la tarea continuará ejecutándose hasta el reinicio del sistema incluso después de eliminar la tarea |
| Método | Función |
|---|
| [*] /taskname | Especificar el nombre de la tarea programada |
| /folder | Especificar la carpeta donde se almacena la tarea programada (predeterminado: \) |
| /remoteserver | Especificar el nombre de host o dirección IP de un equipo remoto |
| /technique | Especificar si la tarea programada fue creada usando técnica de evasión: - "hide": Eliminar tarea programada que usó la técnica de "ocultar tarea programada" [!] La eliminación requiere "NT AUTHORITY\SYSTEM" y la tarea continuará ejecutándose hasta el reinicio del sistema incluso después de eliminar la tarea |
| Método | Función |
|---|
| [*] /taskname | Especificar el nombre de la tarea programada |
| [*] /program | Especificar el programa que ejecuta la tarea |
| [*] /remoteserver | Especificar el nombre de host o dirección IP de un equipo remoto |
| /trigger | Especificar el tipo de programación. Los valores válidos incluyen: "minute", "hourly", "daily", "weekly", "onstart", "onlogon" y "onidle" |
| /modifier | Especificar la frecuencia con la que se ejecuta la tarea dentro de su tipo de programación. Aplicable solo para tipos de programación como "minute" (ej., 1-1439 minutos), "hourly" (ej., 1-23 horas) y "weekly" (ej., lun,sáb,dom) |
| /starttime | Especificar la hora de inicio para el tipo de programación diaria (ej., 23:30) |
| /argument | Especificar el argumento de línea de comandos para el programa |
| /folder | Especificar la carpeta donde se almacena la tarea programada (predeterminado: \) |
| /workingdir | Especificar el directorio de trabajo en el que se ejecutará la tarea programada |
| /author | Especificar el autor de la tarea programada |
| /description | Especificar la descripción de la tarea programada |
| /user | Ejecutar la tarea con una cuenta de usuario especificada |