Skip to content

Commit

Permalink
Update readme.txt
Browse files Browse the repository at this point in the history
  • Loading branch information
ruti committed Jul 21, 2024
1 parent c023a8d commit 2d8ada7
Showing 1 changed file with 75 additions and 94 deletions.
169 changes: 75 additions & 94 deletions readme.txt
Original file line number Diff line number Diff line change
@@ -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

Expand Down Expand Up @@ -55,21 +52,13 @@ $ 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 часов)

-T, --timeout <sec>
Таймаут ожидания первого ответа от сервера в секундах
В Linux переводится в миллисекунды, поэтому можно указать дробное число
Истечение таймаута будет обработано --auto

-K, --proto[=t,h]
Белый список протоколов: tls,http
Expand Down Expand Up @@ -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, чтобы пакет прошел через все DPI, но уничтожился по пути к серверу.
Однако некоторые серверы расположены ближе DPI и поддельные пакеты до них могут все таки дойти.
Тогда, скорее всего, сайт пришлет ошибку и разорвет соединение.
Для того, чтобы обнаружить подобные ситуации, есть опция --auto:
--fake -1 --ttl 10 --auto=cl_err,sid_inv,alert --fake -1 --ttl 6
В данном примере - если возникнет ошибка с ttl=10, то он будет уменьшен до 6-ти
Для того, чтобы фейк не дошел до сервера, есть опции ttl, ip-opt и md5sig.

Помимо 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

--auto, --hosts
которые не поддерживают полноценный стек TCP/TLS.
Из-за этого их следует использовать вместе с --auto:
--auto=torst --timeout 3 --tlsrec 3+s
В примере tlsrec будет применяться лишь в случаях, когда сброшено подключение или вышел таймаут, т.е. когда, скорее всего, произошла блокировка.
Можно наоборот - отменять tlsrec, если сервер сбрасывает подключение или откидывает пакет:
--tlsrec 3+s --auto=torst --timeout 3

---
--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

# 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
make, gcc/clang для Linux, mingw для Windows

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

0 comments on commit 2d8ada7

Please sign in to comment.