Предисловие
В Интернете (в том числе и здесь, на хабре) видел достаточно много статей на тему обфускации трафика. Однако, к сожалению, именно практического материала очень мало: он либо подан слишком сумбурно, либо пропущены какие-то шаги, либо сложно повторим.
Сейчас я нахожусь в ситуации, когда между мной и остальным интернетом находится непрозрачный прокси-сервер, подменяющий сертификат (и фактически осуществляющий MITM). Эта статья призвана помочь таким же как я (и, возможно, будет полезна в ближайшем будущем, учитывая то, что сейчас делает РосКомНадзор).
Давайте сразу оговоримся, что описывать основы основ в этой статье я не буду. Сейчас моя основная цель - более менее систематизировать гайды из сети и помочь людям, имеющим как минимум базовые навыки администрирования Linux поднять свой собственный прокси, трафик до которого будет обфусцироваться.
Итак, начнем с первых экспериментов. Что первым приходит в голову, когда мы говорим об обходе цензуры? Скорее всего, вы не задумываясь ответите Tor. И будете правы - действительно, сейчас Tor Browser - швейцарский нож в обходе любых блокировок. Но сейчас нас интересует конкретно то, как он работает с трафиком, а точнее, с помощью каких инструментов его обфусцирует.
Самым распространенным (и при этом мощным) инструментом обфускации трафика в Tor является obfs4. Посмотрим, как его развернуть.
Глава 1. OBFS4.
Безрезультатно перепробовав уйму утилит (ptproxy, ptadapter), потом попытавшись написать свою, мною был обнаружен интересный проект - shapeshift dispatcher.
Он представляет собой написанный на go скрипт, универсальный для клиента и сервера. На сервере он перенаправляет получаемый обфусцируемый трафик, деобфусцирует его, и уже "чистый" трафик перенаправляет по указанному адресу.
На клиенте - создает сервер на localhost, принимающий "чистый" трафик, обфусцирует его, и, соответственно, передает куда надо.
Начнем наши эксперименты. Поскольку бинарники не предоставляются, для дальнейших действий придется собрать их самостоятельно. Благо, на go это делается просто - нужно просто склонировать репозиторий и запустить одну команду. Инструкция, как установить go доступна на их официальном сайте. После установки (или, если он уже установлен), необходимо загрузить репозиторий (командой git clone https://github.com/OperatorFoundation/shapeshifter-dispatcher
или загрузив и распаковав ZIP по ссылке https://github.com/OperatorFoundation/shapeshifter-dispatcher/archive/refs/heads/main.zip), перейти в директорию с исходниками и выполнить go build
. Все остальное за вас сделают автоматически
Синтаксис команды для запуска сервера выглядит так:
./shapeshifter-dispatcher \
-transparent \
-server \
-state state \
-orport 127.0.0.1:3333 \
-transports obfs4 \
-bindaddr obfs4-0.0.0.0:80 \
-logLevel DEBUG \
-enableLogging
Во всей этой команде нас интересует только два арумента: orport и bindaddr. Давайте, для примера, запустим ее на сервере. Если вы все сделали правильно, в консоли вы увидите сообщение listening on 127.0.0.1:80
(или ваш порт, в зависимости от того, что вы укажете). Теперь, для того, чтобы подключиться с клиента, необходимо узнать данные, которые сгенерировал obfs4proxy. Для этого, останавливаем выполнение сочетанием Ctrl+C и переходим в директорию state (или любую другую, которую вы передали в аргументе state). Там нас будут ждать два файла - obfs4_bridgeline.txt и obfs4_state.json. Нам необходимо открыть превый и из строки вида Bridge obfs4 ........ cert=CERTIFICATE_VALUE iat-mode=0
скопировать значение CERTIFICATE_VALUE.
Теперь запустим клиент. Синтаксис выглядит так:
./shapeshifter-dispatcher
-transparent \
-client \
-state state \
-target [IP]:80 \
-transports obfs4 \
-proxylistenaddr 127.0.0.1:1443 \
-optionsFile obfs4.json \
-logLevel DEBUG \
-enableLogging
В этой команде нужно заменить [IP] на публичный адрес вашего сервера. Для подключения, необходимо создать файл obfs4.json рядом со скриптом или указать путь до него в аргументе optionsFile. Содержимое файла: {"cert": "CERTIFICATE_VALUE","iat-mode": 0}
. Если не хотите сохранять файл, можно использовать аргумент -options {}
вместо optionsFile. Обращайте внимание на пробелы в JSON - здесь это почему-то критично.
Это все, безусловно, прекрасно и красиво, но давайте теперь применим это в реальной ситуации. Для этого, я поднял на сервере PPTP VPN (к примеру, по этому гайду). Теперь, необходимо поменять порты для того, чтобы все работало. Стандартный для PPTP - 1723, его и укажем.
Новая команда запуска сервера:
./shapeshifter-dispatcher \
-transparent \
-server \
-state state \
-orport 127.0.0.1:1723 \
-transports obfs4 \
-bindaddr obfs4-0.0.0.0:80 \
-logLevel DEBUG \
-enableLogging
клиента:
./shapeshifter-dispatcher
-transparent \
-client \
-state state \
-target [IP]:80 \
-transports obfs4 \
-proxylistenaddr 127.0.0.1:1723 \
-optionsFile obfs4.json \
-logLevel DEBUG \
-enableLogging
Значения IP и порта можно менять на свои в зависимости от ваших конфигураций или используемых серверов.
В завершение первой части:
Это мой первый опыт написания подобных материалов, поэтому, буду рад конструктивной критике. Если в статье вы видите ошибку, или хотите ее чем-то дополнить, оставьте комментарий или свяжитесь со мной. Надеюсь, был Вам полезен.
Технологий обфускации трафика еще много, поэтому продолжение следует...
Комментарии (19)
ptech
09.02.2022 18:13У OperatorFoundation есть ещё такая вещь как https://github.com/OperatorFoundation/obfs4
Было бы полезно в следующих статьях описать, как использовать этот транспорт для того, чтобы настроить мосты с obfs4 в /etc/tor/torrc.
edo1h
09.02.2022 19:21+3какая-то куцая статья.
из неё совершенно непонятно, что именно подразумевается под обфускацией, что такое obfs4 и чем он отличается от альтернатив.fuccsoc Автор
09.02.2022 22:25Обфкскация трафика простыми словами - либо его маскировка под другой вид (например Wireguard под HTTPS) или попытка сделать его не анализируемым (превращая в набор байт, как делает obfs4)
Цель статьи - не дать определения или сравнить, а скорее написать более-менее читаемые инструкции на русском языке, ибо когда я пытался все это развернуть, нехватка информации и гайдов реально ощущалась.
Спасибо за критику!
edo1h
09.02.2022 22:55+4Цель статьи — не дать определения или сравнить, а скорее написать более-менее читаемые инструкции
ИМХО в корне неверный подход.
скриншотами next-next-done и так весь интернет завален, пользы от них если хочешь разобраться никакой.
хорошая статья должна начинаться с того, зачем мы что-то делаем (тут у вас есть живой пример, неплохо), потом говорить что мы будем делать (обфусцировать трафик, превращая его для стороннего наблюдателя в набор случайных байт, который невозможно детектировать на dpi) и почему именно этот путь выбран (ну хотя бы потому, что применение obfs4 в tor показало жизнеспособность этого решения).
а «как сделать» — это тема скорее не для статьи, а для плейбука ансибла или вообще шелл-скрипта.fuccsoc Автор
09.02.2022 23:01цель конкретно данной статьи - рассказать о технологии obfs4. в дальнейшем, планируется рассмотреть остальные (типа V2Ray, Screamsuite и т.п.), чтобы уже потом сравнивать их и смотреть, что детектится на DPI, а что нет
edo1h
09.02.2022 23:24цель конкретно данной статьи — рассказать о технологии obfs4
я не увидел рассказа о технологии, я увидел скрипт для установки/настройки конкретной реализации.
snp
10.02.2022 08:26+1Wireguard под HTTPS
Wireguard работает по UDP и на kernel-level (это его главное преимущество, т.к. обеспечивает высокую скорость работы). Если мы его заворачиваем в TCP (https), то это будет некий софт в user-level, а значит — теряем в производительности. Ну и TCP для туннелей сам по себе плохой выбор.
Если надо получить рандомно выглядящие данные без какого-либо идентифицируемого формата, то хороший вариант — OpenVPN в режиме Static Key (без использования TLS). Правда, в этом случае ключ не меняется и не обеспечивается Forware Secrecy.
Кстати, только что нашёл ещё openvpn_xorpatch, его не пробовал. Он обфусцирует трафик OpenVPN в режиме TLS.
SerJ_82
10.02.2022 15:17Вот вам пища для размышления: у всех провайдеров устанавливается оборудование ТСПУ. Помимо прочего оно умеет определить трафик по сигнатуру и если нужно, резать скорость в режиме реального времени.
Вопрос: поможет ли обфускация в этом случае?
fuccsoc Автор
10.02.2022 15:47Однозначно на этот вопрос до наступления "момента икс", когда что-то заблокируют или порежут нельзя. Но скорее всего да - для этого все и было придумано. Из технологий обфускации есть множество "маскировочных" - в отличии от obfs4 они превращают трафик в подобие другого, например, косят под HTTPS или HTTP.
В дальнейшем, я планирую разобрать именно такие технологии и попробовать протестировать посниффить обфусцированный трафик и сравнить его с "настоящим" HTTPS.
SerJ_82
10.02.2022 18:42Вот это и интересно: как, точнее под что замаскировать трафик, генерируемый например Ютубом? Явно не под "просмотр статей на Хабре" =)
fuccsoc Автор
11.02.2022 14:03я сомневаюсь, что кто-то вручную будет анализировать большие пакеты.
а даже если и будет - можно маскировать, например, под загрузку какого-нибудь объемного файла
sakontwist
11.02.2022 01:25На данный момент пара крупных провайдеров успешно подрезает bridge-трафик в obfs4. Не работает ни анонс моста, ни обращение клиентов к бриджу. Уже могут.
edo1h
10.02.2022 16:03Вопрос: поможет ли обфускация в этом случае?
зависит от того как будут резать. если по белым спискам, то ничего не поможет, если только нет содействия со стороны владельцев серверов, попавших в белые списки
nkretov
в ssh клиенте есть встроенный socks proxy:
ssh -D 8080 my_vm_in_amazon - и в браузере прокси указываем localhost:8080
fuccsoc Автор
Да, действительно. Но в некоторых случаях, операторы / государство может спустя какое-нибудь время после установления сессии обрезать скорость - работать в терминале все ещё будет реально, а вот серфить интернет - нет.
nkretov
я правильно понимаю, что предлагается обфусцировать траффик а затем его еще и шифровать?
Spyder_Jerusalem
Интересный проект, благодарю за наводку, я так понял что у них есть отдельные конфиги для шифрования траффика и их можно выставлять ключом вместо obfs4?