Técnicas de ofuscación para AMSI

Verschleierungstechniken für AMSI

Celia Catalán



Sehr gut für alle. In diesem Beitrag werden wir darüber sprechen, wie Antivirenprogramme (AV) bösartige Skripte zur Laufzeit erkennen und welche Maßnahmen zur Verschleierung von Skripten in Powershell ergriffen werden, damit ihre Ausführung nicht durch die AV blockiert wird.

Wie bereits in vorhergehenden Artikeln gesehen wurde, handelt es sich bei AMSI um eine API, die die AV mit Powershell verbindet Identifizieren Sie, ob ein Skript zur Laufzeit schädlich sein könnte, und blockieren Sie es gegebenenfalls. Die Frage, die man sich stellen muss, lautet jedoch: Wie erkennen Antivirenprogramme, ob das Skript bösartig ist? Die Antwort auf diese Frage sind AV-Signaturen.

Antivirensignaturen in Powershell 

Bei klassischen Virensignaturen handelt es sich um eine kontinuierliche Folge von Bytes, die in einem bestimmten Malware-Beispiel üblich ist. Das heißt, wenn diese fortlaufende Folge von Bytes in einer Datei enthalten ist, handelt es sich bei dieser Datei um Malware.

Diesem Konzept folgend sind Antivirensignaturen in PowerShell einzigartige Muster, die charakteristische Zeichenfolgen in Skripten darstellen, die in dieser Sprache geschrieben sind. Wenn ein Skript in der Powershell-Konsole geschrieben wird, sendet AMSI bei der Ausführung das Skript an das Antivirenprogramm und erkennt, ob die Signatur einer der im Skript enthaltenen Zeichenfolgen möglicherweise bösartig ist oder ob die gesamte Zeichenfolge bösartig ist und ob dies der Fall ist In diesen Fällen wird die Ausführung des Skripts vom Antivirenprogramm blockiert.

Wenn wir beispielsweise versuchen würden, mimikatz in Powershell zu verwenden, da die mimikatz-Zeichenfolge bekanntermaßen ein Skript ist, das in den falschen Händen bösartig sein könnte, wenn versucht wird, es aufzurufen, Auch wenn sich die Datei nicht im Pfad befindet, wird vor dem Auslösen des Fehlers, dass das Skript nicht gefunden wird, der Fehler ausgelöst, dass das Skript ein oder mehrere schädliche Elemente enthält und dass es vom Antivirenprogramm blockiert wurde.


Das Gleiche passiert, wenn wir die Zeichenfolge amsiInitFailed schreiben, die in einigen AMSI-Umgehungen verwendet wird. Das Antivirenprogramm erkennt und blockiert sie, da im Antivirenprogramm eine Signatur für diese bestimmte Zeichenfolge vorhanden ist:


Dies stellt daher zunächst ein Hindernis für die Ausführung bösartiger Skripte dar. Aus diesem Grund werden die Skriptzeichenfolgen in der Regel so verschleiert, dass sie keine Signatur im Antivirenprogramm haben und somit für den Virenscanner nicht erkennbar sind.

Verschleierungstechniken in Powershell

Um der AV-Erkennung zu entgehen, werden Verschleierungstechniken eingesetzt, um den Quellcode eines Skripts so zu ändern, dass es schwieriger zu erkennen und zu analysieren ist. Diese Reihe von Techniken sind die folgenden:

Base64-Kodierung und -Dekodierung: 

Diese Technik besteht darin, den Inhalt des Skripts in Base64 zu kodieren und zur Laufzeit zu dekodieren, d. h. die Zeichenfolge, die als Auslöser für die AV fungiert, wird in Base64 kodiert und innerhalb des Skripts dekodiert. 
Wie wir bereits gesehen haben, wird die Zeichenfolge amsiInitFailed vom AV erkannt, aber wenn wir sie an base64 übergeben, wird die Zeichenfolge zu YW1zaUluaXRGYWlsZWQ= und wenn wir sie zurück in ASCII konvertieren, wird sie nicht mehr erkannt, und es wird pro Terminal ausgedruckt.


Verkettung und Zeichenflucht

