browsertunnel: exfiltrando datos mediante dns-prefetch

Browsertunnel es una herramienta para exfiltrar datos desde el navegador utilizando el protocolo DNS. Para ello abusa de dns-prefetch, una técnica destinada a reducir la latencia percibida de los sitios web al realizar búsquedas DNS en segundo plano para dominios específicos antes si quiera que se soliciten cargarse. Pueden ser una o varias meta etiquetas que se colocan dentro del head, en ellas se establecen los dominios de los cuales vamos a necesitar cargar recursos en nuestra web. De esta manera precargamos los dominios (DNS) para que se resuelva la IP de la cual se descargarán los recursos requeridos, y así evitamos que esa resolución de la IP se haga justo cuando se requiera la carga del recurso. Además el tráfico DNS no aparece en las herramientas de depuración del navegador, no está bloqueado por la Política de seguridad de contenido (CSP) de una página, y a menudo no es inspeccionado por firewalls o proxies corporativos, por lo que es un medio ideal para sacar datos en escenarios restringidos.

Se trata de una técnica antigua: el túnel DNS en sí se remonta a los años 90, y Patrick Vananti escribió sobre el uso de dns-prefetch en 2016, pero por lo que puedo decir, browsertunnel es el primer cliente/servidor de código abierto que demuestra su uso. Debido a que dns-prefetch no devuelve ningún dato al cliente javascript, la comunicación a través de browsertunnel solo es unidireccional. Además, algunos navegadores deshabilitan dns-prefetch de forma predeterminada, y en esos casos, browsertunnel fallará silenciosamente.


El proyecto tiene dos partes:

- Un servidor, escrito en golang, que funciona como un servidor DNS autorizado que recopila y decodifica los mensajes enviados por browsertunnel.
- Una pequeña librería de JavaScript, que se encuentra en la carpeta html/, codifica y envía mensajes desde el lado del cliente

Cómo funciona

Browsertunnel puede enviar cadenas arbitrarias sobre DNS codificando la cadena en un subdominio, que se reenvía al servidor browsertunnel cuando el navegador intenta resolver el dominio de forma recursiva.

Los mensajes más largos que no caben en un dominio (253 bytes) se dividen automáticamente en múltiples consultas, que el servidor vuelve a ensamblar y decodificar.
Instalación y uso

Primero, hay que configurar los registros DNS para delegar un subdominio a su servidor. Por ejemplo, si la IP del servidor es 192.0.2.123 y queremos hacer un túnel a través del subdominio t1.example.com, la configuración de DNS debería ser:
t1        IN    NS   t1ns.example.com.
t1ns      IN    A    192.0.2.123

Luego en el servidor hay que instalar browsertunnel usando go get o, si se prefiere, podemos compilar browsertunnel en nuestra propia máquina y copiar el binario directamente en el servidor.
go get github.com/veggiedefender/browsertunnel

A continuación, ejecutamos browsertunnel, especificando el subdominio por el que queremos hacer el túnel.
browsertunnel t1.example.com

Para ver todas las opciones podemos usar el parámetro -help o consultar el godoc
$ browsertunnel -help
Usage of browsertunnel:
  -deletionInterval int
        seconds in between checks for expired messages (default 5)
  -expiration int
        seconds an incomplete message is retained before it is deleted (default 60)
  -maxMessageSize int
        maximum encoded size (in bytes) of a message (default 5000)
  -port int
        port to run on (default 53)

Finalmente para probar el túnel podemos usar la página de demo de aquí o clonar este repositorio y cargar html/index.html localmente. Si todo funciona, deberíamos poder ver los mensajes registrados en stdout.

Más info en el repo de la herramienta: https://github.com/veggiedefender/browsertunnel

Comentarios