Template
1
0
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:
bol-van
2025-12-19 12:29:39 +03:00
parent 5b06f0b2a7
commit ec6e438144

View File

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