
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
Chargez vos scripts PowerShell directement depuis un dossier ou fichier local sans avoir à fournir de fichier de configuration.
-Config
Le chemin vers votre fichier de configuration JSON. Jetez un œil à l’exemple fourni avec ce script pour des idées.
-ModulesDirectory
Le chemin vers le répertoire modules. La valeur par défaut est « .\modules ». Si ModulesDirectory est utilisé, les paramètres EvasionPath et ObfuscationPath ne peuvent pas être utilisés.
-EvasionPath
Le chemin vers le script d’évasion. Si EvasionPath et ObfuscationPath sont utilisés, le paramètre ModulesDirectory ne peut pas être utilisé.
-ObfuscationPath
Le chemin vers le script d’obfuscation. Si EvasionPath et ObfuscationPath sont utilisés, le paramètre ModulesDirectory ne peut pas être utilisé.
-ValidateOnly
Utilisez ceci avec « -Config » pour que le script valide la syntaxe de base de votre fichier de configuration JSON sans l’exécuter.
-GithubCredentials
Transmettez le nom d’utilisateur GitHub et le jeton d’accès sous forme d’objet d’identification afin que le script ne les demande pas. Utile si vous créez une armurerie à plusieurs reprises pour des tests.
Utilisation comme ceci :
$c = get-credential
New-PSArmoury -GithubCredentials $c
Vous devez fournir un nom d’utilisateur GitHub valide ainsi qu’un jeton d’accès personnel afin que le script puisse utiliser correctement l’API GitHub. N’utilisez pas nom d’utilisateur/mot de passe car cela ne fonctionnera de toute façon pas si vous avez activé l’authentification multifacteur (MFA) (et vous devriez activer MFA). De plus, l’accès à l’API avec un nom d’utilisateur/mot de passe de base est déprécié.
Suivez ce guide pour créer un jeton d’accès personnel.
Veuillez noter : la seule autorisation dont nous avons besoin sur le jeton d’accès est public_repo dans la section repo.
En effet, vous n’avez besoin du jeton que pour que GitHub ne nous bloque pas si vous analysez des dépôts plus volumineux (comme PowerSploit) à la recherche de fichiers .ps1 à inclure.
Si vous souhaitez créer une armurerie avec les paramètres par défaut (note : cela n’obfusquera rien en plus du codage base64), exécutez simplement ce qui suit.
. .\New-PSArmoury.ps1
New-PSArmoury
Cela créera un fichier .ps1 appelé « MyArmoury.ps1 » dans le répertoire de travail actuel en utilisant :
Vous pouvez charger l’armurerie dans votre session actuelle en utilisant :
cat -raw .\MyArmoury.ps1 | iex
Le chargement de votre armurerie invoque les étapes suivantes :
Après cela, tout le code PowerShell que vous avez placé dans l’armurerie sera disponible. Invoquez simplement les cmdlets comme d’habitude, par exemple :
Invoke-Rubeus -Command "kerberoast /stats"
Get-DomainGroupMember -Identity "Domain Admins" -Recurse
S’il vous arrive de ne pas vous souvenir de ce que vous avez mis dans l’armurerie, chargez-la et appelez l’inventaire :-)
Get-PSArmoury
Lancez New-PSArmoury avec les paramètres -EvasionPath et -ObfuscationPath comme ceci :
New-PSArmoury -Config C:\myarmouryconfig.json -ObfuscationPath .\modules\TEMPLATE_obfuscation_byte_convert.ps1 -EvasionPath .\modules\evasion.ps1
Remarque : dans ce cas, tous les fichiers .ps1 du dossier seront ajoutés puisque nous soumettons un chemin de dossier. Si nous soumettons le chemin vers un seul fichier, seul ce fichier sera traité.
New-PSArmoury -FromFile C:\myscriptfolder