
PacketWhisper: Exfiltre dados furtivamente e evite a atribuição usando consultas DNS e esteganografia baseada em texto. Evite os problemas associados aos métodos típicos de exfiltração DNS. Transfira dados entre sistemas sem que os dispositivos comunicantes se conectem diretamente entre si ou a um endpoint comum. Não é necessário controlar um Servidor de Nomes DNS.
PacketWhisper - Transfira dados de forma furtiva e evite atribuição usando consultas DNS e esteganografia baseada em texto, sem a necessidade de servidores de nomes ou domínios controlados pelo atacante; Burle dispositivos DLP/MLS; Supere controles de lista de permissão de dados e servidores DNS. Converta qualquer tipo de arquivo (ex.: executáveis, Office, Zip, imagens) em uma lista de nomes de domínio totalmente qualificados (FQDNs) e use consultas DNS para transferir dados. Simples, mas extremamente eficaz.
(Atualização 27/05/2020: Sim, vou migrar todos os meus projetos do Github para Python3 durante o verão de 2020.)
Joe Gervais (TryCatchHCF)
A exfiltração tradicional de DNS depende de uma das seguintes: tunelamento DNS; ocultação de dados em campos de consulta DNS; ou cargas úteis codificadas/criptografadas que são divididas e usadas como subdomínios na consulta DNS. Todos esses métodos exigem que o atacante controle um domínio e/ou um servidor de nomes DNS associado para receber os dados, o que leva à atribuição. Essas abordagens também são vulneráveis a listas de bloqueio de servidores DNS (comum) e listas de permissão (cada vez mais comuns). Outro problema é que analistas de DFIR conhecem esses métodos e sistemas SIEM frequentemente detectam e alertam ao vê-los.
O PacketWhisper supera essas limitações.
E se os dados pudessem ser transferidos usando os próprios servidores DNS com permissão do alvo, sem que os sistemas comunicantes se conectem diretamente entre si ou a um ponto final comum? Mesmo se a fronteira de rede empregasse lista de permissão de dados para bloquear a exfiltração?
Para que isso aconteça, o PacketWhisper combina consultas DNS com esteganografia baseada em texto. Utilizando o Conjunto de Ferramentas Cloakify, ele transforma a carga útil em uma lista de strings FQDN. Em seguida, o PacketWhisper usa essa lista de FQDNs para criar consultas DNS sequenciais, transferindo a carga útil através (ou dentro) das fronteiras de rede, com os dados ocultos à vista, e sem que os dois sistemas se conectem diretamente um ao outro ou a um ponto final comum. As cifras usadas pelo PacketWhisper fornecem múltiplos níveis de engano para evitar a geração de alertas, bem como para iludir tentativas de análise.
Para receber os dados, você captura o tráfego de rede contendo as consultas DNS, usando o método que for mais conveniente para você. (Veja "Capturando o Arquivo PCAP" abaixo para exemplos de pontos de captura.) Em seguida, carregue o arquivo PCAP capturado no PacketWhisper (executando em qualquer sistema conveniente), que extrai a carga útil do arquivo e a "descloakifica" para sua forma original.
DNS é um protocolo atraente de se usar porque, embora seja um meio relativamente lento de transferir dados, o DNS é quase sempre permitido através das fronteiras de rede, mesmo nas redes mais sensíveis.
Nota importante: Estamos usando consultas DNS para transferir os dados, não consultas DNS bem-sucedidas. O PacketWhisper nunca precisa resolver com sucesso nenhuma de suas consultas DNS. Na verdade, o PacketWhisper nem mesmo olha as respostas DNS. Isso expande nossos casos de uso e ressalta o fato de que nunca precisamos controlar um domínio pelo qual estamos consultando, nem nunca precisamos controlar um servidor de nomes DNS que lida com as solicitações.
Então, usando o PacketWhisper, transformamos uma carga útil que se parece com isto:
Em uma lista de FQDNs como esta:
Que o PacketWhisper transforma em consultas DNS que aparecem no tráfego de rede assim:
Que você captura como um arquivo PCAP em qualquer lugar ao longo do caminho de resolução DNS, e então carrega esse PCAP em sua cópia local do PacketWhisper para recuperar a carga útil:
Veja os slides do DEF CON 26 (incluídos no projeto) da minha apresentação no Packet Hacking Village. Os slides fornecem contexto sobre exfiltração DNS, esteganografia baseada em texto / Conjunto de Ferramentas Cloakify e como o PacketWhisper combina tudo isso em um método para transferir dados. Criei especificamente os slides para serem úteis por conta própria, então o contexto e as informações devem estar completos. No entanto, você também pode assistir ao vídeo da minha apresentação no DC26 Packet Hacking Village que fornece contexto adicional.
Incluí um arquivo PCAP de exemplo no projeto (inteligentemente chamado de "sample.pcap") que contém cargas úteis separadas para cada uma das cifras. Elas poderiam ser de qualquer tipo de arquivo, claro, mas neste caso apenas transmiti arquivos de texto para o PCAP. Carregue-o no PacketWhisper e experimente!
Como teste rápido em seu próprio ambiente, execute o PacketWhisper de uma VM, depois envie um arquivo enquanto faz uma captura de pacotes na interface de rede da VM através do sistema host. Você pode então carregar o arquivo PCAP em qualquer instância do PacketWhisper que seja conveniente para decodificar o arquivo. Lembre-se de que não é uma transferência rápida. Arquivos menores e paciência são seus amigos.
Pergunta: "Por que você não usou Scapy ou o conjunto de ferramentas dnspython?"
Resposta: Odeio dependências de projeto em minhas ferramentas operacionais. Mantenho meus projetos tão atômicos e autocontidos quanto possível para máxima confiabilidade, especialmente no lado do cliente, onde posso não controlar o ambiente e/ou ter privilégios mínimos. Da forma como o PacketWhisper é estruturado, posso fazê-lo funcionar em um host com shell limitado apenas compactando o projeto e extraindo no host alvo.
Pergunta: "Por que o PacketWhisper não é um fork do projeto Cloakify Toolset?"
Resposta: Mesma resposta acima. Precisamos apenas de um subconjunto muito específico das capacidades do Cloakify, e adicionar todo o resto ao PacketWhisper só levaria a um diretório desordenado e ferramentas/cifras que não podem ser usadas pelo PacketWhisper. Como sou dono de ambos os projetos, prometo sincronizar quaisquer alterações entre eles.
$ python packetWhisper.py
Cifras baseadas em FQDN consistem em 3 categorias:
FQDNs com Subdomínio Aleatório Único
MODO DE CIFRA RECOMENDADO PARA A MAIORIA DOS CASOS DE USO
Estes são FQDNs com elementos aleatórios embutidos nos subdomínios. Isso ajuda a prevenir o cache DNS, ao mesmo tempo que nos permite transferir dados além de dispositivos de rede com NAT que podem estar ao longo do caminho da consulta DNS. Como o endereço IP do sistema emissor não está disponível além do dispositivo NAT, os subdomínios gerados pela cifra contêm elementos de tag únicos para nos ajudar a identificar cargas úteis do PacketWhisper na captura de pacotes.
Essas cifras imitam os formatos de vários serviços que dependem de subdomínios complexos como meio de identificar uma sessão, usuário, conteúdo em cache etc. Essa abordagem ajuda as consultas DNS do PacketWhisper a se misturarem com o restante do tráfego da rede.
A primeira parte do nome do subdomínio é na verdade uma string da lista de cifras. O restante do nome do subdomínio é aleatorizado para tornar cada FQDN único, o que impede que o cache DNS interrompa prematuramente o caminho da consulta DNS. Em seguida, adicionamos o nome de domínio. Construímos os FQDNs dessa forma para que se pareçam com os FQDNs usuais associados ao domínio selecionado, para se misturarem melhor com o tráfego normal da web visto em qualquer rede.
FQDNs Repetidos Únicos
Criados para se destacarem de todas as outras consultas DNS na rede, mas sem qualquer aleatorização envolvida. Isso significa que o cache DNS pode interferir, mas como benefício colateral suas consultas DNS serão fáceis de encontrar mesmo na maior coleção de pcaps multi-cliente. Isso se deve ao fato de que os FQDNs são endpoints estranhos, como a lista de "Johns" (alienígenas Red Lectroid) na fictícia Yoyodyne Propulsion Systems do filme 'Buckaroo Banzai Across the 8th Dimension'.
FQDNs de Websites Comuns
Estes são FQDNs construídos a partir de URLs de websites comuns.
NOTA: Como a maioria dos ambientes são NATados no perímetro (removendo a visibilidade do endereço IP do cliente), este modo geralmente é útil apenas para transferir dados entre sistemas conectados à mesma rede local /24 (por exemplo, o wifi do convidado em sua cafeteria favorita).
Como as cifras de Websites Comuns têm apenas o endereço IP de origem como forma de distinguir suas consultas de todas as outras consultas DNS semelhantes na rede, o PacketWhisper transmitirá uma consulta DNS única de "sequência de batida" no início e no final da carga útil, o que nos ajuda a identificar o host transmissor no arquivo pcap posteriormente.
Exemplo de FQDN: www.github.com
Depois de selecionar uma cifra, o PacketWhisper codifica (Cloakifica) a carga útil em uma lista de strings FQDN de acordo com a cifra desejada. Em seguida, ele gera sequencialmente solicitações DNS para enviar os dados ao longo do caminho de resolução DNS. O PacketWhisper adiciona um pequeno atraso entre cada consulta DNS, o que ajuda a evitar solicitações DNS fora de ordem.
O elemento chave aqui é, claro, ser capaz de capturar o tráfego de rede contendo as consultas DNS que o PacketWhisper gerou. Existem muitas opções, já que você só precisa estar em algum lugar, em qualquer lugar, com visibilidade do caminho da consulta DNS.
Exemplos de Pontos de Captura:
Use sua imaginação. Qualquer dispositivo ao longo do caminho de resolução DNS é uma opção, incluindo displays de parede. "Espera, o quê?"
NOTA: Conexões VPN bloqueiam a visibilidade entre o host e o nó de saída da VPN. Se o cliente do qual você está transferindo tiver uma conexão VPN ativa, você não conseguirá ver nenhuma consulta DNS, a menos que possa capturar a montante do nó de saída da VPN. Mesmo capturar no mesmo sistema falhará. Como muitos de vocês provavelmente estão usando VPNs, se quiserem testar o PacketWhisper, tentem transmitir de uma máquina virtual hospedada (VM) e capturem o tráfego na interface de rede da VM no sistema host.
Depois de capturar o arquivo pcap, recupere a carga útil executando o PacketWhisper em um sistema que tenha tcpdump (incluído no Linux e MacOS) ou WinDump (Windows) instalado. O PacketWhisper perguntará qual cifra foi usada, então extrairá a carga útil do pcap e, finalmente, decodificará a carga útil extraída com a cifra correspondente.
Nota importante: Dentro do mesmo PCAP, você pode transmitir uma carga útil por cifra usada. Um PCAP contendo mais de uma carga útil usando a mesma cifra causará problemas. Por exemplo, meu arquivo 'example.pcap' fornecido contém 5 cargas úteis, uma para cada uma das cifras operacionais atualmente disponíveis. Se uma das cargas úteis tivesse usado a mesma cifra que outra, o PacketWhisper falharia ao extrair ambas. A solução fácil é dividir o arquivo PCAP (é por isso que o código de transmissão do PacketWhisper imprime a data-hora UTC ao iniciar e terminar a transmissão). Estou trabalhando para permitir múltiplas cargas úteis usando a mesma cifra; a solução já está em vigor, só preciso de tempo para implementá-la.
Certifique-se de que seu arquivo PCAP esteja realmente no formato PCAP. Se você usou tcpdump ou WinDump para capturar o arquivo, estará bem. O Wireshark, no entanto, oferece uma grande variedade de opções "Salvar Como..." para salvar o tráfego do Wireshark, e apenas uma delas é realmente amigável ao tcpdump/PCAP. Estou trabalhando em melhores relatórios de erro para ajudar a detectar erros precocemente.
Não é um esquema de criptografia seguro. O PacketWhisper não é um esquema de criptografia seguro. É vulnerável a ataques de análise de frequência. Use a categoria de cifras 'FQDNs com Subdomínio Aleatório Único' para adicionar entropia e ajudar a degradar ataques de análise de frequência. Se o sigilo da carga útil for necessário, certifique-se de criptografar a carga útil antes de usar o PacketWhisper para processá-la.
Não é um método de transferência de alta largura de banda. O PacketWhisper depende de consultas DNS, que são baseadas em UDP, o que significa que a ordem de entrega (ou mesmo a entrega bem-sucedida) da solicitação não é garantida. O PacketWhisper, por padrão, adiciona um pequeno atraso (1/2 segundo) entre cada consulta DNS. Você pode transferir cargas úteis com segurança a uma taxa de cerca de 7,2 KB por hora (120 bytes por minuto). Isso é baseado no tamanho da carga útil original, não no arquivo de saída Cloakificado. Você pode optar por nenhum atraso entre as consultas, o que acelera dramaticamente a transferência, mas com o risco de aumento de ruído na rede e carga útil corrompida.
E vamos ser sinceros: se você tiver modos de transferência de dados não-DNS disponíveis, pode usar o projeto principal Conjunto de Ferramentas Cloakify para ocultar o arquivo à vista (talvez transformar a carga útil em uma lista de monstros do PokemonGo com coordenadas LatLon) e usar toda aquela alta largura de banda disponível via FTP/HTTP/etc. O DNS é extremamente útil quando outros protocolos estão bloqueados, mas esteja sempre ciente de suas opções.
DNS é DNS. Diferentes SOs têm diferentes políticas de cache DNS, etc. Redes podem estar inativas, isoladas, etc. O PacketWhisper inclui uma rápida verificação manual para ver se consegue resolver FQDNs comuns, mas o DNS é muitas vezes uma questão complicada. Lembre-se do antigo mantra de solução de problemas de TI: "É sempre o DNS."
Veja os slides do DEF CON 26 (incluídos no projeto) da minha apresentação no Packet Hacking Village. Estratégias de mitigação são abordadas no final da apresentação. Como em todas as coisas, "Segurança em Profundidade" é sua amiga, especialmente porque os caminhos de resolução DNS abrangem vastas áreas de terreno que estão fora do controle da sua organização.
Estarei adicionando modos para MDNS e LLMNR, modos de transmissão DNS em rede local. Estes são destinados a sistemas conectados à mesma rede local e eliminarão a necessidade de o dispositivo de captura ter acesso ao modo Promíscuo ao realizar capturas de pacotes wifi. (Esses protocolos enviam tráfego para x.y.z.255 na rede do host, transmitindo para todos os outros sistemas na mesma rede local.)
Também adicionarei mais cifras, mas para as necessidades do dia a dia, a coleção atual de cifras é tudo que já precisei. Você obterá um bom proveito delas.
Também estou trabalhando para permitir múltiplas cargas úteis usando a mesma cifra em um único arquivo PCAP. A solução já está prototipada, mas torna o fluxo de trabalho de extração do PCAP mais feio para o usuário. Operacionalmente, pode ser mais problema do que vale a pena. Sempre prefiro funcionalidade operacional mais limpa do que complexidade de canivete suíço.