Nimpostor: Entwicklung eines Nim Agent für Mythic C2

research

In der zweiten Hälfte des Jahres 2022 kam Lukas Donaubauer, Sicherheitsexperte bei SEC Consult, in Kontakt mit der Programmiersprache Nim und ihrer Präsenz in der Infosec-Community, insbesondere im Bereich der Malware-Entwicklung.

[Translate to German:] Programming language

Eine der allerersten Quellen, die er nutzte, um mehr über Nim in einem offensiven Kontext zu erfahren, war das wirklich großartige OffensiveNim Repository von Marcello Salvati (byt3bl33d3r). Zu dieser Zeit bildete der Malware Development Essentials Course von Sektor7 die Grundlage, um tiefer in das Schreiben eigener Exploits einzusteigen, was für unser internes Red Team von großem Nutzen sein würde. So entstand dieser Blog-Beitrag, der die Ergebnisse des Schreibens eines benutzerdefinierten C2-Agenten für das Open-Source-Framework Mythic C2 vorstellt.

Warum Mythic?

Zu dieser Zeit haben viele Leute vollwertige Frameworks veröffentlicht (Havoc, Sliver, usw.). Aber einen eigenen C2-Server für den Agenten zu schreiben, würde bedeuten, dass viel Entwicklungszeit für die Erstellung der Serverarchitektur aufgewendet werden müsste, anstatt nur den Agenten zu entwickeln.

Mythic ist im Vergleich zu anderen Frameworks in dem Sinne einzigartig, dass es Design und Funktionalität in drei verschiedene Teile aufteilt. Diese Teile sind der Server, die C2-Profile und die C2-Agenten. Dadurch können die Profile und Agenten separat vom Server entwickelt und dann in die Plattform integriert werden. Dieses Design eines C2-Frameworks ist der Punkt, an dem sich Mythic im Vergleich zu anderen Plattformen auszeichnet. Die Entwickler haben die Freiheit, ihre eigenen Agenten mit einzigartigen Fähigkeiten für einen zentralen Server zu entwickeln. Dies erlaubte uns, uns nur auf die Agenten-Aspekte zu konzentrieren, ohne dass wir ein eigenes Framework erstellen mussten. Die Sammlung im MythicAgents github enthält eine ganze Reihe von benutzerdefinierten Agenten, von voll ausgestatteten .NET Agenten bis hin zu Mac OS Agenten. Mythic's Modularität ermöglicht es, dass diese vollständig benutzerdefinierten Payloads und Profile entwickelt werden können, um nahtlos mit dem Mythic Server zu arbeiten. Bei der Durchsicht der vorhandenen Agenten stellten wir fest, dass ein 3 Jahre alter Nim-Agent bereits existierte, aber veraltet war. Dieser Nim-Agent wurde nun als Grundlage für die Entwicklung dieses benutzerdefinierten Agenten verwendet.

Die Verwendung von Mythic für die Agentenentwicklung ist ideal, wenn Sie benutzerdefinierte Funktionen einbinden möchten, ohne Ihren eigenen Server von Grund auf neu zu erstellen. Die Erstellung des Servers von Grund auf ermöglicht jedoch eine größere Flexibilität bei der Gestaltung des Frameworks selbst.

Verzeichnisstruktur für den Agenten
Abbildung 1: Verzeichnisstruktur für den Agenten

Mythic Payload Entwicklung

Die Entwicklung von Mythic-Payloads ist in der Mythic-Dokumentation sehr gut dokumentiert. Die erste Stufe erfordert die Erstellung einer Verzeichnisstruktur für den Agenten.

Für die Datei- und Verzeichnisnamen gibt es einige strenge Regeln.

