
Un arsenal PowerShell pour les gars et les filles de la sécurité
[!IMPORTANT]
Ce dépôt est désormais archivé. Même si ce fut un voyage amusant, je pense que PSArmoury a perdu son utilité.
Le PowerShell Armoury est conçu pour les pentesteurs, les « membres d’équipe de toutes les couleurs » et toute personne utilisant une variété d’outils PowerShell lors de ses missions. Il vous permet de télécharger et de stocker tous vos scripts PowerShell préférés dans un seul fichier obfusqué.
Vous n’avez plus à vous soucier de la mise à jour manuelle de Rubeus, PowerView, etc. Créez simplement un fichier de configuration une fois ou utilisez celui par défaut fourni avec l’outil. Désormais, il vous suffit d’exécuter « New-PSArmoury » avant de vous lancer dans votre prochaine mission. De plus, PSArmoury obfusque votre code et intègre un contournement AMSI. La conception modulaire devrait vous permettre de modifier facilement le code d’évasion ou d’obfuscation en cas de détection.
La version actuelle de PSArmoury privilégie une conception modulaire.
New-PSArmoury.ps1
PSArmoury.json
utilities
ConvertTo-Powershell.ps1
Invoke-Shuffle.ps1
modules
evasion.ps1
obfuscation.ps1
Le code est divisé en un script générateur principal appelé New-PSArmoury.ps1, qui est celui que vous exécutez. Le code pour l’évasion, l’obfuscation et la désobfuscation est stocké dans des fichiers .ps1 séparés dans le répertoire modules. Ces fichiers séparés sont appelés par le script principal et devraient vous permettre de modifier plus facilement des fonctions spécifiques (comme un contournement AMSI).
En plus du répertoire modules, il y a aussi le répertoire utilities. Vous y trouverez des scripts autonomes qui peuvent être utiles dans des scénarios spécifiques.
Le chemin par défaut du répertoire modules est .\modules, où le point fait référence au répertoire de travail actuel de votre shell. Vous pouvez modifier le chemin du répertoire modules en utilisant l’argument -ModulesDirectory de New-PSArmoury.
Les noms des fichiers de script eux-mêmes sont cependant codés en dur dans le script principal et doivent toujours être :
Examinons ces deux fichiers de plus près.
Ce script doit contenir le code destiné à contourner ce que vous souhaitez contourner. Par défaut, il contient un contournement AMSI bien connu (merci amsi.fail). Veuillez noter que :
Ce script doit contenir le code utilisé pour l’obfuscation et la désobfuscation. Le fichier obfuscation.ps1 par défaut utilise le chiffrement RC2. Exemples prêts à l’emploi :
Notez que le fichier TEMPLATE_obfuscation_empty.ps1 ne fait vraiment rien du tout et sert de modèle pour que vous construisiez votre propre fonction.
Si vous souhaitez utiliser l’un de ces fichiers, renommez-le simplement en « obfuscation.ps1 » et supprimez le fichier par défaut.
Si vous souhaitez créer une version personnalisée, gardez à l’esprit les points suivants concernant l’obfuscation :
Et n’oubliez pas ces points concernant la désobfuscation :
Le répertoire utilities contient des scripts autonomes utiles.
Le fichier de configuration doit être un JSON valide composé d’un seul tableau contenant un ou plusieurs objets, chaque objet étant interprété comme une source de script unique. Chaque objet possède les attributs suivants :
Nom (Obligatoire)
Un nom de votre choix pour identifier le script inclus dans cet objet. C’est simplement une référence pour vous-même.
URL (Obligatoire)
L’emplacement pour obtenir le contenu du script. Il peut s’agir d’une URL vers une ressource web (https://), d’un chemin local (C:) ou d’une ressource réseau (\...). L’URL est transmise respectivement à Net.Webclient ou à Get-Item de PowerShell. En gros, tout format que l’un de ces deux peut gérer par défaut devrait fonctionner.
Type (Obligatoire)
Celui-ci donne une indication sur l’emplacement du script au créateur de l’armurerie. Il existe trois types valides :
FileInclusionFilter (Optionnel)
Sera interprété uniquement dans un objet de type « GitHub ». Sera comparé avec l’opérateur de comparaison « like » de PowerShell sur le nom complet du fichier, alors gardez à l’esprit que vous devez inclure les caractères génériques vous-même. N’oubliez pas d’inclure un astérisque (*) si vous souhaitez correspondre à une partie d’un nom de fichier. « *.ps1 » signifie tous les fichiers se terminant par « .ps1 », mais « .ps1 » signifie simplement « .ps1 ».
Vous n’êtes pas obligé d’inclure un filtre, mais si vous le faites, vous devez l’utiliser. Un InclusionFilter vide signifie aucun fichier.
FileExclusionFilter (Optionnel)
Comme le filtre d’inclusion, mais évidemment dans l’autre sens. L’exclusion a priorité.
Voir l’aide PowerShell intégrée (man -full New-PSArmoury) pour plus de détails.
-Path
Le chemin vers votre nouveau fichier d’armurerie. La valeur par défaut est « .\MyArmoury.ps1 »
-FromFile