Zusammenfassung
- SharpRhino basiert auf dem Open-Source-Projekt „ThunderShell“
- Opfer erhalten einen NSIS-Installer, der PowerShell-Skripte ablegt
- Powershell-Skripte enthalten kodierte .NET-Assemblys
- NET-Payload wird zur Kommunikation mit dem C2-Server verwendet
- Kann Befehle remote ausführen
- Der Netzwerkverkehr wird mit RC4 verschlüsselt und im Base64-Format kodiert
Einleitung
Hunters International, eine berüchtigte Hackergruppe, die für ihre Ransomware-as-a-Service-Aktivitäten bekannt ist, setzt eine neue RAT-Malware ein. Der erste Angriff mit dieser Malware wurde Anfang August 2024 entdeckt. Aufgrund der verwendeten Programmiersprache C# wurde sie SharpRhino genannt. Der Trojaner wird den Opfern als legitime Software geliefert und ermöglicht den Remote-Zugriff auf ihre Computer. Mit dieser Software können Cyberkriminelle verschiedene Befehle ausführen und weitere Malware verbreiten.
Technische Details
Überblick
Die untersuchte Variante wird als Installer an die Opfer ausgeliefert, der mit dem Nullsoft Scriptable Install System (NSIS) erstellt wurde. Die Datei hat die Bezeichnung „Angryip.org“ und verfügt über ein gültiges digitales Zertifikat, der Firmenname ist jedoch gefälscht und existiert nicht.

Dieser Installer enthält einen weiteren Installer, ein kennwortgeschütztes Archiv und zusätzliche Dateien, die bei der Ausführung der Malware verwendet werden.

Installation
Wenn der Installer ausgeführt wird, legt er alle eingebetteten Dateien im Ordner „C:\ProgramData\Microsoft\WindowsUpdate24“ ab und führt die Datei „ipscan-3.9.1-setup.exe“ aus, bei der es sich um einen Installer für die legitime Software „Angry IP Scanner“ handelt.

Während die Benutzer:innen durch diesen Installer abgelenkt werden, extrahiert die Malware Dateien aus dem kennwortgeschützten Archiv „UpdateFull.zip“. Zum Entpacken des Archivs wird das eingebettete Programm „7za.exe“ verwendet. In der Befehlszeile sehen wir das Kennwort für das Archiv:
C:\ProgramData\Microsoft\WindowsUpdate24\7za.exe x C:\ProgramData\Microsoft\WindowsUpdate24\UpdateFull.7z -pTG98HJerxsdqWE45 -oC:\ProgramData\Microsoft\WindowsUpdate24
Das Archiv enthält den folgenden Inhalt:

Die Variante erstellt nach dem Entpacken einen neuen Ordner (C:\ProgramData\Microsoft\LogUpdateWindows) und kopiert die aus dem Archiv extrahierten Dateien in diesen Ordner. Die Nutzung von zwei verschiedenen Installationsordnern kann Cyberkriminellen helfen, dauerhaft auf dem System zu bleiben, selbst wenn einer der Ordner gelöscht wird, da die Dateien in diesen Ordnern während des Ausführungsprozesses ähnlich sind. Anschließend wird dem Pfad „HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run“ ein neuer Registry-Schlüssel hinzugefügt, der auf die Datei „Microsoft.AnyKey.lnk“ verweist. Diese Datei ist eine Verknüpfung und enthält das nächste Ziel:
C:\ProgramData\Microsoft\LogUpdateWindows\Microsoft.AnyKey.exe abnormal c:\programdata\%username%0 cmd /c C:\ProgramData\Microsoft\LogUpdateWindows\LogUpdate.bat
Bei der ausführbaren Datei „Microsoft.AnyKey.exe“, die ebenfalls aus dem Archiv stammt, handelt es sich um ein legitimes Programm, das Teil der Node.js-Tools für Visual Studio ist und den Namen „Microsoft.NodejsTools.PressAnyKey.exe“ trägt.
Ausführung
Die Dateien „LogUpdate.bat“ und „WindowsUpdate.bat“ haben die gleiche Funktion, laden aber unterschiedliche Dateien.

