29 января 2016 в 09:28

Дурим DPI двумя скриптами

Данная статья является лиш исследованием на тему и не должна использоваться как инструкция к действию.

В связи с разгулом банхамера по интернет просторам участились советы по использованию различных прокси, vpn, tor и анонимайзеров. Эти все способы отправляют трафик третей стороне которая его может перехватывать и модифицировать. Это не наш метод. Мы сейчас просто и легко научим браузер дурить DPI.

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

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


Исходные данные:
Сайт(Адрес изменён): rutracker.og


Страница заглушка(Адрес изменён): 198.51.100.0...

Адрес страницы заглушки которая появляется при попытке открытия сайта. У каждого провайдера адрес страницы заглушки наверно разный.


Итак открываем блокнот и пишем первый скрипт:
function FindProxyForURL(url, host) {

  if (shExpMatch(url, "http://*") && shExpMatch(host, "rutracker.og")) {
    return "PROXY rutracker.og; DIRECT";
  }

  return "DIRECT";
}


Сохраняем как «proxy.pac»

Суть этого скрипта в том чтобы использовать как прокси сам сервер к которому мы и хотим получить доступ.

Подключаем «proxy.pac» в Chrome:
1. Настройки -> Показать дополнительные настройки ->
Сеть -> Изменить настройки прокси-сервера ->
Вкладка «Поключения» -> Настройка сети
2. Ставим галочку «Использовать сценарий автоматической настройки»
3. В поле адрес пишем полный путь к «proxy.pac»
Например: C:\Users\name\Documents\proxy.pac

Теперь страница заглушка будет появляется через раз.

Снова открываем блокнот и пишем:
// ==UserScript==
// @name BackUserJS
// @description Window History Back Script
// @author ivan386
// @license MIT
// @version 1.0
// @include http://198.51.100.0/*
// @run-at document_start
// @grant none
// ==/UserScript==

(function (window) { 
    var w;

    w = window;
    
    if (w.self != w.top) {
        return;
    }

    if (/http:\/\/198.51.100.0/.test(w.location.href)) {
		w.history.back()
    }
})(window);


Сохраняем как «back.user.js» в папку «back»

Этот скрипт возвращает нас на страницу где мы можем снова кликнуть ссылку.

И опять открываем Блокнот и пишем:
{ 
    "manifest_version": 2,
    "content_scripts" : [
        {
            "js":[ "back.user.js" ], 
            "matches":[ "http://198.51.100.0/*" ], 
            "run_at":"document_start"  
        }
    ], 
    "description" : "Window History Back Script", 
    "name" : "BackUserJS",
    "version" : "1.0.0"
}


Сохраняем как «manifest.json» в папку «back»

Теперь добавим в Chrome как Расширение:
1. Дополнительные инструменты -> Расширения
2. Ставим галочку «Режим разработчика»
3. Нажимаем «Загрузить распакованное расширение...»
4. Находим папку «back» в которую сохраняли «back.user.js» и «manifest.json» и нажимаем ОК

Проверяем:
1. Перезагружаем Chrome
2. Нажимаем «Отмена» в окошке «Отключить расширения в режиме разработчика» справа.
3. Пишем в адресную строку адрес сайта и нажимаем Enter.
4. ???
5. PROFIT

Использованные материалы:
Изучаем deep packet inspection у RETN
Proxy Auto Configuration (PAC)
Учимся писать userscript'ы
Userscripts. Упаковываем юзерскрипт для Chrome

Продолжение:
Через фильтрующий прокси при помощи скрипта во имя Луны
@ivan386
карма
49,0
рейтинг 7,1
Программист-фрилансер
Похожие публикации
Самое читаемое Разработка

