
Framework de détection d'obfuscation PowerShell


Revoke-Obfuscation est un framework de détection d'obfuscation PowerShell compatible avec PowerShell v3.0+.
Daniel Bohannon (@danielhbohannon) Lee Holmes (@Lee_Homes)
Article de blog : https://www.fireeye.com/blog/threat-research/2017/07/revoke-obfuscation-powershell.html
Livre blanc : https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/revoke-obfuscation-report.pdf
À l'automne 2016 et au printemps 2017, Daniel Bohannon (@danielhbohannon) a publié Invoke-Obfuscation et Invoke-CradleCrafter, deux frameworks open-source d'obfuscation PowerShell. L'objectif de cette recherche et de ces frameworks était de mettre en évidence les limites d'une approche purement basée sur des signatures pour détecter l'utilisation de PowerShell par les attaquants. Le message principal pour les défenseurs était de se concentrer sur la détection des Indicateurs d'obfuscation en plus des syntaxes suspectes connues.
Cependant, les niveaux extrêmes de randomisation dans Invoke-Obfuscation et Invoke-CradleCrafter, associés aux options d'obfuscation au niveau des jetons qui ne sont pas désobfusquées dans la journalisation des blocs de script de PowerShell, ont conduit les défenseurs à rechercher un nouveau moyen évolutif de détecter génériquement les techniques d'obfuscation connues et inconnues.
Quelques semaines après la publication d'Invoke-Obfuscation, Lee Holmes (@Lee_Homes) a rédigé un article de blog intitulé More Detecting Obfuscated PowerShell dans lequel il mettait en avant des techniques d'analyse statistique pour détecter des caractéristiques anormales présentes dans les scripts fortement obfusqués, notamment ceux produits par Invoke-Obfuscation.
Depuis cet échange, Daniel et Lee sont devenus de bons amis et ont partagé de nombreux intérêts/obsessions communs — notamment, un amour du bon café et la quête de nouvelles façons de détecter en profondeur le PowerShell obfusqué.
Le temps que les deux défenseurs ont passé à étudier la recherche et le code de preuve de concept équivaudrait à plusieurs milliers de tasses de café préparé à la Chemex, en supposant un temps d'infusion cible de 4 minutes (et en espérant qu'au moins un autre amateur de café ait saisi ce jeu de mots « pour over »).
Revoke-Obfuscation est le produit final artisanal de ces efforts.
Revoke-Obfuscation est un framework open-source compatible PowerShell v3.0+ pour détecter à grande échelle les commandes et scripts PowerShell obfusqués. Il s'appuie sur l'AST (arbre syntaxique abstrait) de PowerShell pour extraire rapidement des milliers de caractéristiques de tout script PowerShell d'entrée et comparer ce vecteur de caractéristiques à l'un des plusieurs vecteurs de caractéristiques pondérés prédéfinis, calculés via un processus d'apprentissage automatisé mené sur un corpus de plus de 408 000 scripts PowerShell. Ce corpus complet peut être téléchargé depuis (https://aka.ms/PowerShellCorpus). Vous trouverez les détails des aspects de science des données de ce travail dans le sous-répertoire 'DataScience' du dépôt.
Puisque Revoke-Obfuscation repose sur l'extraction et la comparaison de caractéristiques plutôt que sur de purs IOC ou une correspondance RegEx, il est plus robuste dans sa capacité à identifier des techniques d'obfuscation inconnues, même lorsque les attaquants tentent d'atténuer leur obfuscation en la rembourrant de contenu de script non obfusqué pour contourner les vérifications de base comme l'analyse de fréquence des caractères.
Revoke-Obfuscation peut facilement analyser la plupart des scripts PowerShell d'entrée en 100 à 300 millisecondes. Ce niveau de performance permet à une organisation de mesurer l'obfuscation de (au pire) 12 000+ scripts PowerShell par heure sans avoir besoin d'indexer les journaux verbeux des blocs de script PowerShell dans un SIEM.
Enfin, Revoke-Obfuscation prend en charge une fonctionnalité de liste blanche facile, ainsi que la capacité d'ingérer les enregistrements du journal des événements PowerShell Operational et de réassembler les blocs de script enregistrés dans de nombreux enregistrements de bloc de script EID 4104. Il peut facilement devenir un guichet unique pour ingérer les journaux d'événements PowerShell Operational d'un environnement, réassembler et dédoublonner tous les scripts de ces journaux, puis identifier les scripts PowerShell obfusqués qui méritent une inspection manuelle.
Le code source de Revoke-Obfuscation est hébergé sur Github, et vous pouvez le télécharger, le forker et le consulter à partir de ce dépôt (https://github.com/danielbohannon/Revoke-Obfuscation). Veuillez signaler les problèmes ou demandes de fonctionnalités via le bug tracker Github associé à ce projet.
Pour installer (depuis Github) :
Import-Module .\Revoke-Obfuscation.psd1
Le code source peut également être installé directement depuis PowerShell Gallery via les commandes suivantes :
Pour installer (depuis PowerShell Gallery) :
Install-Module Revoke-Obfuscation
Import-Module Revoke-Obfuscation
Revoke-Obfuscation fournira un tutoriel détaillé ainsi que quelques autres surprises amusantes. Mais si vous n'êtes pas intéressé par les fous rires, vous pouvez simplement exécuter Get-Help Measure-RvoObfuscation pour voir la syntaxe d'utilisation ou continuer à lire.
Deux fonctions principales sont utilisées dans ce framework :
Si vous devez réassembler et extraire les journaux de blocs de script à partir des journaux PowerShell Operational, alors Get-RvoScriptBlock est la fonction de choix. Elle renvoie automatiquement uniquement les blocs de script uniques et exclut certaines valeurs de blocs de script par défaut jugées non malveillantes. Cela peut être outrepassé avec le commutateur -Deep.
Get-RvoScriptBlock -Path 'C:\Windows\System32\Winevt\Logs\Microsoft-Windows-PowerShell%4Operational.evtx' -VerboseGet-ChildItem .\Demo\demo.evtx | Get-RvoScriptBlock -VerboseGet-WinEvent -LogName Microsoft-Windows-PowerShell/Operational | Get-RvoScriptBlock -VerboseGet-RvoScriptBlock prend également en charge les résultats d'audit MIR/HX ainsi que les journaux PowerShell
Operational récupérés via le projet CimSweep de Matt Graeber (@mattifestation)
(https://github.com/PowerShellMafia/CimSweep). Pour CimSweep, une légère
modification du registre est nécessaire pour tromper WMI afin qu'il interroge un journal d'événements non classique.
Les détails se trouvent dans la section NOTES de Get-RvoScriptBlock.
Get-ChildItem C:\MirOrHxAuditFiles\*_w32eventlogs.xml | Get-RvoScriptBlock -VerboseGet-CSEventLogEntry -LogName Microsoft-Windows-PowerShell/Operational | Get-RvoScriptBlockUn exemple complet avec les données de test enregistrées dans demo.evtx peut être trouvé ci-dessous :
$obfResults = Get-WinEvent -Path .\Demo\demo.evtx | Get-RvoScriptBlock | Measure-RvoObfuscation -OutputToDisk -Verbose
Un exemple complet avec des scripts de test hébergés localement et à distance peut être trouvé ci-dessous :
Measure-RvoObfuscation -Url 'http://bit.ly/DBOdemo1' -Verbose -OutputToDiskGet-Content .\Demo\DBOdemo*.ps1 | Measure-RvoObfuscation -Verbose -OutputToDiskGet-ChildItem .\Demo\DBOdemo*.ps1 | Measure-RvoObfuscation -Verbose -OutputToDiskLe commutateur -OutputToDisk produira automatiquement tous les scripts obfusqués dans .\Results\Obfuscated. Quoi qu'il en soit, tous les résultats seront renvoyés sous forme d'objets PSCustomObject contenant le contenu du script ainsi que des métadonnées comme un score d'obfuscation, le temps d'analyse, le résultat de la liste blanche, toutes les caractéristiques extraites du script, etc.
Trois options de liste blanche existent à deux endroits dans Revoke-Obfuscation :
-WhitelistFile .\files\*.ps1,.\more_files\*.ps1,.\one_more_file.ps1-WhitelistContent 'string 1 to whitelist','string 2 to whitelist'-WhitelistRegex 'regex 1 to whitelist','regex 2 to whitelist'Si vous souhaitez créer votre propre ensemble de données d'entraînement et générer un vecteur pondéré pour la fonction Measure-Vector, alors ModelTrainer.cs/ModelTrainer.exe peut être exécuté sur un ensemble de données étiqueté. La commande suivante extraira les vecteurs de caractéristiques de tous les scripts d'entrée et les agrégera dans un seul CSV utilisé dans cette phase d'entraînement :
Get-ChildItem .\*.ps1 | ForEach-Object { [PSCustomObject](Get-RvoFeatureVector -Path $_.FullName) | Export-Csv .\all_features.csv -Append }
Enfin, si vous cherchez une plateforme pour créer des indicateurs (IOCs) exploitant la puissance de l'AST (arbre syntaxique abstrait) de PowerShell — ce que nous recommandons vivement pour identifier les activités PowerShell malveillantes qui ne sont PAS obfusquées — alors PS Script Analyzer est un excellent framework conçu pour gérer de telles tâches.
Revoke-Obfuscation est publié sous la licence Apache 2.0.
v1.0 - 2017-07-27 Black Hat USA & 2017-07-30 DEF CON : Publication publique de Revoke-Obfuscation.