
Espace d'exécution PowerShell sûr pour l'OpSec depuis C# (alias SharpPick) avec AMSI, Mode Langage Contraint et Journalisation des blocs de scripts désactivés au démarrage
Espace d'exécution PowerShell depuis C# (alias technique SharpPick) avec AMSI, ETW et Script Block Logging désactivés pour votre confort.
De nos jours, alors que PowerShell est lourdement instrumenté par l'utilisation de techniques telles que :
Les attaquants avancés doivent trouver des moyens de contourner ces efforts afin de réaliser des exercices de simulation adversarial sophistiqués. Afin d'aider dans ces efforts, le projet suivant a été créé.
Ce programme s'appuie sur des contournements pour des techniques spécifiques incluses dans :
Qui s'appuient à leur tour sur les recherches suivantes :
L'idée de SharpPick, c'est-à-dire lancer des scripts PowerShell depuis un assembly C# via l'utilisation de Runspaces, n'est pas non plus nouvelle et a été implémentée pour la première fois par Lee Christensen (@tifkin_) dans son :
De plus, le code source emprunte l'implémentation de CustomPSHost de Lee.
Ce projet hérite des recherches ci-dessus et de la grande communauté de sécurité afin de fournir un environnement PowerShell quasi-efficace avec les défenses désactivées au démarrage.
Se compile maintenant facilement avec .NET 4.0 tandis que s'il est compilé avec .NET Framework 4.7.1+, une fonctionnalité supplémentaire est incluse qui permet de décharger les DLL constituant les artefacts de contournement du CLM et tente de les supprimer ensuite (difficile à faire fonctionner honnêtement).
Le meilleur rendement est obtenu avec Stracciatella compilé avec .NET 4.0.
Il y a plusieurs options disponibles :
PS D:\> Stracciatella -h
:: Stracciatella - Powershell runspace avec AMSI, ETW et Script Block Logging désactivés.
Mariusz Banach / mgeeky, '19-22 <[email protected]>
v0.7
Usage: stracciatella.exe [options] [command]
-s <chemin>, --script <chemin> - Chemin vers le fichier contenant le script PowerShell à exécuter. Si aucune option n'est donnée, entrera
dans une boucle pseudo-shell. Cela peut aussi être une URL HTTP(S) pour télécharger et exécuter un script powershell.
-v, --verbose - Affiche des informations détaillées
-n, --nocleanup - Ne pas supprimer les restes de désactivation du CLM (fichiers DLL dans TEMP et clés de registre COM).
Par défaut, ils seront toujours supprimés.
-C, --leaveclm - Ne pas tenter de désactiver le CLM. Plus discret. Évitera de laisser des artefacts de désactivation du CLM non supprimés.
-f, --force - Poursuivre l'exécution même si les défenses PowerShell n'ont pas été désactivées.
Par défaut, on abandonne en cas d'échec.
-c, --command - Exécute les commandes spécifiées. Vous pouvez soit utiliser -c, soit ajouter des commandes après
les paramètres de stracciatella : cmd> straciatella ipconfig /all
Si les paramètres de commande et de script sont donnés, exécute la commande après avoir exécuté le script.
-x <clé>, --xor <clé> - Considère l'entrée comme codée en XOR, où <clé> est une clé d'un octet en décimal
(préfixez avec 0x pour l'hexadécimal)
-p <nom>, --pipe <nom> - Lire les commandes powershell à partir d'un tube nommé spécifié. La commande doit être précédée de 4 octets de
sa longueur codée en little-endian (notation Longueur-Valeur).
-t <millisecs>, --timeout <millisecs>
- Spécifie le délai d'attente pour l'opération de lecture du tube (en millisecondes). Par défaut : 60 sec. 0 - illimité.
-e, --cmdalsoencoded - Considère également la commande d'entrée (spécifiée dans '--command') comme encodée.
Décode la commande d'entrée après décodage et exécution du fichier script d'entrée.
Par défaut, nous décodons uniquement le fichier d'entrée et considérons la commande donnée en texte clair
Le programme accepte une commande et un chemin de fichier script en entrée. Les deux sont optionnels, si aucun n'est donné - un pseudo-shell sera démarré. La commande et le script peuvent être encodés en utilisant XOR sur un octet (produira une sortie encodée en Base64) pour une meilleure expérience OpSec.
Voici quelques exemples présentant des cas d'utilisation :
PS D:\> Stracciatella.exe -v
:: Stracciatella - Powershell runspace avec AMSI, ETW et Script Block Logging désactivés.
Mariusz Banach / mgeeky, '19-22 <[email protected]>
v0.7
[.] Version de PowerShell : 5.1
[.] Mode de langage : FullLanguage
[+] Pas besoin de désactiver le mode de langage contraint. Déjà en FullLanguage.
[+] Script Block Logging désactivé.
[+] AMSI désactivé.
[+] ETW désactivé.
Stracciatella D:\> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.18362.1
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.1
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
Tout d'abord, pour préparer les instructions encodées, nous pouvons utiliser le script encoder.py fourni, qui peut être utilisé comme suit :
PS D:\> python encoder.py -h
usage: encoder.py [options] <commande|fichier>
positional arguments:
command Spécifie soit une commande, soit le chemin d'un fichier script à encoder
optional arguments:
-h, --help affiche ce message d'aide et quitte
-x KEY, --xor KEY Spécifie la clé de codage XOR de la commande/fichier (un octet)
-o PATH, --output PATH
(optionnel) Fichier de sortie. S'il n'est pas donné, affichera la sortie sur stdout