From 2d8ada799c58829c194205fa5542a76ca1f8b4be Mon Sep 17 00:00:00 2001 From: ruti <> Date: Mon, 22 Jul 2024 01:03:12 +0300 Subject: [PATCH] Update readme.txt --- readme.txt | 163 +++++++++++++++++++++++------------------------------ 1 file changed, 72 insertions(+), 91 deletions(-) diff --git a/readme.txt b/readme.txt index cb70bc9..a42d8ba 100644 --- a/readme.txt +++ b/readme.txt @@ -1,16 +1,13 @@ Implementation of some DPI bypass methods. The program is a local SOCKS proxy server. --------------- + Usage example: -$ ciadpi --disorder 3 --auto=torst --tlsrec 1+s -$ ciadpi --fake -1 --ttl 8 +ciadpi --disorder 3 --auto=torst --tlsrec 1+s +ciadpi --fake -1 --ttl 8 --------------------- -Реализация некоторых способов запутывания DPI. -Программа представляет собой локальный SOCKS прокси сервер. +--- +### Описание аргументов --------------------- -Описание аргументов: -i, --ip <ip> Прослушиваемый IP, по умолчанию 0.0.0.0 @@ -55,13 +52,6 @@ $ ciadpi --fake -1 --ttl 8 sid_inv : session_id в TLS ServerHello и ClientHello не совпадают alert : TLS Error Alert в ответе none : Предыдущая группа пропущена, например из-за ограничения по доменам или протоколам - По умолчанию обрабатывается только torst - Можно указывать несколько групп опций, раделяя их данным параметром - Если соединение успешно прошло, то параметры для данного IP будут закешированны - Параметры, которые можно вынести в отдельную группу: - proto, hosts, dst, split, disorder, oob, fake, ttl, ip-opt, md5sig, fake-data, mod-http, tlsrec - Пример: - --auto=redirect --split=1+h --auto=torst --fake -1 --auto=sid_inv,alert --tlsrec 1+s -u, --cache-ttl <sec> Время жизни значения в кеше, по умолчанию 100800 (28 часов) @@ -69,7 +59,6 @@ $ ciadpi --fake -1 --ttl 8 -T, --timeout <sec> Таймаут ожидания первого ответа от сервера в секундах В Linux переводится в миллисекунды, поэтому можно указать дробное число - Истечение таймаута будет обработано --auto -K, --proto[=t,h] Белый список протоколов: tls,http @@ -133,132 +122,124 @@ $ ciadpi --fake -1 --ttl 8 -r, --tlsrec <n[+s]> Разделить ClientHello на отдельные записи по указанному смещению - Можно указывать несколько раз - -------- -Детали: ---split + Можно указывать несколько раз + +### Подробнее + +--- +--split Разбивает запрос на части. Пример на запросе в 30 байт: - Параметры: --split 3 --split 7 -- Порядок отправки: 1-3, 3-7, 7-30 +- Порядок отправки: 1-3, 3-7, 7-30 ---disorder +--- +--disorder Часть, попадающая под disorder, будет отправлена с TTL=1, т.е. фактически не будет никуда доставлена. -Однако ОС узнает об этом лишь после отсылки последующей части, когда сервер сообщит о потере с помощью SACK. -Системе придется отослать предыдущий пакет заново, тем самым нарушив порядок. -Использовать disorder на нескольких позициях подряд нет смысла, т.к. они объединятся в один сегмент: -- Параметры: --disorder 3 --disorder 7 -- Порядок отправки: 7-30, 1-7 -Сервер получает лишь 7-30 и сообщает о недостаче 1-7. -Однако, можно использовать split: -- Параметры: --disorder 3 --split 7 --disorder 23 -- Порядок отправки: 3-7, 23-30, 1-3, 7-23 -Сервер получает 3-7 и 23-30 и сообщает, что не получил 1-3 и 7-23. +ОС узнает об этом лишь после отсылки последующей части, когда сервер сообщит о потере с помощью SACK. +Системе придется отослать предыдущий пакет заново, тем самым нарушив обычный порядок. +- Параметры: --disorder 7 +- Порядок отправки: 7-30, 1-7 Вышесказанное распространяется только на Linux. В Windows выполняется полная ретрансмиссия: - Параметры: --disorder 7 - Порядок отправки: 7-30, 1-30 -Когда сервер сообщает о пропуске 1-7, система отсылает 1-30, т.е. и доставленные данные тоже. -DPI может среагировать на второй пакет, т.к. он никак не фрагментирован. -Тут выручает split: + +Поэтому желательно использовать ещё и split: - Параметры: --split 7 --disorder 23 - Порядок отправки: 1-7, 23-30, 7-30 -Сервер полчует 1-7 и 23-30, сообщает о пропуске 7-23. -В таком случае система отправит лишь 7-30. -На практике оптимально использовать: -Linux: --disorder 3 -Windows: --split 1+s --disorder 3+s +На практике оптимально использовать: +Linux: --disorder 3 +Windows: --split 1+s --disorder 3+s ---fake -Пример: +--- +--fake - Параметры: --fake 7 - Порядок отправки: 1-7 фейк, 7-30 оригинал, 1-7 оригинал -Данные в первой части запроса заменяются на поддельные. + +Данные в первой части запроса заменяются на поддельные. Эта часть должна пройти через DPI, но не дойти до сервера. А раз часть не дойдет, то ОС отправит ее снова, тем самым изменив порядок подобно disorder. -Для того, чтобы фейк не дошел до сервера, есть опции ttl, ip-opt и md5sig. +Для того, чтобы фейк не дошел до сервера, есть опции ttl, ip-opt и md5sig. -Можно подобрать такой TTL, чтобы пакет прошел через все DPI, но уничтожился по пути к серверу. -Однако некоторые серверы расположены ближе DPI и поддельные пакеты до них могут все таки дойти. -Тогда, скорее всего, сайт пришлет ошибку и разорвет соединение. -Для того, чтобы обнаружить подобные ситуации, есть опция --auto: ---fake -1 --ttl 10 --auto=cl_err,sid_inv,alert --fake -1 --ttl 6 -В данном примере - если возникнет ошибка с ttl=10, то он будет уменьшен до 6-ти - -Помимо ttl, есть ip-opt. Он устанавливает IP Options для пакета. -Пакеты с такой опцией наверняка отбросятся на магистрали, пройдя через несколько маршрутизаторов. -Есть еще md5sig. Он устанавливает опцию TCP MD5 Signature, что не дает пакету быть принятым многими серверами. -Однако, md5sig работает не во всех сборках Linux, а ip-opt не работает на многих версиях Windows. +TTL необходимо подбирать такой, чтобы пакет прошел через все DPI, но не дошел до сервера. +Для Linux есть md5sig. Он устанавливает опцию TCP MD5 Signature, что не дает пакету быть принятым многими серверами. +К сожалению, md5sig работает не во всех сборках. Для Windows есть еще один способ избежать обработки фейка сервером. Это комбинирование fake с disorder: - Параметры: --disorder 1 --fake 7 - Порядок отправки: 2-7 фейк, 7-30 оригинал, 1-30 оригинал + Если поддельный пакет и дойдет до сервера, то он будет перезаписан из-за полной ретрансмисси. -На практике оптимально использовать: -Linux: --fake -1 --md5sig -Windows: --disorder 1 --fake -1 +На практике оптимально использовать: +Linux: --fake -1 --md5sig +Windows: --disorder 1 --fake -1 ---oob +--- +--oob TCP может отсылать данные вне основного потока, используя флаг URG, однако лишь 1 байт в пакете. Все данные в таком пакете будут доставлены приложению, кроме последнего байта, который и является внеканальным: - Параметры: --oob 3 - Отправка: 1-4 с флагом URG (1-3 данные запроса + 4-й байт, который будет усечен), 3-30 -Этот байт можно поместить, например, в SNI: --oob 3+s ---tlsrec +Этот байт желательно помещать в SNI: --oob 3+s + +--- +--tlsrec Одну TLS запись можно разбить на несколько, немного переделав заголовок. -На месте разбиения вставляется новый заголовок, увеличивая размер запроса на 5 байт. -Этот заголовок можно поместить в середину SNI, не давая возможность DPI правильно его прочитать: +На месте разбиения вставляется новый заголовок, увеличивая размер запроса на 5 байт. +Этот заголовок можно поместить в середину SNI, не давая возможность DPI правильно его прочитать: --tlsrec 3+s Хоть tlsrec и oob запутывают DPI, они также могут запутать всякие мидлбоксы, -которые не поддерживают полноценный стек TCP/TLS, тем самым ограничив доступ к некоторым серверам. -Поэтому их следует использовать вместе с --auto: ---auto=torst --timeout 3 --tlsrec 3+s -В примере tlsrec будет применяться лишь в случаях, когда сброшено подключение или вышел таймаут, т.е. когда, скорее всего, произошла блокировка. -Можно наоборот - отменять tlsrec, если сервер сбрасывает подключение или откидывает пакет: ---tlsrec 3+s --auto=torst --timeout 3 +которые не поддерживают полноценный стек TCP/TLS. +Из-за этого их следует использовать вместе с --auto: +--auto=torst --timeout 3 --tlsrec 3+s +В примере tlsrec будет применяться лишь в случаях, когда сброшено подключение или вышел таймаут, т.е. когда, скорее всего, произошла блокировка. +Можно наоборот - отменять tlsrec, если сервер сбрасывает подключение или откидывает пакет: +--tlsrec 3+s --auto=torst --timeout 3 ---auto, --hosts +--- +--auto, --hosts Параметр auto делит опции на группы. Для каждого запроса они обходятся слева на право. -Сначала проверяется триггер, указанный в auto, затем proto и hosts. +Сначала проверяется триггер, указанный в auto, затем proto и hosts. +Можно указывать несколько групп опций, раделяя их данным параметром. +Параметры, которые можно вынести в отдельную группу: +proto, hosts, split, disorder, oob, fake, ttl, ip-opt, md5sig, fake-data, mod-http, tlsrec -Примеры: ---fake -1 --ttl 10 --auto=alert,sid_inv --fake -1 --ttl 5 +Примеры: +--fake -1 --ttl 10 --auto=alert,sid_inv --fake -1 --ttl 5 По умолчанию использовать fake с ttl=10, в случае ошибки использовать fake с ttl=5 ---hosts list.txt --disorder 3 --auto=none +--hosts list.txt --disorder 3 --auto=none Применять запутывание только для доменов из list.txt ---hosts list.txt --auto=none --disorder 3 +--hosts list.txt --auto=none --disorder 3 Не применять запутывание для доменов из list.txt ---auto=torst --hosts list.txt --disorder 3 +--auto=torst --hosts list.txt --disorder 3 По умолчанию ничего не делать, использовать disorder при условии, что произошла блокировка и домен входит в list.txt. ---proto=http,tls --disorder 3 --auto=none +--proto=http,tls --disorder 3 --auto=none Запутывать только HTTP и TLS ---proto=http --fake -1 --fake-data=':GET /...' --auto=none --fake -1 +--proto=http --fake -1 --fake-data=':GET /...' --auto=none --fake -1 Переопределить фейковый пакет для HTTP -------- -Сборка: +--- +### Сборка Для сборки понадобится: -make, gcc/clang для Linux, mingw для Windows +make, gcc/clang для Linux, mingw для Windows -# Linux -$ make -# Windows -$ make windows CC=x86_64-w64-mingw32-gcc +Linux: make +Windows: make windows CC=x86_64-w64-mingw32-gcc -------------- -Дополнительная информация о DPI: -https://github.com/bol-van/zapret/blob/master/docs/readme.txt -https://geneva.cs.umd.edu/papers/geneva_ccs19.pdf -https://habr.com/ru/post/335436 \ No newline at end of file +--- +### Дополнительная информация о DPI, источники идей +https://github.com/bol-van/zapret/blob/master/docs/readme.txt +https://geneva.cs.umd.edu/papers/geneva_ccs19.pdf +https://habr.com/ru/post/335436