Die Dateien „Wiaphoh7um.t“ und „kautix2aeX.t“ enthalten beide verschleierte Daten. Die Rohdaten und der Schlüssel sind für diese Dateien unterschiedlich, aber die Ergebnisdaten sind die gleichen. Nach der Entschlüsselung definiert die Variante diese Daten als .NET-Assembly und führt eine Methode mit einigen Parametern aus.

Nachdem alle Daten aus dem Skript gespeichert wurden, können wir die nächsten Variablen beobachten:
Die Variablen $var1, $var2, $var3 bestimmen die referenzierten Assemblys und bilden durch Verkettung folgenden String:
System.Drawing.dllSystem.Web.Extensions.dllSystem.Windows.Forms.dll
$var4 ist für jede Datei unterschiedlich und enthält eine C2-Serveradresse. Es folgt eine Tabelle mit den Argumenten, die beim Aufruf der .NET-Assembly für jede Datei verwendet werden:

„$fjwZrHB1k2RF“ ist eine .NET-Assembly, die in den Speicher geladen wird. Nach der Erstellung eines Absturzabbildes kann der C#-Code betrachtet werden. Das PowerShell-Skript ruft eine Funktion aus dem Namensraum „Bzxmlpi“ und der Klasse „OyrWkb“ auf. Am Anfang dieser Klasse fällt auf, dass einige zusätzliche Importe geladen werden und die Variablennamen nicht lesbar sind.

Tatsächlich handelt es sich bei dieser Datei um eine modifizierte Version des Open-Source-Projekts „ThunderShell“. Am Quellprojekt wurden einige Änderungen vorgenommen:
- Die Funktionen Keylogger, Screenshot und Laden von .NET-Assemblys sowie die Serverbefehle, die diese Funktionen repräsentieren, wurden entfernt.
- Alle Klassen, Funktionen und Variablennamen wurden umbenannt.
- Es wurden Standardwerte hinzugefügt, die verwendet werden, wenn der Payload ohne Argumente ausgeführt werden.

Diese Funktion erzeugt zunächst einen zufälligen 16-Byte-String. Bei der Initialisierung der Klasse „Random“ verwendet die Variante das aktuelle Datum, die aktuelle Uhrzeit und die Prozess-ID als Seed. Anschließend werden einige Umgebungsvariablen wie COMPUTERNAME, USERDOMAIN und USERNAME abgefragt. Alle diese Daten werden formatiert:

Als Ergebnis wird der folgende String erzeugt:

Als nächstes übergibt die Variante diesen String an eine Funktion, die ihn an den Server sendet. Diese Funktion verschlüsselt die Daten mit einem RC4-Schlüssel, der als zweites Argument übergeben wird.

Nach der Verschlüsselung werden einige Daten an die Anfrage angehängt und der verschlüsselte String im Base64-Format kodiert. Alle diese Daten werden dann an den Server gesendet.

Bei dieser ersten Verbindung wird die Antwort des Servers ignoriert. Wenn die Variante in eine Schleife gerät, verbindet sie sich erneut mit dem Server, aber beide Argumente sind „null“. Anschließend wird die Antwort gespeichert und mit den gespeicherten Werten verglichen. Wenn der Befehl „delay“ empfangen wird, nimmt die Variante ein zusätzliches Argument an und ändert den Wert, der an die Funktion „sleep“ übergeben wird. Wird der Befehl „exit“ empfangen, wird die Schleife unterbrochen und die Ausführung beendet. Wenn die Malware andere Daten als „delay“ oder „exit“ empfängt, erstellt sie einen neuen Thread mit einer Funktion, die die empfangenen Daten als Argument erhält. Alle diese Aktionen werden mit einer Verzögerung von 95 Sekunden zwischen jedem Schleifendurchlauf wiederholt.

