
Erkennungsframework für PowerShell-Obfuskation


Revoke-Obfuscation ist ein mit PowerShell v3.0+ kompatibles PowerShell-Erkennungsframework für Obfuskierung.
Daniel Bohannon (@danielhbohannon) Lee Holmes (@Lee_Homes)
Blog-Beitrag: https://www.fireeye.com/blog/threat-research/2017/07/revoke-obfuscation-powershell.html
Whitepaper: https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/revoke-obfuscation-report.pdf
Im Herbst 2016 und Frühjahr 2017 veröffentlichte Daniel Bohannon (@danielhbohannon) Invoke-Obfuscation und Invoke-CradleCrafter, zwei Open-Source-PowerShell-Obfuskierungsframeworks. Ziel dieser Forschung und dieser Frameworks war es, die Grenzen eines rein signaturbasierten Ansatzes zur Erkennung der Nutzung von PowerShell durch Angreifer aufzuzeigen. Die Kernbotschaft an Verteidiger war, sich neben bekannten verdächtigen Syntaxmustern auf die Erkennung von Indikatoren für Obfuskierung zu konzentrieren.
Die extremen Randomisierungsgrade in Invoke-Obfuscation und Invoke-CradleCrafter, gepaart mit den Obfuskierungsoptionen auf Token-Ebene, die in der PowerShell-Skriptblockprotokollierung nicht deobfuskiert werden, haben Verteidiger jedoch dazu veranlasst, nach einer neuen, skalierbaren Methode zu suchen, um sowohl bekannte als auch unbekannte Obfuskierungstechniken generisch zu erkennen.
Einige Wochen nach der Veröffentlichung von Invoke-Obfuscation veröffentlichte Lee Holmes (@Lee_Homes) einen Blogbeitrag mit dem Titel More Detecting Obfuscated PowerShell, in dem er statistische Analysetechniken zur Erkennung anomaler Merkmale in stark obfuskierten Skripten hervorhob, insbesondere solcher, die von Invoke-Obfuscation erzeugt wurden.
Seit diesem Austausch sind Daniel und Lee gute Freunde geworden und teilen viele gemeinsame Interessen/Leidenschaften – namentlich eine Liebe zu gutem Kaffee und das Streben nach neuen Wegen zur gründlichen Erkennung obfuskierten PowerShells.
Die Zeit, die beide Blue Teamer mit dem Studium von Forschungsergebnissen und Proof-of-Concept-Code verbracht haben, würde mehreren tausend Tassen Chemex-gebrühtem Kaffee entsprechen, wenn man die richtige Brühzeit von 4 Minuten annimmt (vorausgesetzt, mindestens ein anderer Kaffeeliebhaber hat diesen „Pour Over“-Wortwitz verstanden).
Revoke-Obfuscation ist das endgültige handgefertigte Produkt dieser Bemühungen.
Revoke-Obfuscation ist ein Open-Source-PowerShell-v3.0+-Framework zur Erkennung obfuskierten PowerShell-Befehle und -Skripte in großem Maßstab. Es nutzt den AST (Abstract Syntax Tree) von PowerShell, um Tausende von Merkmalen aus jedem eingegebenen PowerShell-Skript schnell zu extrahieren und diesen Merkmalsvektor mit einem von mehreren vordefinierten gewichteten Merkmalsvektoren zu vergleichen, die durch einen automatisierten Lernprozess anhand eines Korpus von über 408.000 PowerShell-Skripten berechnet wurden. Der vollständige Korpus kann unter (https://aka.ms/PowerShellCorpus) heruntergeladen werden. Details zu den datenwissenschaftlichen Aspekten dieser Arbeit finden Sie im Unterverzeichnis 'DataScience' des Repositorys.
Da Revoke-Obfuscation auf Merkmalsextraktion und -vergleich basiert und nicht auf reinen IOCs oder Regex-Abgleichen, ist es robuster bei der Identifizierung unbekannter Obfuskierungstechniken, selbst wenn Angreifer versuchen, ihre Obfuskierung zu verschleiern, indem sie sie mit unobfuskierten Skriptinhalten auffüllen, um einfache Prüfungen wie die Zeichenfrequenzanalyse zu umgehen.
Revoke-Obfuscation kann die meisten eingegebenen PowerShell-Skripte problemlos innerhalb von 100-300 Millisekunden messen. Diese Leistungsfähigkeit ermöglicht es einer Organisation, die Obfuskierung von (im schlimmsten Fall) über 12.000 PowerShell-Skripten pro Stunde zu messen, ohne ausführliche PowerShell-Skriptblockprotokolle in einem SIEM indizieren zu müssen.
Schließlich unterstützt Revoke-Obfuscation eine einfache Whitelisting-Funktionalität sowie die Möglichkeit, PowerShell Operational-Ereignisprotokolleinträge zu erfassen und Skriptblöcke wieder zusammenzusetzen, die über zahlreiche Skriptblock-EID-4104-Einträge aufgezeichnet wurden. Es kann leicht zu einer zentralen Anlaufstelle werden, um die PowerShell Operational-Ereignisprotokolle einer Umgebung zu erfassen, alle Skripte in diesen Protokollen neu zusammenzusetzen und zu deduplizieren und dann obfuskierte PowerShell-Skripte zu identifizieren, die eine manuelle Überprüfung verdienen.
Der Quellcode von Revoke-Obfuscation wird auf Github gehostet. Sie können ihn aus diesem Repository herunterladen, forken und überprüfen (https://github.com/danielbohannon/Revoke-Obfuscation). Bitte melden Sie Probleme oder Feature-Wünsche über den mit diesem Projekt verbundenen Github-Bug-Tracker.
Zur Installation (von Github):
Import-Module .\Revoke-Obfuscation.psd1
Der Quellcode kann auch direkt aus dem PowerShell-Katalog über die folgenden Befehle installiert werden:
Zur Installation (aus dem PowerShell-Katalog):
Install-Module Revoke-Obfuscation
Import-Module Revoke-Obfuscation
Revoke-Obfuscation bietet eine detaillierte Anleitung sowie einige andere lustige Überraschungen. Wenn Sie jedoch nicht auf den Spaß aus sind, können Sie einfach Get-Help Measure-RvoObfuscation ausführen, um die Verwendungssyntax zu sehen, oder einfach weiterlesen.
Es gibt zwei primäre Funktionen in diesem Framework:
Wenn Sie Skriptblockprotokolle aus PowerShell Operational-Protokollen wieder zusammensetzen und extrahieren müssen, ist Get-RvoScriptBlock Ihre Funktion der Wahl. Es gibt automatisch nur eindeutige Skriptblöcke zurück und schließt bestimmte Standardskriptblockwerte aus, die als nicht bösartig eingestuft werden. Dies kann mit dem Schalter -Deep überschrieben werden.
Get-RvoScriptBlock -Path 'C:\Windows\System32\Winevt\Logs\Microsoft-Windows-PowerShell%4Operational.evtx' -VerboseGet-ChildItem .\Demo\demo.evtx | Get-RvoScriptBlock -VerboseGet-WinEvent -LogName Microsoft-Windows-PowerShell/Operational | Get-RvoScriptBlock -VerboseGet-RvoScriptBlock unterstützt auch MIR/HX-Auditergebnisse sowie PowerShell-Operational-Protokolle, die über Matt Graebers (@mattifestation) CimSweep-Projekt abgerufen wurden
(https://github.com/PowerShellMafia/CimSweep). Für CimSweep ist eine kleine
Registry-Anpassung erforderlich, um WMI dazu zu bringen, ein nicht-klassisches Ereignisprotokoll abzufragen.
Details finden Sie im ABSCHNITT NOTES von Get-RvoScriptBlock.
Get-ChildItem C:\MirOrHxAuditFiles\*_w32eventlogs.xml | Get-RvoScriptBlock -VerboseGet-CSEventLogEntry -LogName Microsoft-Windows-PowerShell/Operational | Get-RvoScriptBlockEin vollständiges Beispiel mit Testdaten, die in demo.evtx aufgezeichnet wurden, finden Sie unten:
$obfResults = Get-WinEvent -Path .\Demo\demo.evtx | Get-RvoScriptBlock | Measure-RvoObfuscation -OutputToDisk -Verbose
Ein vollständiges Beispiel mit lokal und remote gehosteten Testskripten finden Sie unten:
Measure-RvoObfuscation -Url 'http://bit.ly/DBOdemo1' -Verbose -OutputToDiskGet-Content .\Demo\DBOdemo*.ps1 | Measure-RvoObfuscation -Verbose -OutputToDiskGet-ChildItem .\Demo\DBOdemo*.ps1 | Measure-RvoObfuscation -Verbose -OutputToDiskDer Schalter -OutputToDisk gibt automatisch alle obfuskierten Skripte in .\Results\Obfuscated\ aus. Unabhängig davon werden alle Ergebnisse als PSCustomObjects zurückgegeben, die den Skriptinhalt zusammen mit Metadaten wie einem Obfuskierungs-Score, Messzeit, Whitelisting-Ergebnis, allen extrahierten Skriptmerkmalen usw. enthalten.
Es gibt drei Whitelisting-Optionen an zwei Stellen in Revoke-Obfuscation:
-WhitelistFile .\files\*.ps1,.\more_files\*.ps1,.\one_more_file.ps1-WhitelistContent 'zu whitelistende Zeichenfolge 1','zu whitelistende Zeichenfolge 2'-WhitelistRegex 'zu whitelistender regex 1','zu whitelistender regex 2'Wenn Sie daran interessiert sind, Ihren eigenen Trainingsdatensatz zu erstellen und einen gewichteten Vektor für die Measure-Vector-Funktion zu generieren, kann ModelTrainer.cs/ModelTrainer.exe gegen einen gekennzeichneten Datensatz ausgeführt werden. Der folgende Befehl extrahiert Merkmalsvektoren aus allen eingegebenen Skripten und aggregiert sie in einer einzigen CSV-Datei, die in dieser Trainingsphase verwendet wird:
Get-ChildItem .\*.ps1 | ForEach-Object { [PSCustomObject](Get-RvoFeatureVector -Path $_.FullName) | Export-Csv .\all_features.csv -Append }
Wenn Sie schließlich nach einer Plattform zur Erstellung von Indikatoren (IOCs) suchen, die die Leistungsfähigkeit des PowerShell-AST (Abstract Syntax Tree) nutzt – was wir für die Identifizierung bösartiger PowerShell-Aktivitäten, die NICHT obfuskiert sind, wärmstens empfehlen – dann ist PS Script Analyzer ein hervorragendes Framework, das für solche Aufgaben entwickelt wurde.
Revoke-Obfuscation wird unter der Apache-2.0-Lizenz veröffentlicht.
v1.0 – 2017-07-27 Black Hat USA & 2017-07-30 DEF CON: Öffentliche Veröffentlichung von Revoke-Obfuscation.