
Exfiltrar sorrateiramente dados do navegador via DNS
O Browsertunnel é uma ferramenta para exfiltrar dados do navegador usando o protocolo DNS. Ele faz isso abusando do dns-prefetch, um recurso que visa reduzir a latência percebida de sites ao realizar consultas DNS em segundo plano para domínios especificados. O tráfego DNS não aparece nas ferramentas de depuração do navegador, não é bloqueado pela Política de Segurança de Conteúdo (CSP) de uma página e muitas vezes não é inspecionado por firewalls ou proxies corporativos, tornando-o um meio ideal para contrabandear dados em cenários restritos.
É uma técnica antiga — o tunelamento DNS em si remonta aos anos 90, e Patrick Vananti escreveu sobre o uso do dns-prefetch para isso em 2016, mas pelo que sei, o browsertunnel é o primeiro cliente/servidor open source e pronto para produção que demonstra seu uso. Como o dns-prefetch não retorna nenhum dado para o JavaScript do cliente, a comunicação pelo browsertunnel é apenas unidirecional. Além disso, alguns navegadores desabilitam o dns-prefetch por padrão e, nesses casos, o browsertunnel falhará silenciosamente.
O projeto é composto por duas partes:
html/, que codifica e envia mensagens do lado do cliente.O Browsertunnel pode enviar strings arbitrárias via DNS codificando a string em um subdomínio, que é encaminhado ao servidor browsertunnel quando o navegador tenta resolver recursivamente o domínio.
Mensagens mais longas que não cabem em um único domínio (253 bytes) são automaticamente divididas em várias consultas, que são remontadas e decodificadas pelo servidor.
Primeiro, configure registros DNS para delegar um subdomínio ao seu servidor. Por exemplo, se o IP do seu servidor for 192.0.2.123 e você quiser fazer um túnel através do subdomínio t1.example.com, sua configuração DNS ficará assim:
t1 IN NS t1ns.example.com.
t1ns IN A 192.0.2.123
No seu servidor, instale o browsertunnel usando go get. Alternativamente, compile o browsertunnel em sua própria máquina e copie o binário para o servidor.
go get github.com/veggiedefender/browsertunnel
Em seguida, execute browsertunnel, especificando o subdomínio pelo qual deseja fazer o túnel.
browsertunnel t1.example.com
Para uso completo, execute browsertunnel -help:
$ 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)
Para descrições mais detalhadas e justificativas desses parâmetros, consulte também o godoc.
Por fim, teste seu túnel! Você pode usar minha página de demonstração aqui ou clonar este repositório e carregar html/index.html localmente. Se tudo funcionar, você deverá ver as mensagens registradas na saída padrão.
Para aplicações reais deste projeto, você pode querer bifurcar (fork) e ajustar o código conforme necessário. Algumas inspirações: