
Générateur d'obfuscation de commandes cmd.exe et banc d'essai de détection

Invoke-DOSfuscation est un framework d'obfuscation de commandes cmd.exe compatible avec PowerShell v2.0+. (Livre blanc : https://www.fireeye.com/blog/threat-research/2018/03/dosfuscation-exploring-obfuscation-and-detection-techniques.html)
Au cours des dernières années en tant que consultant en réponse aux incidents, j'ai été témoin d'une myriade de techniques d'obfuscation et d'évasion employées par plusieurs acteurs de menace. Certaines de ces techniques sont incroyablement complexes tandis que d'autres sont élégamment simples, mais les deux catégories sont utilisées pour échapper à la détection. Dans mon expérience, j'ai constaté qu'APT32 et FIN7 utilisent les techniques d'obfuscation les plus séduisantes et leur créativité est remarquable.
En juin 2017, après une série de techniques incrémentales d'obfuscation de ligne de commande, FIN7 a utilisé une capacité de substitution de chaîne de caractères dans les variables d'environnement native à cmd.exe dont j'ignorais l'existence à l'époque. Poussé par cette découverte, j'ai co-écrit un billet de blog avec Nick Carr (@ItsReallyNick) intitulé Obfuscation in the Wild: Targeted Attackers Lead the Way in Evasion Techniques où nous avons mis en lumière les techniques d'obfuscation de nombreux groupes que nous avons identifiées dans la nature.
Le week-end suivant, j'ai exploré cette fonctionnalité de substitution native de cmd.exe et j'ai construit et publié un simple outil de preuve de concept appelé Out-FINcodedCommand. Dès que j'ai publié cette POC, j'ai pris du recul et pensé : "Peut-être existe-t-il d'autres capacités d'obfuscation dans cmd.exe que je devrais explorer et pour lesquelles je devrais créer des détections avant de les découvrir utilisées dans la nature."
C'est ainsi qu'a commencé ma recherche qui a finalement abouti au développement de ce framework Invoke-DOSfuscation.
Les attaquants utilisent de plus en plus des techniques d'obfuscation pour contourner les détections basées principalement sur les valeurs des arguments de ligne de commande. Pour contrer cela, j'ai passé cinq mois à rechercher et développer des techniques d'obfuscation et d'encodage natives de cmd.exe afin de créer des détections robustes pour ces techniques fondamentales que je n'ai pas encore vues dans la nature.
L'unique but de ce framework est de permettre aux défenseurs de générer aléatoirement des milliers de commandes échantillons obfusquées de manière unique pour tester et ajuster leurs capacités de détection contre ces techniques. J'ai inclus mon test harness complet dans cette version pour automatiser ce processus de test de détection.
À bien des égards, ce framework permet aux défenseurs de fuzzer les techniques d'obfuscation de cmd.exe, et en construisant cet outil, j'ai découvert de nombreuses opportunités d'obfuscation supplémentaires que je n'avais pas découvertes lors de mes recherches initiales.
J'ai également partagé ces informations avec Microsoft en novembre 2017 et me suis renseigné sur les possibilités d'offrir une visibilité supplémentaire sur le fonctionnement interne de l'utilisation par cmd.exe des techniques fondamentales qui sont les briques de base de toutes les fonctions d'obfuscation intégrées dans ce framework.
En tant que défenseur, l'objectif final de cette recherche et développement est de sensibiliser et de conduire des changements qui aideront les utilisateurs finaux à mieux se protéger contre les TTP (Outils, Techniques et Procédures) en constante évolution des attaquants.
Bien que tous les composants d'obfuscation soient construits en fonctions formelles autonomes, la plupart des utilisateurs trouveront la fonction Invoke-DOSfuscation comme le moyen le plus simple d'explorer et de visualiser les techniques d'obfuscation que ce framework supporte. Pour le fuzzing et l'exploration approfondie des nombreuses options de réglage pour chaque catégorie d'obfuscation, il est cependant recommandé d'utiliser directement les fonctions individuelles en dehors de l'enveloppe de la fonction Invoke-DOSfuscation.
Pour permettre aux défenseurs de commencer facilement à fuzzer et à tester des idées de détection, ce framework inclut également un module supplémentaire, Invoke-DOSfuscationTestHarness.psm1, qui est automatiquement importé avec le reste du projet. Les deux fonctions clés de ce module pour les défenseurs sont :
Invoke-DosTestHarness - Génère (avec les paramètres d'argument par défaut) plus de 1000 commandes obfusquées aléatoirement à partir d'une liste de commandes de test pour l'intégrité de la charge utile et la détection. Chaque itération du test harness randomise tous les arguments de fonction disponibles et appelle les quatre fonctions d'obfuscation directement au lieu d'utiliser les valeurs -ObfuscationLevel (1-3) plus standardisées que la fonction pilotée par menu Invoke-DOSfuscation utilise par défaut. Cela produit une gamme significativement plus large de sorties obfusquées contre lesquelles on peut construire des détections plus complètes. Chaque commande obfusquée est ensuite vérifiée par rapport à la deuxième fonction :Get-DosDetectionMatch - Vérifie une commande d'entrée (chaîne) par rapport à toutes les valeurs de détection regex entrées dans le tableau $regexDetectionTerms de la fonction. Cette fonction est automatiquement appelée par Invoke-DosTestHarness mais peut également être appelée de manière autonome.À la fin de chaque invocation du test harness, les statistiques pour l'exécution correcte des commandes et la détection seront affichées afin que les défenseurs puissent rapidement identifier les commandes qui ont 0 ou seulement 1-2 correspondances de détection et celles qui pourraient nécessiter une meilleure couverture.
Enfin, pour éviter aux défenseurs d'avoir à exécuter le test harness pour commencer, j'ai fourni 1000 commandes échantillons dans le répertoire Samples réparties sur chacune des quatre fonctions d'obfuscation. Les formats incluent des fichiers .txt, et des fichiers .evtx Security et Sysmon. J'ai inclus quelques règles de détection échantillons dans le tableau $regexDetectionTerms de Invoke-DOSfuscationTestHarness.psm1, mais vous voudrez ajouter et tester beaucoup plus de règles en testant les commandes obfusquées échantillons). En plus des fichiers .txt avec les commandes brutes, il y a des fichiers .evtx contenant les logs d'exécution des processus (événements Sysmon EID 1) pour chacune des 1000 commandes échantillons. Ces journaux d'événements sont extrêmement utiles pour construire des indicateurs basés sur les exécutions nuancées de processus enfants qui sont des sous-produits de plusieurs techniques de base sur lesquelles Invoke-DOSfuscation est construit.
Pour commencer, affichez les commandes obfusquées échantillons qui ne correspondent à aucune de vos règles de détection actuelles en exécutant simplement :
(Get-Content .\Samples\STATIC_1-of-4_Out-DosConcatenatedCommand.txt) | where-object { -not (Get-DosDetectionMatch -Command $_).Detected }
Pour tester à la fois les commandes obfusquées et les processus enfants à partir des journaux d'événements d'exécution enregistrés dans Security EID 4688, exécutez simplement :
(Get-WinEvent -Path .\Samples\DYNAMIC_SECURITY_EID4688_1-of-4_Out-DosConcatenatedCommand.evtx) | where-object { $_.Message } | foreach-object { ($_.Message.Split("`n") | select-string '^\tProcess Command Line:\t') -replace '^\tProcess Command Line:\t','' } | where-object { -not (Get-DosDetectionMatch -Command $_).Detected }
Le code source d'Invoke-DOSfuscation est hébergé sur Github, et vous pouvez le télécharger, le forker et l'examiner depuis ce dépôt (https://github.com/danielbohannon/Invoke-DOSfuscation). Veuillez signaler les problèmes ou demandes de fonctionnalités via le bug tracker de Github associé à ce projet.
Pour installer :
Import-Module .\Invoke-DOSfuscation.psd1
Invoke-DOSfuscation
Invoke-DOSfuscation est publié sous la licence Apache 2.0.
v1.0 - 2018-03-23 Black Hat Asia (Singapour) : Publication PUBLIQUE d'Invoke-DOSfuscation.