Die vom Server erhaltene Antwort wird an die Deserialisierungsfunktion in der Klasse „zWxFlnVASjHYb“ übergeben, die die folgenden Daten sammelt und speichert: „UUID“, „ID“ und „Data“.

C2-Server
Um zu sehen, wie die Kommunikation funktioniert, können wir den Server aus dem Quellprojekt verwenden, da der Link in der Variante bereits offline war. Zuerst müssen wir die Konfiguration des Servers ändern. Die Konfiguration enthält eine Reihe von Feldern, darunter die IP-Adresse des Servers, den Verschlüsselungsschlüssel, die GUI-Einstellungen und die HTTP- und HTTPS-Einstellungen. Dann müssen wir die Parameter „callback-url“, „gui-host“ und „encryption-key“ ändern. Die Parameter für den Codierungsschlüssel entnehmen wir einer Variante von SharpRhino.

Der Server ist eine Python-Applikation und benötigt einen laufenden Redis-Server. Nach dem Start werden einige Informationen über den Server ausgegeben.

Dazu gehört eine Web-GUI-Adresse. Nach dem Öffnen müssen sich die Benutzer:innen zunächst anmelden. Der eingegebene Benutzername spielt dabei keine Rolle. Es muss jedoch das Kennwort aus der Konfigurationsdatei verwendet werden. Nach der Anmeldung wird das Dashboard angezeigt. Es enthält Informationen über Sitzungen und Protokolle.

Die Schaddaten können in der Web-GUI erstellt werden. Die IP-Adresse des Servers und der Payload-Typ müssen angegeben werden.

Nach der Auswahl einer Sitzung können Angreifer:innen mit ihr interagieren. Durch Eingabe von „help“ werden alle unterstützten Befehle angezeigt, die in der Sitzung genutzt werden können.

C2-Kommunikation
Diese Befehle haben vordefinierte Strings, die an die Daten angehängt werden, die die Angreifer:innen als Argumente eingeben. Bei der Verwendung von „shell [command]“ wird z. B. „cmd.exe /c“ an den Anfang des zu sendenden Strings angehängt. Ein weiteres Beispiel ist der Befehl „ps“, der das PowerShell-Skript an den Client sendet:

Der Befehl wird RC4-verschlüsselt mit Base64-Kodierung an den Client gesendet. Er enthält die Parameter ID und UUID, wobei ID die Client-ID und UUID die Befehls-ID ist.

Alle diese Daten werden an den neuen Thread übergeben. Die Funktion in diesem Thread verwendet PowerShell-Module, um die übergebenen Befehle auszuführen.

Über die Pipeline erhält die Variante die Ausgabe des ausgeführten Befehls. Diese Daten werden dann verschlüsselt und zurück an den Server gesendet.

Fazit
ThunderShell, ein älteres Open-Source-Projekt, das zuletzt vor fast vier Jahren aktualisiert wurde, wurde von Hunters International verwendet, um Malware an Opfer zu verteilen. Die Malware kommt in Form eines Installers für das Dienstprogramm „Angry IP Scanner“, der bösartige PowerShell-Skripte ablegt und ausführt. Diese Skripte verwenden PowerShell-Funktionen, um kodierte .NET-Assemblys auszuführen, sodass keine zusätzliche kompilierte ausführbare Datei erforderlich ist – der schädliche Code wird im Speicher aufgerufen und ausgeführt.
Der Originalcode wurde zwar modifiziert, seine Hauptfunktion – die Remote-Ausführung von Befehlen auf Zielsystemen – blieb jedoch erhalten. Hier liegt die Gefahr solcher Open-Source-Projekte. Sie werden meist zu Lern- oder Pentesting-Zwecken entwickelt, aber für reale Angriffe eingesetzt.
Von Acronis erkannt