Der Operator zum Verketten in Powershell ist, wie in vielen anderen Sprachen, das +-Zeichen. Eine Möglichkeit, den Code eines Skripts zu verschleiern, besteht darin, die Zeichenfolgen zu teilen, die ihn enthalten und die eine Signatur im AV haben, sodass das Antivirenprogramm beim Schreiben des Skripts und beim Verketten dieser zur Laufzeit die Ausführung, die dies tun würde, nicht erkennt ohne diese Verkettung erkennen, da die Signatur der geteilten Zeichenfolge darin nicht enthalten ist.


Eine andere Möglichkeit zur Verschleierung besteht darin, das Escape-Zeichen in die Zeichenfolgen einzufügen, das in Powershell das „Zeichen“ ist. Diese Art von Zeichen ist normalerweise in einer Zeichenfolge enthalten.



Neuordnung von Zeichenfolgen mit Formatierung

Powershell umfasst auch die String-Formatierung mit dem Befehl -f. Damit können wir einen String schreiben, den das AV normalerweise als mit einer Signatur versehen erkennen würde, und ihn zur Laufzeit neu anordnen.


.NET-Methodenspiegelung

Im Internet gibt es zahlreiche Skripte, die AMSI umgehen. Einer der bekanntesten ist der von Matt Graeber, der die Reflexionsmethode verwendet.

Die Reflexion von .NET-Methoden (Reflection auf Englisch) besteht aus der Prüfung, dem Aufruf und dem Zugriff auf Daten von .NET-Typen, die sowohl öffentliche als auch private Parameter enthalten. Standardmäßig bietet PowerShell Zugriff auf öffentlich zugängliche Eigenschaften und Methoden, aber mithilfe von Reflection-APIs können Sie auf private Parameter zugreifen.

Die Methode ist die folgende:

[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)

Es ist jedoch bereits so weit verbreitet, dass Sie einige der oben beschriebenen und die folgende Technik anwenden müssen, damit das Antivirenprogramm es nicht erkennt.

Aufteilen von Skripten in verschiedene Zeilen

Es gibt viele einzeilige Skripte, die Methoden wie Reflection zusammen mit String-Verkettung usw. verwenden. Allerdings ist die Verwendung dieser Skripte so weit verbreitet, dass es bereits Signaturen für diese Art von Skripten gibt.

Eine einfache Möglichkeit, AMSI davon abzuhalten, sich zu beschweren, besteht jedoch darin, den Code in verschiedene Zeilen aufzuteilen oder, wenn es sich um einen einzeiligen Code wie den von Matt Graeber handelt, ihn in verschiedene Variablen aufzuteilen. Auch wenn es auf den ersten Blick absurd erscheinen mag, da wir bereits erklärt haben, wie Antiviren-Signaturen in Powershell und AMSI funktionieren, macht es doch Sinn, dass diese Art der Verschleierung des Skripts möglich ist.

Sehen wir es uns an einem Beispiel an.


Im Bild können wir sehen, dass es sich beim ersten um das Originalskript handelt und beim zweiten eine Zeichenfolgenverkettung angewendet wurde, um den AV zu vermeiden. Es ist jedoch so weit verbreitet, dass so etwas nicht gültig ist.

Aber wenn wir dieses Skript in verschiedene Zeilen unterteilen, ändert sich das Thema, wie ich Ihnen im folgenden Bild zeigen werde:


Wie Sie sehen, kann durch die Aufteilung in verschiedene Variablen und die Verwendung der Zeichenfolgenverkettung verhindert werden, dass AMSI dieses Skript erkennt, und die Umgehung wird korrekt durchgeführt.

Es muss klargestellt werden, dass diese Techniken normalerweise gleichzeitig im selben Skript verwendet werden, da alle in diesem Beitrag erläuterten Techniken effektiver sind, wenn sie zusammen durchgeführt werden als einzeln.

Das ist alles für den Moment. In den folgenden AMSI-Artikeln werden wir verschiedene Techniken zur Durchführung dieser Umgehungen sehen (deren Skripte offensichtlich mit einigen der hier genannten Techniken verschleiert werden).

Bis zum nächsten Beitrag!

 Justo Martín, < /span>Sicherheitsanalyst bei Zerolynx.

Zurück zum Blog

Hinterlasse einen Kommentar

Bitte beachten Sie, dass Kommentare vor der Veröffentlichung genehmigt werden müssen.