
Незаметно извлеките данные из браузера через DNS
Browsertunnel — это инструмент для извлечения данных из браузера с использованием протокола DNS. Он достигает этого за счёт злоупотребления функцией dns-prefetch, которая предназначена для уменьшения воспринимаемой задержки веб-сайтов путём выполнения DNS-запросов в фоновом режиме для указанных доменов. DNS-трафик не отображается в инструментах отладки браузера, не блокируется Content Security Policy (CSP) страницы и зачастую не проверяется корпоративными файрволами или прокси, что делает его идеальным каналом для скрытой передачи данных в ограниченных сценариях.
Это старая техника — DNS-туннелирование как таковое появилось ещё в 90-х, и Патрик Вананти писал об использовании dns-prefetch для этого в 2016 году, но, насколько мне известно, browsertunnel — это первая открытая, готовая к промышленному использованию клиент-серверная реализация, демонстрирующая её применение. Поскольку dns-prefetch не возвращает никаких данных обратно в клиентский javascript, связь через browsertunnel осуществляется только в одном направлении. Кроме того, некоторые браузеры отключают dns-prefetch по умолчанию, и в таких случаях browsertunnel молча завершится неудачей.
Проект состоит из двух частей:
html/, кодирует и отправляет сообщения со стороны клиента.Browsertunnel может отправлять произвольные строки по DNS, кодируя строку в поддомене, который пересылается на сервер browsertunnel, когда браузер пытается рекурсивно разрешить домен.
Длинные сообщения, которые не помещаются в один домен (253 байта), автоматически разбиваются на несколько запросов, которые собираются и декодируются сервером.
Сначала настройте DNS-записи, чтобы делегировать поддомен вашему серверу. Например, если IP вашего сервера — 192.0.2.123, и вы хотите использовать туннель через поддомен t1.example.com, то конфигурация DNS будет выглядеть так:
t1 IN NS t1ns.example.com.
t1ns IN A 192.0.2.123
На вашем сервере установите browsertunnel с помощью go get. В качестве альтернативы скомпилируйте browsertunnel на своей машине и скопируйте бинарник на сервер.
go get github.com/veggiedefender/browsertunnel
Затем запустите browsertunnel, указав поддомен для туннелирования.
browsertunnel t1.example.com
Полные параметры можно посмотреть, выполнив browsertunnel -help:
$ browsertunnel -help
Usage of browsertunnel:
-deletionInterval int
seconds in between checks for expired messages (default 5)
-expiration int
seconds an incomplete message is retained before it is deleted (default 60)
-maxMessageSize int
maximum encoded size (in bytes) of a message (default 5000)
-port int
port to run on (default 53)
Более подробные описания и обоснование этих параметров можно найти в godoc.
Наконец, протестируйте ваш туннель! Вы можете использовать мою демонстрационную страницу здесь или клонировать этот репозиторий и открыть html/index.html локально. Если всё работает, вы должны увидеть сообщения, выводимые в stdout.
Для реальных применений этого проекта вы, возможно, захотите сделать форк и адаптировать код под свои нужды. Несколько идей: