
Windows-Keylogging-Modul für das Sliver-C2-Implant-Framework, das Raw Input verwendet, um Tastatureingaben zu erfassen und den Betreibern Start-, Stopp- und Abrufbefehle bereitzustellen.
Diese Erweiterung für Sliver wurde hauptsächlich als Lernübung
geschrieben, um zu verstehen, wie Sliver mit Erweiterungen umgeht.
Ich möchte dem gesamten Sliver-Team für seine Arbeit an diesem öffentlichen Implant-Framework danken. Mein besonderer Dank gilt @rkervell für die Beantwortung vieler meiner Fragen zur Handhabung von Erweiterungen durch Sliver.
Im Grunde verwendet es Raw Input. Das hat Vor- und Nachteile gegenüber anderen gängigen Keylogging-Methoden.
Ich mag es, weil es kein Injizieren in andere Binärdateien erfordert und auch kein häufiges Abfragen (Polling) eines bestimmten Aufrufs, bei dem möglicherweise Ergebnisse verloren gehen.
Dieser Code ist teils meine eigene Arbeit und teils ein Mix aus Beispielen, die im Internet zu finden sind.
Öffne die Solution-Datei mit Visual Studio 2019 und erstelle die x86- und x64-Releases.
Bis dies möglicherweise in die armory aufgenommen wird, kann es auf einem Windows-System gebaut werden. Anschließend kann der resultierende Ordner $(solutiondir)\bin auf dem Sliver-Client abgelegt werden, und extensions install <path to folder> kann ausgeführt werden, um die Erweiterung zu installieren. Möglicherweise musst du neu starten oder zusätzlich extensions load <path to folder> ausführen.
raw_keylogger <cmdid>
Die folgenden cmdid-Werte sind gültig:
0 = stop
1 = start
2 = get keystrokes
Wenn alles gut geht, sieht das so aus:

Die Sliver-API hat die folgenden zwei Hauptteile:
typedef int (*goCallback)(const char*, int);
extern "C" {
__declspec(dllexport) int __cdecl entrypoint(char* argsBuffer, uint32_t bufferSize, goCallback callback);
}
Das Implant ruft den entrypoint auf, wie er in der .json-Datei definiert ist. Er verweist auf deine Entrypoint-Funktion (sie muss nicht so heißen, nur der Signatur folgen).
goCallback ist eine Funktion zur Rückgabe von Ausgaben an Go. Sie wird aufgerufen wie callback(string, string_length).
Beim Programmieren der Erweiterung müssen derzeit "name" und "command_name" übereinstimmen, andernfalls lädt das Implant deine Erweiterung bei jedem Aufruf neu.
Zum Zeitpunkt dieses Schreibens unterstützen Nicht-BOF-Erweiterungen keine stark typisierten Argumente. Daher wird alles, was nach dem Befehlsnamen in der CLI angegeben wird, als String gesendet. Du musst es dann auf der nativen Codeseite der Erweiterung behandeln.