
Eine Sammlung von Techniken, Beispielen und ein wenig Theorie zur manuellen Verschleierung von PowerShell-Skripten zur Umgehung von Antivirensoftware, zusammengestellt zu Bildungszwecken. Die Inhalte dieses Repositorys sind das Ergebnis persönlicher Forschung, einschließlich Online-Recherchen sowie Versuch-und-Irrtum-Experimenten in Laboren und bei Pentests.
Eine Sammlung von Techniken, Beispielen und ein wenig Theorie zum manuellen Verschleiern von PowerShell-Skripten, um signaturbasierte Erkennung zu umgehen, zusammengestellt für Bildungszwecke. Der Inhalt dieses Repositorys ist das Ergebnis persönlicher Forschung, einschließlich Online-Recherchen und Trial-and-Error-Versuchen in Laboren und Pentests. Du solltest nichts als selbstverständlich hinnehmen.
YouTube-Videopräsentation: youtube.com/watch?v=tGFdmAh_lXE
⚠️ Haftungsausschluss: Die Nutzung der in diesem Repository beschriebenen Techniken und Konzepte, um unbefugten Zugriff auf Systeme zu erlangen, die du nicht testen darfst, ist illegal. Du bist für deine Handlungen verantwortlich. Sei nicht böse.
Der wissenschaftliche Begriff entropy, der allgemein definiert ist als das Maß für Zufälligkeit oder Unordnung eines Systems, ist bei der AV-Umgehung wichtig. Das liegt daran, dass Malware häufig Code enthält, der stark randomisiert, verschlüsselt und/oder kodiert (verschleiert) ist, um die Analyse und damit die Erkennung zu erschweren. Als eine von verschiedenen Methoden verwenden Antivirenprodukte die Entropieanalyse, um potenziell schädliche Dateien und Payloads zu identifizieren.
Es ist wichtig, dieses Konzept zu verstehen, denn beim Verschleiern von Code solltest du die Entropievarianz im Blick behalten, die durch die Änderungen entsteht, die du vornimmst. Signaturen zu brechen ist einfach, aber wenn du nicht auf das Entropieniveau achtest, werden ausgefeilte AV/EDRs es durchschauen.
Ein Prinzip, das du im Hinterkopf behalten solltest: Je größer die Entropie, desto wahrscheinlicher sind die Daten verschleiert oder verschlüsselt, und desto wahrscheinlicher ist die Datei/das Payload bösartig. Glücklicherweise gibt es Möglichkeiten, sie zu senken.
Claude E. Shannon stellte in seiner Arbeit von 1948, A Mathematical Theory of Communication, eine Formel vor, mit der sich die Entropie in einem Datensatz messen lässt. Hier ist eine einfache Python-Implementierung der Shannon Entropy, die du verwenden kannst, um die Entropie der von dir entwickelten Payloads zu messen:
#!/bin/python3
# Usage: python3 entropy.py <file>
import math, sys
def entropy(string):
"Calculates the Shannon entropy of a UTF-8 encoded string"
# decode the string as UTF-8
unicode_string = string.decode('utf-8')
# get probability of chars in string
prob = [ float(unicode_string.count(c)) / len(unicode_string) for c in dict.fromkeys(list(unicode_string)) ]
# calculate the entropy
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in prob ])
return entropy
f = open(sys.argv[1], 'rb')
content = f.read()
f.close()
print(entropy(content))
Du kannst auch diesen Online-Shannon-Entropie-Rechner oder Microsofts Sigcheck.exe mit der Option -a verwenden.
Der ausgereifte und elegante Ansatz, bevor man sich in Trial-and-Error-Verschleierungstests stürzt, um eine Payload-Variation zu entwickeln, die nicht markiert wird, besteht darin, die Teile in einem Skript zu identifizieren, die die Malware-Erkennung auslösen. Gerade bei kurzen Skripten wie C2-Befehlen kannst du möglicherweise unbedeutende Änderungen vornehmen und sofort vom Radar verschwinden.
Ein großartiges Werkzeug zur Identifizierung solcher Auslöser ist AMSITrigger. Hier ist ein Anwendungsbeispiel mit einer Datei, die ein bösartiges Skript enthält. Der rote Bereich kennzeichnet den Teil, auf den die Verschleierung angewendet werden sollte:

Du kannst Auslöser auch manuell identifizieren, indem du ein Skript Stück für Stück ausführst.
Beim Verschleiern von Skripten sollte es eine Priorität sein, Variablen-/Klassen-/Funktionsnamen durch zufällige zu ersetzen. Auf diese Weise kannst du in Kombination mit anderen Techniken die Erkennung leicht umgehen. Du solltest jedoch die Entropie der von dir entwickelten Payloads im Hinterkopf behalten. Betrachte das folgende Standard-Reverse-Shell-Skript, das von den meisten, wenn nicht allen, Antivirenprogrammen erkannt wird:

Betrachte nun die folgende verschleierte Version:

In dieser Version wurden alle Variablennamen durch 32 Zeichen lange Zufallsnamen ersetzt. Ich habe außerdem (pwd).Path durch $(gl) ersetzt. Das Payload hat eine Shannon entropy von 4.96. Zum Zeitpunkt des Schreibens wird es von MS Defender und einer Reihe anderer Produkte nicht erkannt:
