Предисловие

В Интернете (в том числе и здесь, на хабре) видел достаточно много статей на тему обфускации трафика. Однако, к сожалению, именно практического материала очень мало: он либо подан слишком сумбурно, либо пропущены какие-то шаги, либо сложно повторим.

Сейчас я нахожусь в ситуации, когда между мной и остальным интернетом находится непрозрачный прокси-сервер, подменяющий сертификат (и фактически осуществляющий 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)


  1. nkretov
    09.02.2022 16:32

    в ssh клиенте есть встроенный socks proxy:
    ssh -D 8080 my_vm_in_amazon - и в браузере прокси указываем localhost:8080


    1. fuccsoc Автор
      09.02.2022 16:38
      +1

      Да, действительно. Но в некоторых случаях, операторы / государство может спустя какое-нибудь время после установления сессии обрезать скорость - работать в терминале все ещё будет реально, а вот серфить интернет - нет.


      1. nkretov
        09.02.2022 21:14

        я правильно понимаю, что предлагается обфусцировать траффик а затем его еще и шифровать?


      1. Spyder_Jerusalem
        10.02.2022 17:24

        Интересный проект, благодарю за наводку, я так понял что у них есть отдельные конфиги для шифрования траффика и их можно выставлять ключом вместо obfs4?


  1. nalinor
    09.02.2022 18:13
    +1

    Хотелось бы увидеть применение obfs4 на практике: примеры использования, как человек посередине (например, провайдер) видит этот трафик, и существует ли возможность деобфусцировать его


    1. olegtsss
      09.02.2022 19:07

      Да! Дампы покажите пожалуйста, очень интересно.


  1. ptech
    09.02.2022 18:13

    У OperatorFoundation есть ещё такая вещь как https://github.com/OperatorFoundation/obfs4

    Было бы полезно в следующих статьях описать, как использовать этот транспорт для того, чтобы настроить мосты с obfs4 в /etc/tor/torrc.


  1. edo1h
    09.02.2022 19:21
    +3

    какая-то куцая статья.
    из неё совершенно непонятно, что именно подразумевается под обфускацией, что такое obfs4 и чем он отличается от альтернатив.


    1. fuccsoc Автор
      09.02.2022 22:25

      Обфкскация трафика простыми словами - либо его маскировка под другой вид (например Wireguard под HTTPS) или попытка сделать его не анализируемым (превращая в набор байт, как делает obfs4)

      Цель статьи - не дать определения или сравнить, а скорее написать более-менее читаемые инструкции на русском языке, ибо когда я пытался все это развернуть, нехватка информации и гайдов реально ощущалась.

      Спасибо за критику!


      1. edo1h
        09.02.2022 22:55
        +4

        Цель статьи — не дать определения или сравнить, а скорее написать более-менее читаемые инструкции

        ИМХО в корне неверный подход.
        скриншотами next-next-done и так весь интернет завален, пользы от них если хочешь разобраться никакой.
        хорошая статья должна начинаться с того, зачем мы что-то делаем (тут у вас есть живой пример, неплохо), потом говорить что мы будем делать (обфусцировать трафик, превращая его для стороннего наблюдателя в набор случайных байт, который невозможно детектировать на dpi) и почему именно этот путь выбран (ну хотя бы потому, что применение obfs4 в tor показало жизнеспособность этого решения).
        а «как сделать» — это тема скорее не для статьи, а для плейбука ансибла или вообще шелл-скрипта.


        1. fuccsoc Автор
          09.02.2022 23:01

          цель конкретно данной статьи - рассказать о технологии obfs4. в дальнейшем, планируется рассмотреть остальные (типа V2Ray, Screamsuite и т.п.), чтобы уже потом сравнивать их и смотреть, что детектится на DPI, а что нет


          1. edo1h
            09.02.2022 23:24

            цель конкретно данной статьи — рассказать о технологии obfs4

            я не увидел рассказа о технологии, я увидел скрипт для установки/настройки конкретной реализации.


      1. snp
        10.02.2022 08:26
        +1

        Wireguard под HTTPS

        Wireguard работает по UDP и на kernel-level (это его главное преимущество, т.к. обеспечивает высокую скорость работы). Если мы его заворачиваем в TCP (https), то это будет некий софт в user-level, а значит — теряем в производительности. Ну и TCP для туннелей сам по себе плохой выбор.


        Если надо получить рандомно выглядящие данные без какого-либо идентифицируемого формата, то хороший вариант — OpenVPN в режиме Static Key (без использования TLS). Правда, в этом случае ключ не меняется и не обеспечивается Forware Secrecy.


        Кстати, только что нашёл ещё openvpn_xorpatch, его не пробовал. Он обфусцирует трафик OpenVPN в режиме TLS.


      1. SerJ_82
        10.02.2022 15:17

        Вот вам пища для размышления: у всех провайдеров устанавливается оборудование ТСПУ. Помимо прочего оно умеет определить трафик по сигнатуру и если нужно, резать скорость в режиме реального времени.

        Вопрос: поможет ли обфускация в этом случае?


        1. fuccsoc Автор
          10.02.2022 15:47

          Однозначно на этот вопрос до наступления "момента икс", когда что-то заблокируют или порежут нельзя. Но скорее всего да - для этого все и было придумано. Из технологий обфускации есть множество "маскировочных" - в отличии от obfs4 они превращают трафик в подобие другого, например, косят под HTTPS или HTTP.

          В дальнейшем, я планирую разобрать именно такие технологии и попробовать протестировать посниффить обфусцированный трафик и сравнить его с "настоящим" HTTPS.


          1. SerJ_82
            10.02.2022 18:42

            Вот это и интересно: как, точнее под что замаскировать трафик, генерируемый например Ютубом? Явно не под "просмотр статей на Хабре" =)


            1. fuccsoc Автор
              11.02.2022 14:03

              я сомневаюсь, что кто-то вручную будет анализировать большие пакеты.

              а даже если и будет - можно маскировать, например, под загрузку какого-нибудь объемного файла


          1. sakontwist
            11.02.2022 01:25

            На данный момент пара крупных провайдеров успешно подрезает bridge-трафик в obfs4. Не работает ни анонс моста, ни обращение клиентов к бриджу. Уже могут.


        1. edo1h
          10.02.2022 16:03

          Вопрос: поможет ли обфускация в этом случае?

          зависит от того как будут резать. если по белым спискам, то ничего не поможет, если только нет содействия со стороны владельцев серверов, попавших в белые списки