UPD от 05.08.2023 - поскольку Microsoft забанил мое облако, все источники можно получить, связавшись со мной любым удобным способом. Все контакты на моей странице в Хабре.
UPD от 27.10.2022 - судя по всему, в исходниках что-то обновили и все поломалось. Здесь можно скачать билды, использованные в статье.
Предисловие
В Интернете (в том числе и здесь, на хабре) видел достаточно много статей на тему обфускации трафика. Однако, к сожалению, именно практического материала очень мало: он либо подан слишком сумбурно, либо пропущены какие-то шаги, либо сложно повторим.
Сейчас я нахожусь в ситуации, когда между мной и остальным интернетом находится непрозрачный прокси-сервер, подменяющий сертификат (и фактически осуществляющий 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 и порта можно менять на свои в зависимости от ваших конфигураций или используемых серверов.
В завершение первой части:
Это мой первый опыт написания подобных материалов, поэтому, буду рад конструктивной критике. Если в статье вы видите ошибку, или хотите ее чем-то дополнить, оставьте комментарий или свяжитесь со мной. Надеюсь, был Вам полезен.
Технологий обфускации трафика еще много, поэтому продолжение следует...