
Un outil C# offrant plus de flexibilité pour personnaliser les tâches planifiées, à la fois pour la persistance et le mouvement latéral lors d'opérations d'équipe rouge.
La tâche planifiée est l'une des techniques d'attaque les plus populaires de la dernière décennie et elle est encore couramment utilisée par les hackers/red teamers pour la persistance et le mouvement latéral.
Un certain nombre d'outils C# ont déjà été développés pour simuler l'attaque à l'aide de tâches planifiées. J'ai expérimenté certains d'entre eux, mais chacun présente ses propres limites en matière de personnalisation de la tâche planifiée. Par conséquent, ce projet vise à fournir un outil C# (compatible avec l'exécution d'assemblys de CobaltStrike) qui inclut les fonctionnalités dont j'ai besoin et offre suffisamment de flexibilité pour personnaliser la tâche planifiée.

| Méthode | Fonction |
|---|---|
| create | Créer une nouvelle tâche planifiée |
| delete | Supprimer une tâche planifiée existante |
| run | Exécuter une tâche planifiée existante |
| query | Interroger les détails d'une tâche planifiée ou de toutes les tâches planifiées sous un dossier |
| queryfolders | Interroger tous les sous-dossiers dans les tâches planifiées |
| move | Effectuer un mouvement latéral à l'aide d'une tâche planifiée (création, exécution et suppression automatiques) |
[*] sont des champs obligatoires.
[*] sont des champs obligatoires.
| Méthode | Fonction |
|---|---|
| [*] /taskname | Spécifier le nom de la tâche planifiée |
| /folder | Spécifier le dossier où la tâche planifiée est stockée (par défaut : \) |
| /remoteserver | Spécifier le nom d'hôte ou l'adresse IP d'un ordinateur distant |
[*] sont des champs obligatoires.
| Méthode | Fonction |
|---|---|
| /taskname | Spécifier le nom de la tâche planifiée |
| /folder | Spécifier le dossier où la tâche planifiée est stockée (par défaut : \) |
| /remoteserver | Spécifier le nom d'hôte ou l'adresse IP d'un ordinateur distant |
[*] sont des champs obligatoires.
[*] sont des champs obligatoires.
Créer une tâche planifiée appelée "Cleanup" qui sera exécutée tous les jours à 23h30.
ScheduleRunner.exe /method:create /taskname:Cleanup /trigger:daily /starttime:23:30 /program:calc.exe /description:"Some description" /author:netero1010
Créer une tâche planifiée appelée "Cleanup" qui sera exécutée toutes les 4 heures sur un serveur distant
ScheduleRunner.exe /method:create /taskname:Cleanup /trigger:hourly /modifier:4 /program:rundll32.exe /argument:c:\temp\payload.dll /remoteserver:TARGET-PC01
Supprimer une tâche planifiée appelée "Cleanup"
ScheduleRunner.exe /method:delete /taskname:Cleanup
Exécuter une tâche planifiée appelée "Cleanup"
ScheduleRunner.exe /method:run /taskname:Cleanup
Interroger les détails d'une tâche planifiée appelée "Cleanup" sous le dossier "\Microsoft\Windows\CertificateServicesClient" sur un serveur distant
ScheduleRunner.exe /method:query /taskname:Cleanup /folder:\Microsoft\Windows\CertificateServicesClient /remoteserver:TARGET-PC01
Interroger toutes les tâches planifiées sous un dossier spécifique "\Microsoft\Windows\CertificateServicesClient" sur un serveur distant
ScheduleRunner.exe /method:query /folder:\Microsoft\Windows\CertificateServicesClient /remoteserver:TARGET-PC01
Interroger tous les sous-dossiers dans les tâches planifiées
ScheduleRunner.exe /method:queryfolders
Effectuer un mouvement latéral à l'aide d'une tâche planifiée vers un serveur distant en utilisant un compte utilisateur spécifique
ScheduleRunner.exe /method:move /taskname:Demo /remoteserver:TARGET-PC01 /program:rundll32.exe /argument:c:\temp\payload.dll /user:netero1010
Créer une tâche planifiée appelée "Cleanup" en utilisant la technique de masquage de tâche planifiée :
ScheduleRunner.exe /method:create /taskname:Cleanup /trigger:daily /starttime:23:30 /program:calc.exe /description:"Some description" /author:netero1010 /technique:hide
Supprimer une tâche planifiée appelée "Cleanup" ayant utilisé la technique de masquage de tâche planifiée :
ScheduleRunner.exe /method:delete /taskname:Cleanup /technique:hide
Cette technique a été utilisée par l'acteur malveillant HAFNIUM et découverte récemment par Microsoft. Elle vise à rendre la tâche planifiée non interrogeable par les outils et invisible dans le Planificateur de tâches.
Pour utiliser cette technique, vous devez disposer de "NT AUTHORITY/SYSTEM" et ScheduleRunner effectuera les opérations suivantes :
Pour supprimer une tâche planifiée créée avec cette technique, il faut ajouter "/technique:hide" dans la méthode de suppression pour la supprimer correctement.
La tâche continuera de s'exécuter jusqu'au prochain redémarrage du système, même si elle est supprimée via le registre. Par conséquent, il est préférable de ne pas utiliser cette technique sur un serveur pour vos opérations.

