mirror of
https://github.com/bol-van/zapret2.git
synced 2026-03-19 07:45:49 +00:00
blockcheck2: check quic only hopbyhop/destopt
This commit is contained in:
143
docs/manual.md
143
docs/manual.md
@@ -59,7 +59,7 @@ conntrack отслеживает логическое направление п
|
||||
|
||||
Если для конкретного пейлоада и типа протокола потока выясняется необходимость реконструкции сообщения из нескольких пакетов, nfqws2 начинает их накапливать в связи с записью в conntrack
|
||||
и запрещает их немедленную отправку. После приема всех пакетов сообщения происходит реконструкция и при необходимости дешифровка составного пейлоада.
|
||||
Дальнейшие решения принимаются уже на базе полностью собранного пейлоада - reasm или результата сборки и дешифровки - decrypt.
|
||||
Дальнейшие решения принимаются уже на базе полностью собранного пейлоада - [reasm](#особенности-приема-многопакетных-пейлоадов) или результата сборки и дешифровки - [decrypt](#особенности-приема-многопакетных-пейлоадов).
|
||||
|
||||
Когда необходимая информация о пейлоаде получена, наступает очередь системы классификации по профилям.
|
||||
Профили содержат систему фильтров и команды действия внутри профиля.
|
||||
@@ -86,7 +86,7 @@ conntrack отслеживает логическое направление п
|
||||
desync - таблица, содержащая множество параметров обрабатываемого пакета. Прежде всего это диссект - подтаблица `dis`.
|
||||
Информация из записи conntrack - подтаблица `track`. Еще целый ряд параметров, который можно увидеть, выполнив `var_debug(desync)` или просто вызвав готовый инстанс `pktdebug`.
|
||||
|
||||
Если идет перепроигрывание задержанных пакетов (replay), LUA инстанс получает информацию о номере части, количестве частей исходного сообщения, позиции текущей части, reasm или decrypt при наличии.
|
||||
Если идет перепроигрывание задержанных пакетов ([replay](#особенности-приема-многопакетных-пейлоадов)), LUA инстанс получает информацию о номере части, количестве частей исходного сообщения, позиции текущей части, [reasm](#особенности-приема-многопакетных-пейлоадов) или [decrypt](#особенности-приема-многопакетных-пейлоадов) при наличии.
|
||||
|
||||
LUA код может использовать глобальное пространство переменных для хранения данных, не относящихся к конкретному обрабатываемому пакету. Ему доступна таблица `desync.track.lua_state`,
|
||||
в которой он может хранить любую информацию, связанную с записью conntrack. При каждом новом пакете потока в LUA выдается одна и та же таблица.
|
||||
@@ -97,7 +97,7 @@ LUA инстанс может создавать копии текущего д
|
||||
Итогом работы каждого инстанса является вердикт - VERDICT_PASS - не делать ничего с текущим диссектом, VERDICT_MODIFY - в конце всей цепочки отослать модифицированное содержимое диссекта,
|
||||
VERDICT_DROP - дропнуть текущий диссект. Вердикты всех инстансов аггрегируются - MODIFY замещает PASS, а DROP замещает и PASS, и MODIFY.
|
||||
|
||||
LUA инстанс может сам себя отключить от получения дальнейших пакетов потока по направлению in/out - это назвается instance cutoff.
|
||||
LUA инстанс может сам себя отключить от получения дальнейших пакетов потока по направлению in/out - это назвается [instance cutoff](#instance-cutoff).
|
||||
Может отключить направление in/out текущего потока от всей LUA обработки - lua cutoff.
|
||||
Может запросить отмену всей дальнейшей цепочки вызовов LUA инстансов по текущему диссекту. Инстанс, принимающий такое решение, берет на себя функцию координации дальнейших действий.
|
||||
Такой инстанс называется оркестратором. Он получает от C кода план дальнейшего выполнения со всеми фильтрами профиля и параметрами вызова всех оставшихся инстансов
|
||||
@@ -1235,7 +1235,7 @@ ipv6 extension headers и tcp options представляются в форме
|
||||
|
||||
### Особенности приема многопакетных пейлоадов
|
||||
|
||||
Сборка многопакетного пейлоада называется реасм (reasm - reassemble).
|
||||
Сборка многопакетного пейлоада называется [реасм](#особенности-приема-многопакетных-пейлоадов) (reasm - reassemble).
|
||||
Она производится автоматически C кодом, если встречен пейлоад, требующий сборки, доступен conntrack и не указан запрет на сборку через `--reasm-disable`.
|
||||
На текущий момент таких пейлоадов 2 - tls_client_hello и quic_initial. Оба могут содержать постквантовую криптографию kyber, которая не помещается в один пакет.
|
||||
|
||||
@@ -1243,9 +1243,9 @@ ipv6 extension headers и tcp options представляются в форме
|
||||
|
||||
Для quic_initial отдельные пакеты накапливается во внутреннем буфере, после чего происходит их дешифровка, обьединение и дефрагментация разбросанных по пакетам и разным смещениям частей пейлоада (так делает chrome, чтобы заставить всех не упрощать свои алгоритмы, следовать стандартам и уметь корректно собирать пейлоад по частям).
|
||||
|
||||
Пока сборка не финализирована, выполняется накопление пакетов во внутреннем буфере без вызовов LUA. Как только она финализирована, происходит перепроигрывание отдельных частей (replay). В LUA инстансы приходит диссект каждого задержанного пакета, но при этом устанавливаются поля desync.replay=true, desync.replay_piece, desync.replay_count и desync.replay_piece_last.
|
||||
Пока сборка не финализирована, выполняется накопление пакетов во внутреннем буфере без вызовов LUA. Как только она финализирована, происходит перепроигрывание отдельных частей ([replay](#особенности-приема-многопакетных-пейлоадов)). В LUA инстансы приходит диссект каждого задержанного пакета, но при этом устанавливаются поля desync.replay=true, desync.replay_piece, desync.replay_count и desync.replay_piece_last.
|
||||
|
||||
В случае стандартной tcp сборки выставляется поле desync.reasm_data, содержащее полный блок собранных данных. В desync.dis.payload по-прежнему возвращаются пейлоады отдельных перепроигрываемых пакетов. Для tcp, если нет replay, desync.reasm_data содержит копию desync.dis.payload.
|
||||
В случае стандартной tcp сборки выставляется поле desync.reasm_data, содержащее полный блок собранных данных. В desync.dis.payload по-прежнему возвращаются пейлоады отдельных перепроигрываемых пакетов. Для tcp, если нет [replay](#особенности-приема-многопакетных-пейлоадов), desync.reasm_data содержит копию desync.dis.payload.
|
||||
|
||||
При сборке quic desync.reasm_data отсутствует. Вместо него передается поле desync.decrypt_data, содержащее результат дешифровки и дефрагментации всех пейлоадов, входящих в сборку. Для quic reasm_data содержит tls_client_hello без record layer.
|
||||
|
||||
@@ -1769,7 +1769,7 @@ LUA функции получают готовый диссект текущег
|
||||
|
||||
### Работа с пейлоадами
|
||||
|
||||
#### Маркеры
|
||||
#### маркеры
|
||||
|
||||
* **Абсолютный положительный маркер** - числовое смещение внутри пейлоада.
|
||||
* **Абсолютный отрицательный маркер** - числовое смещение внутри пейлоада от следующего за концом байта. -1 указывает на последний байт.
|
||||
@@ -2332,6 +2332,8 @@ ip_id применяется только в ряде функций, оно н
|
||||
Поскольку ОС не следит за измененными ip_id, в пакетах, которые не трогали, оно может начать идти заново.
|
||||
Windows заменяет нулевые ip_id на собственную последовательность, остальные ОС - нет.
|
||||
|
||||
На любых ОС можно "держать" какое-то время сквозной линейный порядок ip_id через смесь оригинальных и генерированных пакетов. Для этого нужно применять политику ip_id=seq:ip_id_conn ко всем поддерживающим ipid desync функциям, а для остальных пейлоадов использовать связку инстансов [send](#send) с той же ip_id политикой и [drop](#drop) в ограниченном интервале [`--out-range`](#внутрипрофильные-фильтры). Слишком долго это делать не стоит, поскольку увеличит нагрузку на CPU.
|
||||
|
||||
### standard fooling
|
||||
|
||||
**fooling_options**
|
||||
@@ -2437,7 +2439,7 @@ function wsize_rewrite(dis, arg)
|
||||
## Отсылка
|
||||
|
||||
Следующие функции могут брать несколько блоков описанных выше опций, каждый из которых представлен полем параметра options.
|
||||
Во всех функциях используется `options.reconstruct` и `options.rawsend`. Они соответствуют формату параметров C функции `rawsend_dissect`.
|
||||
Во всех функциях используется [options.reconstruct](#standard-reconstruct) и (options.rawsend)[#standard-rawsend). Они соответствуют формату параметров C функции [rawsend_dissect](#rawsend).
|
||||
|
||||
### rawsend_dissect_ipfrag
|
||||
|
||||
@@ -2463,8 +2465,7 @@ ipid применяется к каждому фрагменту. Для udp с
|
||||
function rawsend_payload_segmented(desync, payload, seq, options)
|
||||
```
|
||||
|
||||
Сконструировать временный диссект на базе desync.dis с опциональным замещением пейлоада на payload
|
||||
и опциональным смещением seq, применяя options, и отослать через rawsend_dissect_segmented.
|
||||
Сконструировать временный диссект на базе desync.dis с опциональным замещением пейлоада на payload и опциональным смещением seq, применяя options, и отослать через rawsend_dissect_segmented.
|
||||
mss берется из desync.tcp_mss.
|
||||
Если options отсутствуют, они создаются на базе desync.arg.
|
||||
|
||||
@@ -2483,7 +2484,7 @@ function direction_cutoff_opposite(ctx, desync, def)
|
||||
Фильтр по направлению представляет собой строку "in", "out" или "any" и передается в desync.arg.dir. Если аргумент отсутствует, берется значение def.
|
||||
|
||||
* direction_check проверяет соответствие текущего направления фильтру.
|
||||
* direction_cutoff_opposite выполняет instance cutoff на текущее направление, если оно не соответствует фильтру.
|
||||
* direction_cutoff_opposite выполняет [instance cutoff](#instance-cutoff) на текущее направление, если оно не соответствует фильтру.
|
||||
|
||||
```
|
||||
function payload_match_filter(l7payload, l7payload_filter, def)
|
||||
@@ -2497,9 +2498,9 @@ function payload_check(desync, def)
|
||||
|
||||
## Работа с многопакетными пейлоадам
|
||||
|
||||
Обычно идет работа с целым reasm, вместо отдельных его частей. В этом и есть смысл сборки, чтобы не копаться в отдельных пакетах, а разбираться со всем сообщением сразу.
|
||||
Обычно идет работа с целым [reasm](#особенности-приема-многопакетных-пейлоадов), вместо отдельных его частей. В этом и есть смысл сборки, чтобы не копаться в отдельных пакетах, а разбираться со всем сообщением сразу.
|
||||
|
||||
Стандартный сценарий предполагает работу после приема первой части replay и игнорирование, либо drop остальных частей. Выбор между игнорированием или drop может зависеть от успешности действий с reasm. Например, удалось или не удалось отправить reasm сегментированно. Если удалось - нужно дропнуть все остальные части, потому что иначе они пойдут дублями в оригинальной сегментации. Если возникла какая-то ошибка, сегментированные пакеты отправить не удалось, и при этом дроппнуть все остальное, до адресата не дойдет полное сообщение, начнутся ретрансмиссии, поэтому лучше оставить как есть - так хоть ничего не поломается.
|
||||
Стандартный сценарий предполагает работу после приема первой части [replay](#особенности-приема-многопакетных-пейлоадов) и игнорирование, либо drop остальных частей. Выбор между игнорированием или drop может зависеть от успешности действий с [reasm](#особенности-приема-многопакетных-пейлоадов). Например, удалось или не удалось отправить [reasm](#особенности-приема-многопакетных-пейлоадов) сегментированно. Если удалось - нужно дропнуть все остальные части, потому что иначе они пойдут дублями в оригинальной сегментации. Если возникла какая-то ошибка, сегментированные пакеты отправить не удалось, и при этом дроппнуть все остальное, до адресата не дойдет полное сообщение, начнутся ретрансмиссии, поэтому лучше оставить как есть - так хоть ничего не поломается.
|
||||
|
||||
```
|
||||
function replay_first(desync)
|
||||
@@ -2507,24 +2508,22 @@ function replay_drop_set(desync, v)
|
||||
function replay_drop(desync)
|
||||
```
|
||||
|
||||
* replay_first возвращает true, если текущий диссект не является replay или является его первой частью
|
||||
* replay_drop_set помечает в desync.track.lua_state boolean признак необходимости "v" дропнуть последующие части replay
|
||||
* replay_drop возвращает true, если необходимо дропнуть текущую часть replay. Если часть последняя - автоматически снимает признак.
|
||||
* replay_first возвращает true, если текущий диссект не является [replay](#особенности-приема-многопакетных-пейлоадов) или является его первой частью
|
||||
* replay_drop_set помечает в desync.track.lua_state boolean признак необходимости "v" дропнуть последующие части [replay](#особенности-приема-многопакетных-пейлоадов)
|
||||
* replay_drop возвращает true, если необходимо дропнуть текущую часть [replay](#особенности-приема-многопакетных-пейлоадов). Если часть последняя - автоматически снимает признак.
|
||||
|
||||
Функции работают корректно как с реплеем, так и обычными диссектами. Для обычных диссектов replay_first всегда true, replay_drop_set не меняет признак, replay_drop всегда false.
|
||||
Функции работают корректно как с [реплеем](#особенности-приема-многопакетных-пейлоадов), так и обычными диссектами. Для обычных диссектов replay_first всегда true, replay_drop_set не меняет признак, replay_drop всегда false.
|
||||
|
||||
## Оркестрация
|
||||
|
||||
В эту группу функций входят функции поддержки процесса оркестрации и прокладки.
|
||||
Прокладки - это дублеры функций C кода для ситуации, когда у нас нет контекста ctx для связи с C кодом.
|
||||
После начала оркестрации все дальнейшие инстансы вызываются оркестратором или вложенными оркестраторами.
|
||||
Последний ctx, который доступен, это ctx первого оркестратора. Если его передавать другим инстансам,
|
||||
они будут действовать от имени оркестратора, а не от своего, поэтому им следует передавать ctx=nil.
|
||||
После отмены execution plan C код не обслуживает последующие инстансы и не выдает на них ctx. Поэтому если нужно продолжить
|
||||
выполнение в стандартном стиле, необходимы дублирующие механизмы instance cutoff и фильтров range и payload.
|
||||
Последний ctx, который доступен, это ctx первого оркестратора. Если его передавать другим инстансам, они будут действовать от имени оркестратора, а не от своего, поэтому им следует передавать ctx=nil.
|
||||
После отмены execution plan C код не обслуживает последующие инстансы и не выдает на них ctx. Поэтому если нужно продолжить выполнение в стандартном стиле, необходимы дублирующие механизмы [instance cutoff](#instance-cutoff) и фильтров range и payload.
|
||||
|
||||
Чтобы функции `--lua-desync` прозрачно работали под оркестрацией, необходимо использовать стандартные прокладки вместо прямых вызовов C функций,
|
||||
берущих ctx. Чтобы корректно работали вложенные оркестраторы, нужно придерживаться стандартной схемы хранения execution plan в desync.plan
|
||||
берущих ctx. Чтобы корректно работали вложенные оркестраторы, нужно придерживаться стандартной схемы хранения [execution plan](#execution_plan) в desync.plan
|
||||
и пользоваться описанными ниже функциями-хелперами.
|
||||
|
||||
По сухому описанию может быть сложно понять как работает оркестрация. Рекомендуется изучить код реальных оркестраторов,
|
||||
@@ -2536,7 +2535,7 @@ function replay_drop(desync)
|
||||
function instance_cutoff_shim(ctx, desync, dir)
|
||||
```
|
||||
|
||||
Выполняет обычный instance cutoff по направлению dir, если ctx присутствует, иначе cutoff через дублирующий механизм,
|
||||
Выполняет обычный [instance cutoff](#instance-cutoff) по направлению dir, если ctx присутствует, иначе cutoff через дублирующий механизм,
|
||||
состояние которого хранится в desync.track.lua_state. dir = true - исходящее направление, dir = false - входящее, dir = nil - оба направления.
|
||||
|
||||
### cutoff_shim_check
|
||||
@@ -2545,7 +2544,7 @@ function instance_cutoff_shim(ctx, desync, dir)
|
||||
function cutoff_shim_check(desync)
|
||||
```
|
||||
|
||||
Проверяет состояние instance cutoff для desync.func_instance по направлению desync.outgoing.
|
||||
Проверяет состояние [instance cutoff](#instance-cutoff) для desync.func_instance по направлению desync.outgoing.
|
||||
|
||||
### apply_arg_prefix
|
||||
|
||||
@@ -2561,9 +2560,9 @@ function apply_arg_prefix(desync)
|
||||
function apply_execution_plan(desync, instance)
|
||||
```
|
||||
|
||||
Копирует в desync идентификацию инстанса и его аргументы из элемента execution plan `instance`,
|
||||
Копирует в desync идентификацию инстанса и его аргументы из элемента [execution plan](#execution_plan) `instance`,
|
||||
тем самым воссоздает состояние desync, как если бы `instance` был вызван напрямую C кодом.
|
||||
execution plan выдается C функцией `execution_plan()` как массив, элементами которого являются `instance`.
|
||||
[execution plan](#execution_plan) выдается C функцией `execution_plan()` как массив, элементами которого являются `instance`.
|
||||
|
||||
### verdict_aggregate
|
||||
|
||||
@@ -2579,7 +2578,7 @@ function verdict_aggregate(v1, v2)
|
||||
function plan_instance_execute(desync, verdict, instance)
|
||||
```
|
||||
|
||||
Выполняет элемент execution plan `instance` с учетом instance cutoff и стандартных фильтров payload и range.
|
||||
Выполняет элемент [execution plan](#execution_plan) `instance` с учетом [instance cutoff](#instance-cutoff) и стандартных фильтров [payload](#внутрипрофильные-фильтры) и [range](#внутрипрофильные-фильтры).
|
||||
Возвращает аггрегацию verdict и вердикта `instance`.
|
||||
|
||||
### plan_instance_pop
|
||||
@@ -2588,7 +2587,7 @@ function plan_instance_execute(desync, verdict, instance)
|
||||
function plan_instance_pop(desync)
|
||||
```
|
||||
|
||||
Берет, удаляет и возвращает первый элемент execution plan из desync.plan. Если элементов нет - возвращает nil.
|
||||
Берет, удаляет и возвращает первый элемент [execution plan](#execution_plan) из desync.plan. Если элементов нет - возвращает nil.
|
||||
|
||||
### plan_clear
|
||||
|
||||
@@ -2596,7 +2595,7 @@ function plan_instance_pop(desync)
|
||||
function plan_clear(desync)
|
||||
```
|
||||
|
||||
Очищает execution plan в desync.plan - удаляет все `instance`.
|
||||
Очищает [execution plan](#execution_plan) в desync.plan - удаляет все `instance`.
|
||||
|
||||
### orchestrate
|
||||
|
||||
@@ -2604,7 +2603,7 @@ function plan_clear(desync)
|
||||
function orchestrate(ctx, desync)
|
||||
```
|
||||
|
||||
Если оркестратор - первый, т.е. присутствует ctx, забирает execution plan и помещает его в desync.plan, а потом выполняет `execution_plan_cancel()`.
|
||||
Если оркестратор - первый, т.е. присутствует ctx, забирает [execution plan](#execution_plan) и помещает его в desync.plan, а потом выполняет `execution_plan_cancel()`.
|
||||
Если ctx=nil - не делает ничего. Считается, что план уже находится в desync.plan.
|
||||
|
||||
### replay_execution_plan
|
||||
@@ -2613,7 +2612,7 @@ function orchestrate(ctx, desync)
|
||||
function replay_execution_plan(desync)
|
||||
```
|
||||
|
||||
Выполняет весь execution plan из desync.plan с учетом instance cutoff и стандартных фильтров payload и range.
|
||||
Выполняет весь [execution plan](#execution_plan) из desync.plan с учетом [instance cutoff](#instance-cutoff) и стандартных фильтров [payload](#внутрипрофильные-фильтры) и [range](#внутрипрофильные-фильтры).
|
||||
|
||||
|
||||
# Библиотека программ атаки на DPI zapret-antidpi.lua
|
||||
@@ -2734,7 +2733,7 @@ function wsize(ctx, desync)
|
||||
* arg: wsize - размер tcp окна
|
||||
* arg: scale - scaling фактор. заменяется в tcp option, если есть. только уменьшение, увеличение блокируется
|
||||
|
||||
Меняет tcp.th_win и/или scaling factor в tcp оцпии в tcp пакете SYN,ACK, после чего выполняет instance cutoff. Если изменение выполнено - выставляет VERDICT_MODIFY.
|
||||
Меняет tcp.th_win и/или scaling factor в tcp оцпии в tcp пакете SYN,ACK, после чего выполняет [instance cutoff](#instance-cutoff). Если изменение выполнено - выставляет VERDICT_MODIFY.
|
||||
|
||||
Цель техники - подменить window size со стороны клиента или сервера, чтобы в ответ на это клиент отослал следующий пакет частями, поскольку целиком он не влезает в window size. Может приводить к замедлению. Устаревшая техника, рекомендуется применять только с сервера в крайнем случае для работы по клиентам, которые не делают ничего для обхода блокировки. С клиента лучше применять техники tcp сегментации, поскольку они лишены побочных эффектов в виде замедления скорости и имеют больше возможностей.
|
||||
|
||||
@@ -2747,12 +2746,12 @@ function wssize(ctx, desync)
|
||||
* arg: [standard direction](#standard-direction)
|
||||
* arg: wsize - размер tcp окна
|
||||
* arg: scale - scaling фактор. заменяется в tcp option, если есть. только уменьшение, увеличение блокируется
|
||||
* arg: forced_cutoff - список типов пейлоадов через зяпятую, при получении которых выполняется instance cutoff. Если нужно применять wssize бесконечно, можно указать forced_cutoff=no, то есть несуществующий тип пейлоада, который не придет никогда.
|
||||
* arg: forced_cutoff - список типов пейлоадов через зяпятую, при получении которых выполняется [instance cutoff](#instance-cutoff). Если нужно применять wssize бесконечно, можно указать forced_cutoff=no, то есть несуществующий тип пейлоада, который не придет никогда.
|
||||
|
||||
Меняет tcp.th_win и/или scaling factor в tcp оцпии во всех tcp пакетах потока по направлению до достижения условия "cutoff".
|
||||
Если изменение выполнено - выставляет VERDICT_MODIFY.
|
||||
"cutoff" наступает при получении любого пакета с данными, если аргумент forced_cutoff не задан, или при получении одного из указанных в аргументе forced_cutoff пейлоадов.
|
||||
В этом случае выполняется instance cutoff.
|
||||
В этом случае выполняется [instance cutoff](#instance-cutoff).
|
||||
|
||||
Цель техники - заставить сервер фрагментировать свои ответы, когда DPI их проверяет (TLS 1.2).
|
||||
Нужно держать сервер "в тонусе", чтобы он думал, что клиент не может принимать tcp сегменты большого размера и сам резал свои ответы,
|
||||
@@ -2783,11 +2782,11 @@ function syndata(ctx, desync)
|
||||
* arg: [standard ipfrag](#standard-ipfrag)
|
||||
* arg: [standard reconstruct](#standard-reconstruct)
|
||||
* arg: [standard rawsend](#standard-rawsend)
|
||||
* arg: blob - blob, содержащий фейковый payload. Должен помещаться в один пакет, сегментация невозможна.
|
||||
* arg: blob - [blob](#передача-блобов), содержащий фейковый payload. Должен помещаться в один пакет, сегментация невозможна.
|
||||
* arg: tls_mod - применить указанный tls_mod к пейлоаду blob
|
||||
|
||||
Функция добавляет в tcp SYN пакет пейлоад, применяет к нему модификации и отправляет вместо оригинала, вынося VERDICT_DROP.
|
||||
Если проходит пакет без SYN, выполняется instance cutoff.
|
||||
Если проходит пакет без SYN, выполняется [instance cutoff](#instance-cutoff).
|
||||
Таким образом воздействие выполняется на все ретрансмиссии SYN, после чего функция прекращает работу.
|
||||
Является стратегией нулевой фазы, которая работает с хостлистами только в режиме `--ipcache-hostname`.
|
||||
|
||||
@@ -2843,17 +2842,17 @@ function multisplit(ctx, desync)
|
||||
* arg: [standard ipfrag](#standard-ipfrag)
|
||||
* arg: [standard reconstruct](#standard-reconstruct)
|
||||
* arg: [standard rawsend](#standard-rawsend)
|
||||
* arg: pos - список через запятую позиционных маркеров - точек разреза. По умолчанию "2".
|
||||
* arg: pos - список [маркеров](#маркеры) через запятую - точек разреза. По умолчанию "2".
|
||||
* arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window
|
||||
* arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00
|
||||
* arg: blob - заменить текущий пейлоад на указанный blob
|
||||
* arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00
|
||||
* arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов)
|
||||
* arg: nodrop - отказ от вынесения VERDICT_DROP
|
||||
* payload фильтр по умолчанию - "known"
|
||||
|
||||
Multisplit реализует последовательную сегментацию текущего диссекта или реасма с разрезом в определяемых списком маркеров позициях. Опционально поддерживается замена блока данных на произвольный blob и техника seqovl.
|
||||
Multisplit реализует последовательную сегментацию текущего диссекта или [реасма](#особенности-приема-многопакетных-пейлоадов) с разрезом в определяемых списком [маркеров](#маркеры) позициях. Опционально поддерживается замена блока данных на произвольный [blob](#передача-блобов) и техника seqovl.
|
||||
Выносится VERDICT_DROP после успешной отправки всех сегментов, если не указано "nodrop".
|
||||
|
||||
Если происходит перепроигрывание (replay) задержанных пакетов и присутствует reasm, то вместо desync.dis.payload берется desync.reasm_data. Нарезание проиходит только при перепроигрывании первой части reasm, по остальным частям выносится VERDICT_DROP, если отсылка была успешна и не указано "nodrop". Поскольку весь reasm уже отправлен нарезанным, нет смысла повторно отправлять его оригинальные части.
|
||||
Если происходит перепроигрывание ([replay](#особенности-приема-многопакетных-пейлоадов)) задержанных пакетов и присутствует [reasm](#особенности-приема-многопакетных-пейлоадов), то вместо desync.dis.payload берется desync.reasm_data. Нарезание происходит только при перепроигрывании первой части [reasm](#особенности-приема-многопакетных-пейлоадов), по остальным частям выносится VERDICT_DROP, если отсылка была успешна и не указано "nodrop". Поскольку весь [reasm](#особенности-приема-многопакетных-пейлоадов) уже отправлен нарезанным, нет смысла повторно отправлять его оригинальные части.
|
||||
|
||||
Может использоваться для отправки произвольных данных, в том числе фейков с заменой текущего пейлоада на произвольный blob.
|
||||
|
||||
@@ -2878,14 +2877,14 @@ function multidisorder(ctx, desync)
|
||||
* arg: [standard ipfrag](#standard-ipfrag)
|
||||
* arg: [standard reconstruct](#standard-reconstruct)
|
||||
* arg: [standard rawsend](#standard-rawsend)
|
||||
* arg: pos - список через запятую позиционных маркеров - точек разреза. По умолчанию "2".
|
||||
* arg: pos - список [маркеров](#маркеры) через запятую - точек разреза. По умолчанию "2".
|
||||
* arg: seqovl - маркер - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево
|
||||
* arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00
|
||||
* arg: blob - заменить текущий пейлоад на указанный blob
|
||||
* arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00
|
||||
* arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов)
|
||||
* arg: nodrop - отказ от вынесения VERDICT_DROP
|
||||
* payload фильтр по умолчанию - "known"
|
||||
|
||||
Аналогично multisplit, но отправка сегментов производится в обратном порядке - с последнего по первый.
|
||||
Аналогично [multisplit](#multisplit), но отправка сегментов производится в обратном порядке - с последнего по первый.
|
||||
|
||||
Техника seqovl в данном случае работает иначе. Она применятся ко второму в оригинальной очередности (предпоследнему отсылаемому) сегменту. seqovl может быть маркером. Например, можно сделать разрез по midsld, а seqovl сделать "midsld-1". seqovl обязательно должен быть меньше первого сегмента в оригинальной очередности (последнего отсылаемого), иначе эта ситуация распознается и seqovl отменяется.
|
||||
|
||||
@@ -2907,13 +2906,13 @@ function fakedsplit(ctx, desync)
|
||||
* arg: [standard ipid](#standard-ipid)
|
||||
* arg: [standard reconstruct](#standard-reconstruct)
|
||||
* arg: [standard rawsend](#standard-rawsend)
|
||||
* arg: pos - один позиционный маркер - точка разреза. По умолчанию "2".
|
||||
* arg: pos - один [маркер](#маркеры) - точка разреза. По умолчанию "2".
|
||||
* arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window
|
||||
* arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00
|
||||
* arg: blob - заменить текущий пейлоад на указанный blob
|
||||
* arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00
|
||||
* arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов)
|
||||
* arg: nodrop - отказ от вынесения VERDICT_DROP
|
||||
* arg: nofake1, nofake2, nofake3, nofake4 - отказ от отсылки отдельных фейков
|
||||
* arg: pattern - blob, которым заполняются фейковые части. По умолчанию 0x00.
|
||||
* arg: pattern - [blob](#передача-блобов), которым заполняются фейковые части. По умолчанию 0x00.
|
||||
* payload фильтр по умолчанию - "known"
|
||||
|
||||
Функция работает аналогично multisplit с одной позицией разреза, но с замешиванием фейков между реальными сегментами. Фейки совпадают в размерах с отсылаемыми частями и формируются на базе pattern со смещением, которое соответствует смещению tcp sequence отсылаемой части относительно первой.
|
||||
@@ -2935,7 +2934,7 @@ function fakedsplit(ctx, desync)
|
||||
* ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов.
|
||||
|
||||
В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop".
|
||||
blob позволяет заменить текущией пейлоад на произвольный блоб, и тем самым отослать любой совместимый пейлоад с тем же разбиением.
|
||||
[blob](#передача-блобов) позволяет заменить текущией пейлоад на произвольный [blob](#передача-блобов), и тем самым отослать любой совместимый пейлоад с тем же разбиением.
|
||||
|
||||
### fakeddisorder
|
||||
|
||||
@@ -2949,13 +2948,13 @@ function fakeddisorder(ctx, desync)
|
||||
* arg: [standard ipid](#standard-ipid)
|
||||
* arg: [standard reconstruct](#standard-reconstruct)
|
||||
* arg: [standard rawsend](#standard-rawsend)
|
||||
* arg: pos - один позиционный маркер - точка разреза. По умолчанию "2".
|
||||
* arg: seqovl - маркер - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево
|
||||
* arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00
|
||||
* arg: blob - заменить текущий пейлоад на указанный blob
|
||||
* arg: pos - один [маркер](#маркеры) - точка разреза. По умолчанию "2".
|
||||
* arg: seqovl - [маркер](#маркеры) - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево
|
||||
* arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00
|
||||
* arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов)
|
||||
* arg: nodrop - отказ от вынесения VERDICT_DROP
|
||||
* arg: nofake1, nofake2, nofake3, nofake4 - отказ от отсылки отдельных фейков
|
||||
* arg: pattern - blob, которым заполняются фейковые части. По умолчанию 0x00.
|
||||
* arg: pattern - [blob](#передача-блобов), которым заполняются фейковые части. По умолчанию 0x00.
|
||||
* payload фильтр по умолчанию - "known"
|
||||
|
||||
Функция работает аналогично multidisorder с одной позицией разреза, но с замешиванием фейков между реальными сегментами. Фейки совпадают в размерах с отсылаемыми частями и формируются на базе pattern со смещением, которое соответствует смещению tcp sequence отсылаемой части относительно первой.
|
||||
@@ -2977,7 +2976,7 @@ function fakeddisorder(ctx, desync)
|
||||
* ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов.
|
||||
|
||||
В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop".
|
||||
blob позволяет заменить текущией пейлоад на произвольный блоб, и тем самым отослать любой совместимый пейлоад с тем же разбиением.
|
||||
[blob](#передача-блобов) позволяет заменить текущией пейлоад на произвольный [blob](#передача-блобов), и тем самым отослать любой совместимый пейлоад с тем же разбиением.
|
||||
|
||||
### hostfakesplit
|
||||
|
||||
@@ -2991,17 +2990,17 @@ function hostfakesplit(ctx, desync)
|
||||
* arg: [standard ipid](#standard-ipid)
|
||||
* arg: [standard reconstruct](#standard-reconstruct)
|
||||
* arg: [standard rawsend](#standard-rawsend)
|
||||
* arg: host - шаблон для генерации фейкового хоста - random.template
|
||||
* arg: midhost - маркер для дополнительного разреза сегмента с реальным хостом
|
||||
* arg: disorder_after - маркер для дополнительного разреза заключительной реальной части и отправки сегментов в обратном порядке
|
||||
* arg: host - шаблон для [генерации фейкового хоста](#genhost) - random.template
|
||||
* arg: midhost - [маркер](#маркеры) для дополнительного разреза сегмента с реальным хостом
|
||||
* arg: disorder_after - [маркер](#маркеры) для дополнительного разреза заключительной реальной части и отправки сегментов в обратном порядке
|
||||
* arg: nofake, nofake2 - отказ от отсылки отдельных фейков
|
||||
* arg: blob - заменить текущий пейлоад на указанный blob
|
||||
* arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов)
|
||||
* arg: nodrop - отказ от вынесения VERDICT_DROP
|
||||
* payload фильтр по умолчанию - "known"
|
||||
|
||||
Это специальный "резатель" с замешиванием фейков для пейлоадов, в которых присутствует имя хоста - http_req и tls_client_hello.
|
||||
Двумя основными точкам разреза являются начало имени хоста - маркер "host" и конец имени хоста - маркер "endhost". Дополнительными и опциональными точками разреза являются маркер midhost (должен быть в пределах host..endost) и маркер disorder_after (должен быть больше endhost). При разрезе по disorder_after части отправляются в обратном порядке.
|
||||
Для фейков необходим фулинг, чтобы они не были приняты сервером.
|
||||
Двумя основными точкам разреза являются начало имени хоста - [маркер](#маркеры) "host" и конец имени хоста - [маркер](#маркеры) "endhost". Дополнительными и опциональными точками разреза являются [маркер](#маркеры) midhost (должен быть в пределах host..endost) и [маркер](#маркеры) disorder_after (должен быть больше endhost). При разрезе по disorder_after части отправляются в обратном порядке.
|
||||
Для фейков необходим [фулинг](#standard-fooling), чтобы они не были приняты сервером.
|
||||
|
||||
Последовательность отсылки :
|
||||
|
||||
@@ -3016,7 +3015,7 @@ function hostfakesplit(ctx, desync)
|
||||
* ipid_opts и rawsend_opts применяются и к фейкам, и к оригиналом. ipfrag_opts не задействуются ни для фейков, ни для оригиналов.
|
||||
|
||||
В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop".
|
||||
blob позволяет заменить текущией пейлоад на произвольный блоб, и тем самым отослать любой совместимый пейлоад с тем же разбиением.
|
||||
[blob](#передача-блобов) позволяет заменить текущией пейлоад на произвольный [blob](#передача-блобов), и тем самым отослать любой совместимый пейлоад с тем же разбиением.
|
||||
|
||||
### tcpseg
|
||||
|
||||
@@ -3031,15 +3030,15 @@ function tcpseg(ctx, desync)
|
||||
* arg: [standard ipfrag](#standard-ipfrag)
|
||||
* arg: [standard reconstruct](#standard-reconstruct)
|
||||
* arg: [standard rawsend](#standard-rawsend)
|
||||
* arg: pos - список из двух маркеров, определяющий границы tcp сегмента
|
||||
* arg: pos - список из двух [маркеров](#маркеры), определяющий границы tcp сегмента
|
||||
* arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window
|
||||
* arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00
|
||||
* arg: blob - заменить текущий пейлоад на указанный blob
|
||||
* arg: seqovl_pattern - [blob](#передача-блобов), используемый для заполнения seqovl. По умолчанию 0x00
|
||||
* arg: blob - заменить текущий пейлоад на указанный [blob](#передача-блобов)
|
||||
* payload фильтр по умолчанию - "known"
|
||||
|
||||
Отсылает часть текущего диссекта, реасма, или произвольного blob, ограниченную двумя маркерами pos с опциональным применением техники seqovl таким же способом, как и в multisplit. Дополнительная сегментация при превышении MSS производится автоматически.
|
||||
Отсылает часть текущего диссекта, [реасма](#особенности-приема-многопакетных-пейлоадов), или произвольного blob, ограниченную двумя [маркерами](#маркеры) pos с опциональным применением техники seqovl таким же способом, как и в [multisplit](#multisplit). Дополнительная сегментация при превышении MSS производится автоматически.
|
||||
|
||||
В случае reasm работает только при приеме его первой части (т.к. работает целиком по reasm, а не отдельным его частям).
|
||||
В случае [reasm](#особенности-приема-многопакетных-пейлоадов) работает только при приеме его первой части (т.к. работает целиком по reasm, а не отдельным его частям).
|
||||
|
||||
Вердикт не выносится.
|
||||
|
||||
@@ -3064,7 +3063,7 @@ function udplen(ctx, desync)
|
||||
* arg: min - не трогать пакеты с длиной L4 пейлоада меньше
|
||||
* arg: max - не трогать пакеты с длиной L4 пейлоада больше
|
||||
* arg: increment - на сколько увеличить (+) или уменьшить (-) длину L4 пейлоада
|
||||
* arg: pattern - blob, которым заполняется конец пакета при увеличении длины
|
||||
* arg: pattern - [blob](#передача-блобов), которым заполняется конец пакета при увеличении длины
|
||||
* arg: pattern_offset - начальное смещение внутри pattern
|
||||
* payload фильтр по умолчанию - "known"
|
||||
|
||||
@@ -3079,7 +3078,7 @@ function dht_dn(ctx, desync)
|
||||
* arg: [standard direction](#standard-direction)
|
||||
* arg: dn - число N, следующее после 'd' в сообщении dht
|
||||
|
||||
dht использует формат bencode для передачи сообщений. 'd' - это тип данных dictionary. Сообщения dht как правило начинаются с 'd1' или 'd2' и заканчиваются 'e' (end). В некоторых DPI прописаны именно такие сигнатуры - только 'd1' или 'd1'+'d2'. Но можно поставить и 'd3', 'd4', ..., если корректно отредактировать содержимое, не нарушив формат bencode. Этим и занимается данная функция. Работает только по пейлоаду с типом "dht".
|
||||
dht использует формат bencode для передачи сообщений. 'd' - это тип данных directory. Сообщения dht как правило начинаются с 'd1' или 'd2' и заканчиваются 'e' (end). В некоторых DPI прописаны именно такие сигнатуры - только 'd1' или 'd1'+'d2'. Но можно поставить и 'd3', 'd4', ..., если корректно отредактировать содержимое, не нарушив формат bencode. Этим и занимается данная функция. Работает только по пейлоаду с типом "dht".
|
||||
|
||||
|
||||
## Другие функции
|
||||
@@ -3094,7 +3093,7 @@ function synack(ctx, desync)
|
||||
* arg: [standard reconstruct](#standard-reconstruct)
|
||||
* arg: [standard rawsend](#standard-rawsend)
|
||||
|
||||
Отсылает перед SYN пакет SYN,ACK, чтобы запутать DPI относительно направления IP соединения. Атака называется в литературе "TCB turnaround". Ломает NAT - через NAT применение невозможно. Применение на проходящем трафике требует nftables и режим POSTNAT. После прохода пакета без SYN выполняет instance cutoff. Вердикт не выносит.
|
||||
Отсылает перед SYN пакет SYN,ACK, чтобы запутать DPI относительно направления IP соединения. Атака называется в литературе "TCB turnaround". Ломает NAT - через NAT применение невозможно. Применение на проходящем трафике требует nftables и режим POSTNAT. После прохода пакета без SYN выполняет [instance cutoff](#instance-cutoff). Вердикт не выносит.
|
||||
|
||||
### synack_split
|
||||
|
||||
@@ -3107,7 +3106,7 @@ function synack_split(ctx, desync)
|
||||
* arg: [standard rawsend](#standard-rawsend)
|
||||
* arg: mode - "syn", "synack" или "acksyn"
|
||||
|
||||
Методика предназначена для серверов. В литературе имеет название "TCP split handshake". Заменяет исходящий от сервера пакет SYN,ACK на SYN, 2 пакета SYN + ACK или 2 пакета ACK + SYN. В случае успеха отсылки выносит VERDICT_DROP. После прохода пакета без SYN,ACK выполняет instance cutoff.
|
||||
Методика предназначена для серверов. В литературе имеет название "TCP split handshake". Заменяет исходящий от сервера пакет SYN,ACK на SYN, 2 пакета SYN + ACK или 2 пакета ACK + SYN. В случае успеха отсылки выносит VERDICT_DROP. После прохода пакета без SYN,ACK выполняет [instance cutoff](#instance-cutoff).
|
||||
|
||||
Многие DPI ожидают стандартный ответ на SYN в виде SYN,ACK. В реальности получается, что ответ на SYN является тоже SYN, а потом клиент шлет серверу SYN,ACK. Тем самым DPI перестает понимать какая сторона является клиентом, а какая сервером, и алгоритм проверки дает сбой. Атака может сработать даже если клиент не делает ничего для обхода блокировки. Может использоваться совместно с клиентскими техниками для точечного пробития tcp.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user