Zum Beispiel: Der Name des Verzeichnisses unter Payload_Type/* muss der Name des Payloads sein. Das gleiche gilt für documentation-payload/* für die Dokumentation und agent_icons/*.svg für das Symbol des Agenten. Im in Abbildung 1 angeführten Beispiel wird angenommen, dass der Name des Agenten mypayloadlautet.

Einige der Dateien wie die mythic_service.py und rabbitmq_config.json müssen entsprechend der Mythic-Dokumentation oder anderer Payload Typen vorausgefüllt werden.

Es ist sehr nützlich, einen Blick auf die bereits vorhandenen Agenten zu werfen, um ein Gefühl dafür zu bekommen, welche Konfigurationsoptionen benötigt werden.

Mythic funktioniert mit Hilfe von Docker-Containern. Die Datei Payload_Type/mypayload/Dockerfile wird verwendet, um den Docker-Container zu definieren, den der Payload Builder verwenden wird. Es sind bereits Docker-Basis-Images verfügbar, die Abhängigkeiten für die Erstellung verschiedener Arten von Payloads enthalten, aber es kann auch ein benutzerdefinierter Container definiert werden, was in diesem Fall erforderlich war, um alle Abhängigkeiten für Nim zu installieren. Dieser Docker-Container wird für die Erstellung des Payloads verwendet; andere Funktionen wie die C2-Kommunikation werden in Profil-Containern behandelt.

Die Datei Payload_Type/mypayload/mythic/agent_functions/builder.pyenthält Metadaten über den Payload zusammen mit der Implementierung für die Erstellung jedes Payloads. Die Mythic-Dokumentation für diese Datei enthält eine sehr ausführliche Anleitung, was in dieser Datei enthalten sein muss, um Ihren Agenten in Mythic zu definieren und wie man Build-Parameter in die Payload kompiliert.

Man kann sich die Entwicklung von Payload Typen so vorstellen, dass sie "Payload"-Code und "Mythic" Code enthalten. Der Payloadcode ist der Code für den Agenten selbst und befindet sich im Verzeichnis Payload_Type/mypayload/agent_code/. Hier findet die eigentliche Entwicklung des Agenten und seiner Funktionen statt. Der andere Teil des Agenten ist der Mythic Code, der sich im Verzeichnis Payload_Type/mypayload/mythic/agent_functions/befindet. Hier werden verschiedene Befehle für den Agenten definiert. Die Befehle und ihre Parameter werden zusammen mit allen anderen Vorabaufgaben definiert, bevor sie an den Agenten gesendet werden.

HTTP ist ein sehr verbreiteter C2-Kommunikationstransport und einer der am einfachsten zu implementierenden. Mythic enthält bereits ein HTTP-C2-Profil, das mit einem Agenten für C2-Kommunikation verwendet werden kann. Es handelt sich um ein relativ einfaches Profil, das HTTP GET/POST-Anfragen und base64-kodierte JSON-Daten verwendet. Das anfängliche Einchecken eines Agenten besteht aus einer HTTP-Anfrage mit mehreren Datenfeldern, die der Mythic-Server verwendet, um den Agenten bzw. das System, auf dem der Agent läuft, zu identifizieren.

Jeder Agent hat eine eindeutige PayloadUUID, die zur Kompilierungszeit generiert wird. Eine HTTP POST-Anfrage mit dieser im Body der Anfrage registriert einen ersten Check-In mit Mythic auf der Callbacks-Seite. Die Verschlüsselung kann in die Nutzdaten der Anfrage aufgenommen werden, indem das in der Dokumentation angegebene Format eingehalten wird.

Von hier aus sendet ein Agent in regelmäßigen Abständen Anfragen an den Mythic-Server, um Aufgaben über das “tasking“ zu erhalten und die Ergebnisse der abgeschlossenen Aufgaben zurückzusenden.

Das ist alles, was für die Erstellung eines einfachen Mythic-Payloads benötigt wird. Die Erstellung fortgeschrittener Befehle kann in der Mythic-Dokumentation nachgelesen werden. Das Beispiel geht nicht in die Tiefe über all die anderen Funktionen, die in Mythic enthalten sind. Eine gute Quelle für Möglichkeiten sind die bereits existierenden Agenten. Mythic unterstützt auch eine Struktur für Peer-to-Peer-Kommunikation zwischen Agenten. Ein Agent kann direkt mit anderen Agenten kommunizieren, um Aufgaben weiterzugeben. Die Agenten Apollo und Poseidon unterstützen die P2P-Funktionalität über SMB und/oder TCP.

Warum Nim?

Einer der größten Vorteile von Nim ist, dass es eine kompilierte, statisch typisierte Sprache mit einer Syntax ist, die sich wie eine Skriptsprache anfühlt. Ein Großteil der Syntax entspricht genau der von Python oder ist ihr sehr ähnlich. Dies war ein großer Vorteil, da viele kleine Werkzeuge, die für den internen Gebrauch entwickelt wurden, auf Python basieren.

Da es sich bei Nim außerdem um eine vorzeitig kompilierte Sprache handelt, ist sie für die Entwicklung von C2-Implantaten oder anderen Tools zur Post-Exploitation wahrscheinlich eine sinnvollere Wahl als Python. Es ist zwar möglich, Python-Code mit Tools wie PyInstaller oder Py2Exe zu einer ausführbaren Datei zu kompilieren, aber diese Tools scheinen Probleme mit Antivirenprogrammen zu haben, und ihre Verwendung bedeutet einen weiteren Schritt im Entwicklungsprozess.

Hier ist ein kurzer Überblick über einige andere Funktionen, die Nim vielversprechend machen:

  • Cross-Kompilierungsunterstützung mit mingw-64. Sprachen wie Go, die in einem anderen persönlichen Forschungsprojekt analysiert wurden, zeigen, wie hilfreich eine nahtlose Cross-Kompilierung für die Entwicklung offensiver Tools ist. Die Möglichkeit, Agenten sowohl für Windows- als auch für Linux-Clients zu kompilieren, bringt mehr Flexibilität.
  • Die von Nim erzeugten Binaries sind im Vergleich zu den von Go erzeugten Binaries recht klein, was für den initialen Einsatz des Agenten entscheidend ist.
  • Nim bietet Unterstützung für den Aufruf von Backend-Code wie der Windows-API unter Verwendung seines “Foreign Function Interface”. Dies scheint eine besonders vielversprechende Funktion für alle zu sein, die an der Entwicklung von Post-Exploitation-Tools für Windows in Nim interessiert sind.
  • Die Dokumentation ist sehr detailliert und es gibt eine Menge Tutorials für den Einstieg.

Nimpostor Funktionen

Um ein Gefühl dafür zu bekommen, welche Funktionen essentiell sind, wurden andere Agenten aus dem MythicAgents github analysiert. Vor allem die Agenten Apollo, Medusa und Poseidon sind sehr fortschrittlich und haben eine große Übersicht an Funktionen. Darüber hinaus gaben die Codeschnipsel aus dem OffensiveNim-Repository weitere

Derzeit ist der Proof-of-Concept Payload sehr einfach und hat keine erweiterten Funktionen implementiert. Er konzentriert sich auf einfache Dateisystemaufgaben wie cd, ls, download, upload und die erweiterte Funktion execute_assembly, die die Ausführung von .NET-Dateien direkt im Speicher ermöglicht.

Fazit

Das Hauptziel dieser Untersuchung war es, die Sprache Nim kennenzulernen und herauszufinden, ob sie für die interne Toolentwicklung geeignet ist. Dies kann zu 100 % bestätigt werden und die in "Warum Nim?" genannten Themen machen es zum neuen Favoriten für die interne Werkzeugentwicklung für Red-Teaming-Projekte.

Obwohl sich der Agent derzeit sozusagen im Betastadium befindet, wird er auf jeden Fall weiterentwickelt, so dass er in zukünftigen Red Team Projekten eingesetzt werden kann.

Die nächsten Schritte sind ein bof_loader, um Beacon Object Files direkt im Speicher ausführen zu können, ein Socks Proxy und die p2p Funktionalität für die Kommunikation zwischen Agenten über SMB oder TCP.

Wer einen Blick auf den Code werfen und den Agenten selbst testen möchte, kann dies auf der SEC Consult Github-Seite tun.

 

 

Dieser Blogpost wurde von Lukas Donaubauer geschrieben und im Auftrag des SEC Consult Vulnerability Lab veröffentlicht.

Interessieren Sie sich für eine Karriere bei SEC Consult?

SEC Consult ist immer auf der Suche nach talentierten Sicherheitsexpert:innen, die unser Team verstärken möchten.