| Bibliothèque | Lien |
|---|---|
| TaskScheduler | https://github.com/dahall/TaskScheduler |
| Référence | Lien |
|---|---|
| SharpPersist | https://github.com/mandiant/SharPersist |
| Technique de masquage de tâche planifiée | https://www.microsoft.com/security/blog/2022/04/12/tarrask-malware-uses-scheduled-tasks-for-defense-evasion/ |
| Méthode | Fonction |
|---|
| [*] /taskname | Spécifier le nom de la tâche planifiée |
| [*] /program | Spécifier le programme exécuté par la tâche |
| [*] /trigger | Spécifier le type de planification. Les valeurs valides sont : "minute", "hourly", "daily", "weekly", "onstart", "onlogon" et "onidle" |
| /modifier | Spécifier la fréquence d'exécution de la tâche dans son type de planification. Applicable uniquement pour les types de planification tels que "minute" (ex : 1-1439 minutes), "hourly" (ex : 1-23 heures) et "weekly" (ex : lun, sam, dim) |
| /starttime | Spécifier l'heure de début pour le type de planification quotidienne (ex : 23:30) |
| /argument | Spécifier l'argument de ligne de commande pour le programme |
| /folder | Spécifier le dossier où la tâche planifiée est stockée (par défaut : \) |
| /workingdir | Spécifier le répertoire de travail dans lequel la tâche planifiée sera exécutée |
| /author | Spécifier l'auteur de la tâche planifiée |
| /description | Spécifier la description de la tâche planifiée |
| /remoteserver | Spécifier le nom d'hôte ou l'adresse IP d'un ordinateur distant |
| /user | Exécuter la tâche avec un compte utilisateur spécifié |
| /technique | Spécifier la technique d'évasion : - "hide" : Une technique utilisée par le malware HAFNIUM qui masque la tâche planifiée des requêtes de tâches [!] https://www.microsoft.com/security/blog/2022/04/12/tarrask-malware-uses-scheduled-tasks-for-defense-evasion/ [!] Cette technique ne prend pas en charge l'exécution à distance en raison des privilèges sur le registre distant. Elle nécessite "NT AUTHORITY\SYSTEM" et la tâche continuera de s'exécuter jusqu'au redémarrage du système même après sa suppression |
| Méthode | Fonction |
|---|
| [*] /taskname | Spécifier le nom de la tâche planifiée |
| /folder | Spécifier le dossier où la tâche planifiée est stockée (par défaut : \) |
| /remoteserver | Spécifier le nom d'hôte ou l'adresse IP d'un ordinateur distant |
| /technique | Spécifier si la tâche planifiée a été créée à l'aide d'une technique d'évasion : - "hide" : Supprimer la tâche planifiée ayant utilisé la technique de "masquage de tâche planifiée" [!] La suppression nécessite "NT AUTHORITY\SYSTEM" et la tâche continuera de s'exécuter jusqu'au redémarrage du système même après sa suppression |
| Méthode | Fonction |
|---|
| [*] /taskname | Spécifier le nom de la tâche planifiée |
| [*] /program | Spécifier le programme exécuté par la tâche |
| [*] /remoteserver | Spécifier le nom d'hôte ou l'adresse IP d'un ordinateur distant |
| /trigger | Spécifier le type de planification. Les valeurs valides sont : "minute", "hourly", "daily", "weekly", "onstart", "onlogon" et "onidle" |
| /modifier | Spécifier la fréquence d'exécution de la tâche dans son type de planification. Applicable uniquement pour les types de planification tels que "minute" (ex : 1-1439 minutes), "hourly" (ex : 1-23 heures) et "weekly" (ex : lun, sam, dim) |
| /starttime | Spécifier l'heure de début pour le type de planification quotidienne (ex : 23:30) |
| /argument | Spécifier l'argument de ligne de commande pour le programme |
| /folder | Spécifier le dossier où la tâche planifiée est stockée (par défaut : \) |
| /workingdir | Spécifier le répertoire de travail dans lequel la tâche planifiée sera exécutée |
| /author | Spécifier l'auteur de la tâche planifiée |
| /description | Spécifier la description de la tâche planifiée |
| /user | Exécuter la tâche avec un compte utilisateur spécifié |