Комментарии (54)

  • 0
    В ростелекоме убрали редирект на страницу-заглушку, теперь просто отдает страницу со статусом 451 (Unavailable For Legal Reasons) и данный способ не помогает это обойти.
    • +1
      Видимо ваше отделение оперативней среагировало. Или у них алгоритмы блокировки по проще. У меня пока метод работает.
    • +1
      Этот метод не работает против фильтрующего прокси. Изучаю вопрос.
    • 0
      Ого, а покажите, пожалуйста скриншот, например, ибо у себя попробовал попасть на страницу блокировки, а там всё тоже самое. Прошу поскольку очень уж интересно посмотреть на страницу с 451 ошибкой в реальном рунете.
      • +1
        скриншот
        image
        • 0
          Какой оригинальный ответ однако от блокировщика ибо приходит с block.ip.center.rt.ru похоже Ростелеком всё таки поставил полноценный DPI.
        • 0
          В хедерах есть Location но переадресация не происходит. Это даже лучше. В данном случае можно просто обновлять страницу. Кстати нажмите «view source» в «Request Headers» и убедитесь что в GET полный адрес (http://...) а не только путь. Если только путь (GET /...) то proxy.pac не сработал.
    • 0
      P.S. у меня просто вот такая «заглушка», как раз с кодом 451 по умолчанию выдаётся «моим пользователям»
      451.html


      <!DOCTYPE html><meta charset="utf-8"/><html><head><title>Государственная цензура</title></head><body><center><br><br><h2>Вас пытались перенаправить с заблокированного в РФ ресурса на страницу заглушку</h2><br><h3>Пожалуйста, сообщите, сами знаете кому, о том, что испытали проблемы с доступом, я всё исправлю.<br><br>В случае если меня в данный момент нет дома или же я сплю, пожалуйста, не беспокойте меня, вы можете самостоятельно восстановить доступ, воспользовавшись одним из способов описанным на станице <a href="http://rublacklist.net/bypass">«Восстановление доступа к информации»</a> на сайте организации Роскомсвобода или же на странице <a href="https://meduza.io/cards/kak-oboyti-blokirovki-saytov">«Как обойти блокировки сайтов?»</a> на сайте Медуза.</h3><img src="/image/lit_censorship.png"><center></body></html>
      

  • 0
    А каков принцип работы?
    «Эшелонированную защиту» не пробивает, когда блокирует провайдер и его аплинк.
    • 0
      DPI пакет не узнаёт и не высылает заглушку. Но работает метод через раз поэтому второй скрипт нужен.
  • +2
    Сильно зависит от паранойи админов провайдера, встречал схему DPI + дополнительно все запросы на 53 порт редиректятся провайдером на свой сервер DNS, какой у себя DNS не укажи все равно будет обрабатывать провайдерский, тогда только VPN спасает до своего сервера.
    • +5
      Кстати, я у себя только dns завернул в vpn, чтобы не весь трафик туда гонять. Дёшево и сердито.
      • +1
        Аналогично, плюс таблица IP которые ходят исключительно через VPN, все что не в таблице идет через провайдера, оптимальное соотношение скорости работы и доступности сайтов.
    • 0
      От перехвата DNS запросов может помочь DNSCrypt, он через 443 порт работает.
  • –6
    www.torproject.org/projects/torbrowser.html — захожу через это на заблокированные сайты, полет нормальный.
    Не нашел только как тут включить меня как внутрисетевой узел в сеть, раньше это просто было, мб в курсе кто?
    • 0
      У тора уж очень большие шансы нарваться на человека посередине, даже в топике об этом сказано и рассматривается пример с сайтом без https.
      • +3
        ну если им заходить только на торрент-трекеры/луркоморье и прочие заблокированные, не вижу особо проблемы. он мне не для анонимности нужен
        • 0
          Проблемы, в основном, из-за авторизации возникают, хотя подделки страниц без https тоже однозначно исключить нельзя.
  • 0
    Я дико извиняюсь, но в качестве альтернативной меры использование DNS серверов гугла прям в роутере не практичнее?
    Спасибо
    • 0
      От DPI это не поможет. DNS прописаны и гугловские и яндексовские. Блок у меня идёт на уровне TCP пакетов. Каждый провайдер по своему решил проблему блокирования сайтов поэтому решение не универсально.
    • 0
      Нет, у меня провайдер весь трафик переводит на себя, простое прописывание альтернативных DNS от этого не спасет, все равно будут его юзаться.
  • 0
    Фактически, вместо поля Host: имя сервера оказывается в самой строке GET.
    Интересно, какие веб-сервера совместимы с этим по умолчанию?
    • 0
      Видимо все. Поскольку если сделать так:
      function FindProxyForURL(url, host) {
      
        if (shExpMatch(url, "http://*")) {
          return "PROXY "+host+"; DIRECT";
        }
      
        return "DIRECT";
      }
      


      Проблем не наблюдается. Проблема здесь может быть только с сайтами которые используют альтернативный порт для http вместо стандартного (80).
      • 0
        А если убрать "; DIRECT"? Порт можно, кстати, выпарсить…
        • 0
          Тогда проблема с другим портом будет гарантированно. Так хоть если не соедениться с 80тым попробует напрямую.
  • +3
    Есть и более практичные способы, которые, правда, требуют устройства под управлением Linux (роутер, например):
    Для ДОМ.ру и Интерзет
    Для Ростелекома способ 1 (тот, что ниже, от меня) и способ 2.

    Ну и на основе proxy.pac, но с прокси.
    • 0
      Я также исследовал модификацию хедеров для прохода DPI как и в этой статье. Написал простенький тестер прохода на Lua. Пытался писать свой локальный прокси но он коряво работает. И собственно таки пришёл к идее как прокси использовать сам сервер.

      Второй способ вообще должен быть идеален для данного типа блокировки если есть iptables. Я о нём также думал смотря в WireShark. Но в windows iptables нет. Не знаю есть ли у меня доступ к этому на роутере.

      Я на кстати на основе этого proxy.pac (скачав и изменив) себе сделал свой для всех заблокированных сайтов.

      Если прикроют мой способ будем пробовать вариант с 3proxy если антивирус на него ругаться не будет.

      К сожалению все варианты с модификацией заголовка и отбрасыванием пакетов не работают при фильтрующем прокси. Если прокси не понимает заголовка то и сервер не поймет. Этот вопрос я поставил в очередь на исследование. Очень хочется как можно дольше не отдавать трафик в чужие руки.
  • 0
    Что только не придумают, лишь бы ipv6 не настраивать.
    • 0
      Ну ipv6 на сервере недавно только подняли. И если использовать 6to4 гейт 192.88.99.1 то у него приоритет ниже ipv4. Это наверно можно исправить прописав в proxy.pac как прокси ipv6 адрес узла.
      • 0
        6to4 не нужно использовать, он объявлен устаревшим в мае 2015.
        • 0
          Надеюсь он всё ещё работает поскольку другого способа получения халявного ipv6 я не знаю.
          • 0
            Его работоспособность зависит от anycast-сервера, ближайшего к вам. Обычно работает, да. Но и других способов хватает.
            • 0
              А какие альтернативы?
              • 0
                Туннельные брокеры (6in4, иначе говоря), AYIYA, умирающий Teredo (только не с серверами Microsoft).
        • 0
          Вы перепутали с teredo
          • 0
            • 0
              Попробуйте тогда найти этому подтверждение. Я бегло погуглил и вику посмотрел и ничего не нашел. Про отмену тередо везде находится начиная с его rfc.
              • 0
                Подтверждение чему? Я же привел ссылку на RFC.
                • 0
                  Извиняюсь, на телефоне не заметил что это ссылка была. Сейчас ознакомлюсь.
            • 0
              Расскажите пожалуйста вкратце почему они решили отказаться и какую альтернативу предложили.
              • 0
                Много ошибок, глубоко скрытых от пользователя, в результате которых пользователи отключали ipv6, считая его не надежным. В рамках этого rfc никакой альтернативы, кроме того что вернуться к изначальному rfc на 6to4 без этого эникастового релея, а в последствии подумать.
                Это то что я вычитал на своем битом английском, надо бы перечитать и перепроверить.
            • 0
              Строго говоря RFC 7526 объявляет устаревшим только позднюю присадку к 6to4 в виде эникаста 192.88.99.1 т.е вроде бы не сам 6to4. Хотя там много всего что отговаривает от его использования. В любом случае перед продолжением его использования надо будет внимательно перечитать этот rfc и пачку связанных. Спасибо за ссылку.
              Удивительно — ни одной статьи на хабре по теме.
    • 0
      Включил 6to4 туннель на роутере. Задал ipv6 в proxy.pac дабы приоритет не играл роли.

      Chrome спокойно погнал трафик по ipv6.
      FireFox начал флудить коннектами на ipv4 адрес.

      Вернул в porxy.pac как было (домен).
      Прописал в hosts (Адреса изменены)
      2001:db8:: rutracker.og

      FireFox и Chrome пошли на сайт через ipv6 без проблем. Фильтрующий прокси трафик не порезал.
      • 0
        В винде приоритет (prefixpolicies) выставляется в netsh довольно удобно. У меня выставлен в приоритет разных видов ipv6 над ipv4 и только для кривых сайтов специально выставлен ipv4. Это сайты районной локалки, которые работали в ipv6 когда местный провайдер игрался с новым протоколом и перестали работать когда пров забыл что этот протокол у него есть.
      • 0
        Хмм. Только сейчас заметил что у меня ничего кроме него через 6to4 не работает. Все тесты ipv6 не проходит.

        Трассировка маршрута к 192.88.99.1 с максимальным числом прыжков 30
        ...
          8     2 ms     2 ms     1 ms  81-27-241-140.rascom.as20764.net [81.27.241.140]
        
          9    12 ms    12 ms    12 ms  80-64-96-29.rascom.as20764.net [80.64.96.29]
         10     *        *        *     Превышен интервал ожидания для запроса.
         11     *        *        *     Превышен интервал ожидания для запроса.
         12     *        *        *     Превышен интервал ожидания для запроса.
         13     *        *        *     Превышен интервал ожидания для запроса.
         14     *        *        *     Превышен интервал ожидания для запроса.
         15     *        *        *     Превышен интервал ожидания для запроса.
         16     *        *        *     Превышен интервал ожидания для запроса.
         17     *        *        *     Превышен интервал ожидания для запроса.
         18     *        *        *     Превышен интервал ожидания для запроса.
         19     *        *        *     Превышен интервал ожидания для запроса.
         20     *        *        *     Превышен интервал ожидания для запроса.
         21     *        *        *     Превышен интервал ожидания для запроса.

        Пинги из инета ко мне приходят. Видимо проблема именно на моём узле 6to4.
    • 0
      Мне говорили, что некоторые ISP по IPv6 тоже блокируют ресурсы, так что только vpn и т.п, но мне без надобности запоминать местечковых ISP другой страны, так что без пруфов.
  • 0
    Метод Chrome-only, в Firefox установка proxy.pac ничего не даёт, постоянно всплывает всё та же заглушка.
    • 0
      Думаю, вводить нужно путь с URI, т.е. file://, а не просто путь. Честно говоря, не знал, что в Chrome можно без file:// вводить.
      • 0
        Пробовал и так, всё равно не работает. А в Chrome без проблем.
        • 0
          А если загрузить куда-то, или просто веб-сервер поднять, ссылка с http работает? Может, где-то синтаксическая или иная ошибка?
      • 0
        Chrome в Windows использует настройки сети в IE и собственно их и открывает. Видимо IE понимает и такой путь а хром получает файл. FireFox в своих настройках автоматом меняет на file://
    • 0
      У меня работает и в Firefox. Заглушка проскакивает иногда и в Chrome но второй скрипт её тут же её закрывает. Я специально не стал распыляться на все браузеры сосредоточившись на Chrome.

      В Firefox для второго скрипта нужно поставить GreaseMonkey и скормить ему «back.user.js». Либо поставить RequestPolicy который запретит переадресацию и можно будет просто нажать кнопку попробовать снова.

      Также посмотрите на заголовки в FireBug в исходном виде. Там должен быть полный адрес в GET. Если в GET только путь («GET /… HTTP/1.1») то proxy.pac не сработал.
      • +1
        Получилось запустить. Если в Firefox выбрать пункт «использовать системные настройки прокси», а в системе прописать этот proxy.pac, он подхватывается. А напрямую, через предназначенное для него поле — ни в какую. Перепробовал разные варианты, даже слеш в обратную сторону разворачивал, всё равно не подхватывается.
        Ну ладно, главное работает…
  • 0
    Можно избавиться от первого этапа ручной установки pac-скрипта и применить настройки прокси из самого расширения, дав ему соответствующие права в manifest-файле:
     {
        ...
        "permissions": [
            "proxy"
        ],
    }
    

    Далее использовать объект «chrome.proxy» в режиме «pac_script» с указанием соответствующего «PacScript».
    Подробнее в документации:
    https://developer.chrome.com/extensions/proxy

    Спасибо за интересный материал.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.