
Empire is a PowerShell and Python post-exploitation agent.

Invoke-Obfuscation est un outil d’obfuscation de commandes et de scripts PowerShell compatible PowerShell v2.0+.
À l’automne 2015, j’ai décidé de commencer à étudier la flexibilité du langage PowerShell et de cataloguer les différentes manières de réaliser une poignée de techniques courantes que la plupart des attaquants utilisent régulièrement.
En me concentrant d’abord sur les syntaxes de commandes encodées et de téléchargement à distance (cradle), j’ai découvert que divers caractères d’échappement, sans entraver l’exécution de la commande, persistaient dans les arguments de la ligne de commande, à la fois dans le processus en cours d’exécution et dans ce qui est journalisé dans les journaux d’événements Security EID 4688 et Sysmon EID 1. Cela m’a conduit à explorer systématiquement les moyens d’obfusquer chaque type de « jeton » présent dans une commande ou un script PowerShell.
J’ai ensuite exploré des manières plus obscures d’effectuer de l’obfuscation au niveau des chaînes, diverses techniques d’encodage/chiffrement (comme ASCII/hex/octal/binaire et même SecureString), et enfin des techniques de lancement PowerShell pour abstraire les arguments de ligne de commande de powershell.exe et les repousser vers le processus parent et même grand-parent.
Les attaquants et les malwares grand public ont commencé à utiliser des techniques d’obfuscation extrêmement basiques pour cacher la majeure partie de la commande dans les arguments de ligne de commande de powershell.exe. J’ai développé cet outil pour aider l’équipe bleue à simuler des commandes obfusquées basées sur ce que je sais être syntaxiquement possible dans PowerShell 2.0–5.0, afin qu’elle puisse tester ses capacités de détection de ces techniques.
Le seul but de l’outil est de briser toutes les hypothèses que nous, en tant que défenseurs, pourrions avoir concernant l’apparence possible des commandes PowerShell sur la ligne de commande. J’espère qu’il encouragera l’équipe bleue à rechercher les indicateurs d’obfuscation sur la ligne de commande en plus de mettre à jour la journalisation PowerShell pour inclure la journalisation des modules, des ScriptBlock et la transcription, car ces sources simplifient la plupart des aspects des techniques d’obfuscation générées par cet outil.
Bien que toutes les couches d’obfuscation aient été développées dans des scripts séparés, la plupart des utilisateurs trouveront que la fonction Invoke-Obfuscation est le moyen le plus simple d’explorer et de visualiser les techniques d’obfuscation actuellement supportées par ce framework.
Le code source d’Invoke-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/Invoke-Obfuscation). Veuillez signaler les problèmes ou demandes de fonctionnalités via le bug tracker Github associé à ce projet.
Pour installer :
Import-Module ./Invoke-Obfuscation.psd1
Invoke-Obfuscation
Invoke-Obfuscation est publié sous la licence Apache 2.0.
v1.0 – 2016-09-25 DerbyCon 6.0 (Louisville, Kentucky, États-Unis) : Publication publique d’Invoke-Obfuscation.
v1.1 – 2016-10-09 SANS DFIR Summit (Prague, République tchèque) : Ajout de la fonctionnalité de réordonnancement de l’opérateur de format -f à toutes les fonctions d’obfuscation TOKEN applicables. Ajout également d’options syntaxiques supplémentaires pour la définition de valeurs de variables.
v1.2 – 2016-10-20 CODE BLUE (Tokyo, Japon) : Ajout de l’obfuscation de type TOKEN (cast direct de type avec options d’obfuscation de chaîne pour le nom du type).
v1.3 – 2016-10-22 Hacktivity (Budapest, Hongrie) : Ajout de deux nouveaux LAUNCHERs : CLIP+ et CLIP++. Ajout également d’une syntaxe de conversion de tableau en caractères supplémentaire (et plus simple) pour toutes les fonctions ENCODING, qui ne nécessite pas ForEach-Object/% .
v1.4 – 2016-10-28 BruCON (Gand, Belgique) : Ajout d’une nouvelle fonction ENCODING BXOR. Amélioration de la casse aléatoire pour tous les composants de toutes les fonctions ENCODING ainsi que pour les indicateurs d’exécution PowerShell de tous les LAUNCHERs. Enfin, ajout de l’option raccourcie -EP pour -ExecutionPolicy à tous les LAUNCHERs, ainsi que la représentation entière optionnelle du drapeau d’exécution PowerShell -WindowStyle : Normal (0), Masqué (1), Minimisé (2), Maximisé (3).
v1.5 – 2016-11-04 Blue Hat (Redmond, Washington, États-Unis) : Ajout du LAUNCHER WMIC avec une certaine randomisation des arguments de ligne de commande WMIC.
v1.6 – 2017-01-24 Blue Hat IL (Tel Aviv, Israël) :
Invoke-Obfuscation -ScriptBlock {Write-Host 'CLI FTW!'} -Command 'Token\All\1,Encoding\1,Launcher\Stdin++\234,Clip' -Quiet -NoExitToken\All\1 pour accélérer l’obfuscation des grands scripts.Token\All\1,String\3,Encoding\5,Launcher\Ps\234,ClipToken\*\*,String\[13],Encoding\(1|6),Launcher\.*[+]{2}\234,Clippowershell -enc est saisie comme valeur SCRIPTBLOCK.-Key -Ke -K KEY dans Out-SecureStringCommand.ps1.v1.7 – 2017-03-03 nullcon (Goa, Inde) :
v1.8 – 2017-07-27 Black Hat (Las Vegas, Nevada, États-Unis) :
\Home\String .-ST/-STA (Single-Threaded Apartment) aux fonctions lanceur CLIP+ et CLIP++ car ils sont requis si l’on exécute PowerShell 2.0.Get-Item/GI/Item partout où Get-ChildItem est utilisé pour obtenir des valeurs de variables.Set-Item à la fonction d’obfuscation TYPE.Out-EncapsulatedInvokeExpression de Out-ObfuscatedStringCommand.ps1, et copiées vers tous les lanceurs, fonctions STRING et ENCODING pour ajouter de nombreuses syntaxes de ligne de commande pour IEX.String\Reverse et toutes les options d’obfuscation ENCODING :
[String]::Join('',$string)Encoding\5 :
PtrToStringAnsi / SecureStringToGlobalAllocAnsiPtrToStringBSTR / SecureStringToBSTRPtrToStringAuto, ([Runtime.InteropServices.Marshal].GetMembers()[3].Name).InvokePtrToStringAuto, ([Runtime.InteropServices.Marshal].GetMembers()[5].Name).InvokePtrToStringUni, ([Runtime.InteropServices.Marshal].GetMembers()[2].Name).InvokePtrToStringUni, ([Runtime.InteropServices.Marshal].GetMembers()[4].Name).InvokePtrToStringAnsi, ([Runtime.InteropServices.Marshal].GetMembers()[0].Name).InvokePtrToStringAnsi, ([Runtime.InteropServices.Marshal].GetMembers()[1].Name).InvokeOut-ObfuscatedTokenCommand.ps1 pour que l’obfuscation VARIABLE n’encapsule pas les variables dans ${} si elles le sont déjà (ainsi ${${var}} ne se produira pas, car cela provoque des erreurs).Invoke-Obfuscation.psm1 par Invoke-Obfuscation.psd1 (merci @Carlos_Perez).