
Ein PowerShell-Arsenal für Sicherheitsleute
[!WICHTIG]
Dieses Repository ist nun archiviert. Auch wenn es eine unterhaltsame Reise war, glaube ich, dass PSArmoury seinen Nutzen überlebt hat.
Die PowerShell Armoury richtet sich an Pentester, "insert-color-here"-Teammitglieder und alle anderen, die während ihrer Einsätze eine Vielzahl von PowerShell-Tools verwenden. Sie ermöglicht es Ihnen, alle Ihre Lieblings-PowerShell-Skripte in einer einzigen, obfuskierten Datei herunterzuladen und zu speichern.
Sie müssen sich nicht mehr darum kümmern, Rubeus, PowerView, ... manuell zu aktualisieren. Erstellen Sie einfach einmal eine Konfigurationsdatei oder verwenden Sie die mitgelieferte Standarddatei. Von nun an brauchen Sie nur noch "New-PSArmoury" auszuführen, bevor Sie zum nächsten Einsatz aufbrechen. Zusätzlich obfuskiert PSArmoury Ihren Code und verfügt über einen integrierten AMSI-Bypass. Das modulare Design sollte es Ihnen leicht machen, den Evasion- oder Obfuskationscode zu ändern, falls es eine Erkennung gibt.
Der Code ist aufgeteilt in ein Hauptskript namens New-PSArmoury.ps1, das Sie ausführen. Der Code für Evasion, Obfuskation und Deobfuskation ist in separaten .ps1-Dateien im Verzeichnis modules gespeichert. Diese separaten Dateien werden vom Hauptskript aufgerufen und sollten es Ihnen erleichtern, bestimmte Funktionen (z. B. einen AMSI-Bypass) zu ändern.
Zusätzlich zum modules-Verzeichnis gibt es auch das Verzeichnis utilities. Hier finden Sie eigenständige Skripte, die in bestimmten Szenarien nützlich sein können.
Der Standardpfad des modules-Verzeichnisses ist .\modules, wobei der Punkt das aktuelle Arbeitsverzeichnis Ihrer Shell bezeichnet. Sie können den Pfad des modules-Verzeichnisses mit dem Argument -ModulesDirectory von New-PSArmoury ändern.
Die Namen der Skriptdateien selbst sind jedoch im Hauptskript fest codiert und werden immer erwartet als:
Werfen wir einen genaueren Blick auf diese beiden.
Dieses Skript sollte den Code enthalten, der dazu dient, das zu umgehen, was Sie umgehen möchten. Standardmäßig enthält es einen bekannten AMSI-Bypass (Dank an amsi.fail). Bitte beachten Sie:
Dieses Skript sollte den Code enthalten, der für Obfuskation und Deobfuskation verwendet wird. Die Standard-obfuscation.ps1 verwendet RC2-Verschlüsselung. Fertige Beispiele:
Beachten Sie, dass die TEMPLATE_obfuscation_empty.ps1 wirklich gar nichts tut und als Vorlage für Ihre eigene Funktion dient.
Wenn Sie eine davon verwenden möchten, benennen Sie sie einfach in "obfuscation.ps1" um und löschen Sie die Standarddatei.
Wenn Sie eine angepasste Version erstellen möchten, beachten Sie Folgendes in Bezug auf die Obfuskation:
Und stellen Sie sicher, dass Sie diese Dinge in Bezug auf die Deobfuskation beachten:
Das utilities-Verzeichnis enthält nützliche eigenständige Skripte.
Die Konfigurationsdatei muss ein gültiges JSON sein, das aus einem einzelnen Array mit einem oder mehreren Objekten besteht, wobei jedes Objekt als eine einzelne Skriptquelle interpretiert wird. Jedes Objekt hat die folgenden Attribute
Name (Pflichtfeld)
Ein Name Ihrer Wahl zur Identifizierung des in diesem Objekt enthaltenen Skripts. Dies dient nur als Referenz für Sie selbst.
URL (Pflichtfeld)
Der Ort, von dem der Skriptinhalt bezogen wird. Dies kann eine URL zu einer Webressource (https://) oder ein lokaler Pfad (C:) oder eine Netzwerkressource (\...) sein. Die URL wird an Net.Webclient bzw. Powershells Get-Item übergeben. Grundsätzlich sollte jedes Format funktionieren, das eines der beiden standardmäßig verarbeiten kann.
Typ (Pflichtfeld)
Dies gibt dem Armoury-Ersteller einen Hinweis auf den Skript-Speicherort. Es gibt drei gültige Typen:
FileInclusionFilter (Optional)
Wird nur bei einem Objekt vom Typ "GitHub" interpretiert. Wird mit dem Powershell-Vergleichsoperator "like" gegen den gesamten Dateinamen gematcht. Denken Sie daran, dass Sie die Platzhalter selbst einfügen müssen. Vergessen Sie nicht, einen Stern (*) einzufügen, wenn Sie einen Teil eines Dateinamens abgleichen möchten. "*.ps1" bedeutet alle Dateien, die mit ".ps1" enden, aber ".ps1" bedeutet nur ".ps1".
Sie müssen keinen Filter angeben, aber wenn Sie einen angeben, müssen Sie ihn auch verwenden. Ein leerer InclusionFilter bedeutet keine Dateien.
FileExclusionFilter (Optional)
Wie der InclusionFilter, aber offensichtlich umgekehrt. Ausschluss hat Vorrang.
Siehe die Inline-PowerShell-Hilfe (man -full New-PSArmoury) für weitere Details.
-Path
Der Pfad zu Ihrer neuen Armoury-Datei. Der Standard ist ".\MyArmoury.ps1"
-FromFile
Laden Sie Ihre PowerShell-Skripte direkt von einem lokalen Ordner oder einer Datei und Sie müssen keine Konfigurationsdatei bereitstellen.
-Config
Der Pfad zu Ihrer JSON-Konfigurationsdatei. Schauen Sie sich das mitgelieferte Beispiel für Ideen an.
-ModulesDirectory
Der Pfad zum modules-Verzeichnis. Der Standard ist ".\modules". Wenn ModulesDirectory verwendet wird, können die Parameter EvasionPath und ObfuscationPath nicht verwendet werden.
-EvasionPath
Der Pfad zum Evasion-Skript. Wenn EvasionPath und ObfuscationPath verwendet werden, kann der Parameter ModulesDirectory nicht verwendet werden.
-ObfuscationPath
Der Pfad zum Obfuskations-Skript. Wenn EvasionPath und ObfuscationPath verwendet werden, kann der Parameter ModulesDirectory nicht verwendet werden.
-ValidateOnly
Verwenden Sie dies zusammen mit "-Config", um das Skript die grundlegende Syntax Ihrer JSON-Konfigurationsdatei überprüfen zu lassen, ohne es auszuführen.
-GithubCredentials
Übergeben Sie GitHub-Benutzernamen und Zugriffstoken als Credential-Objekt, damit das Skript nicht danach fragt. Nützlich, wenn Sie wiederholt eine Armoury zum Testen erstellen.
Verwendung wie folgt:
$c = get-credential
New-PSArmoury -GithubCredentials $c
Sie müssen einen gültigen GitHub-Benutzernamen sowie ein persönliches Zugriffstoken angeben, damit das Skript die GitHub-API ordnungsgemäß verwenden kann. Verwenden Sie kein Benutzername/Passwort, da dies ohnehin nicht funktioniert, wenn Sie MFA aktiviert haben (und Sie sollten MFA aktivieren). Auch der Zugriff auf die API mit grundlegendem Benutzername/Passwort ist veraltet.
Folgen Sie dieser Anleitung, um ein persönliches Zugriffstoken zu erstellen.
Bitte beachten: die einzige Berechtigung, die wir auf dem Zugriffstoken benötigen, ist public_repo im Bereich repo.
Dies liegt daran, dass Sie das Token nur benötigen, damit GitHub uns nicht blockiert, wenn Sie größere Repositories (wie PowerSploit) nach .ps1-Dateien durchsuchen, um sie einzubinden.
Wenn Sie eine Armoury mit den Standardeinstellungen erstellen möchten (Hinweis: dies obfuskiert außer der base64-Kodierung gar nicht), führen Sie einfach Folgendes aus.
. .\New-PSArmoury.ps1
New-PSArmoury
Dies erstellt eine .ps1-Datei namens "MyArmoury.ps1" im aktuellen Arbeitsverzeichnis, wobei verwendet werden:
Sie können die Armoury in Ihre aktuelle Sitzung laden mit
cat -raw .\MyArmoury.ps1 | iex
Das Laden Ihrer Armoury führt die folgenden Schritte aus:
Danach stehen alle PowerShell-Codes, die Sie in die Armoury aufgenommen haben, zur Verfügung. Rufen Sie die Cmdlets einfach wie gewohnt auf, z.B.
Invoke-Rubeus -Command "kerberoast /stats"
Get-DomainGroupMember -Identity "Domain Admins" -Recurse
Falls Sie vergessen haben, was Sie in die Armoury gepackt haben, laden Sie sie einfach und rufen Sie das Inventar auf :-)
Get-PSArmoury
Starten Sie New-PSArmoury mit den Parametern -EvasionPath und -ObfuscationPath wie folgt:
New-PSArmoury -Config C:\myarmouryconfig.json -ObfuscationPath .\modules\TEMPLATE_obfuscation_byte_convert.ps1 -EvasionPath .\modules\evasion.ps1
Hinweis: In diesem Fall werden alle .ps1-Dateien im Ordner hinzugefügt, da wir einen Ordnerpfad angeben. Wenn wir den Pfad zu einer einzelnen Datei angeben, wird nur diese Datei verarbeitet.
New-PSArmoury -FromFile C:\myscriptfolder