diff --git a/docs/manual.md b/docs/manual.md index 2933532..85c74a4 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -1424,6 +1424,8 @@ function bitset(u32, bit_from, bit_to, set) При операциях с числями без знака всегда важна разрядность. От нее зависит результат. Поэтому все функции имеют в своем названии разрядность. При передаче аргументов, выходящих за пределы разрядности, вызывается error. +#### uX + ``` function u8(raw_string, offset) function u16(raw_string, offset) @@ -1435,6 +1437,8 @@ function u32(raw_string, offset) offset - номер байта от начала raw строки, начиная с 1. Аналогичные встроенные средства (string.unpack) есть только в LUA 5.3. +#### buX + ``` function bu8(u8) function bu16(u16) @@ -1445,11 +1449,15 @@ function bu32(u32) Преобразуют число в raw строку в формате big endian. Чтобы собрать структуру из числовых полей, можно использовать обычную операцию конкатенации строк `..` +#### swapX + ``` function swap16(u16) function swap32(u32) ``` +#### uXadd + Инвертируют порядок следования байт в u16 или u32. Если в вашей структуре порядок байт little endian, можно использовать uX/buX + swap. @@ -1466,6 +1474,8 @@ function u32add(u32_1, u32_2, ...., u32_N) ### Целочисленное деление +#### divint + Встроенное целочисленное деление есть только в LUA 5.3+, где есть тип данных integer. Чтобы не возиться с округлением, целочисленное деление реализовано C функцией : @@ -1478,6 +1488,8 @@ function divint(dividend, divisor) ### Генерация случайных данных +#### brandom + Функции генерируют raw строку указанного размера , состоящую из случайных байт. Случайные данные не являются криптографически стойкими. ``` @@ -1492,6 +1504,8 @@ function brandom_az09(size) ### Парсинг +#### parse_hex + ``` function parse_hex(hex_string) ``` @@ -1508,18 +1522,24 @@ function parse_hex(hex_string) nfqws2 не использует никакие криптобиблиотеки, но имеет минимальный набор криптографических операций для работы с некоторыми протоколами (QUIC). Эти функции выставляются в LUA и могут использоваться для любых целей. +#### bcryptorandom + ``` function bcryptorandom(size) ``` Генерирует raw строку - криптографически стойкий блок случайных данных указанного размера. Источник - `/dev/random` +#### hash + ``` function hash(hash_type, data) ``` Возвращает raw строку - hash от блока данных - raw строки data. hash_type может быть "sha256" или "sha224". +#### aes + ``` function aes(encrypt, key, data) ``` @@ -1531,6 +1551,8 @@ function aes(encrypt, key, data) * возвращается raw строка 16 байт с результатом операции * в случае неверных размеров key или data вызывается error +#### aes_gcm + ``` function aes_gcm(encrypt, key, iv, data, associated_data) ``` @@ -1544,6 +1566,8 @@ function aes_gcm(encrypt, key, iv, data, associated_data) * возвращается 2 значения : raw строка - блок шифрованных данных и raw строка atag (authentication tag). atag может быть передан вместе с шифрованным сообщением, iv и associated_data для проверки их целостности. * в случае неверных размеров key или iv вызывается error +#### aes_ctr + ``` function aes_ctr(key, iv, data) ``` @@ -1555,6 +1579,8 @@ function aes_ctr(key, iv, data) * возвращается raw строка - блок шифрованных данных * в случае неверных размеров key или iv вызывается error +#### hkdf + ``` function hkdf(hash_type, salt, ikm, info, okm_len) ``` @@ -1571,6 +1597,8 @@ HKDF - HMAC-based Key Derivation Function. Генератор ключей на ### Системные функции +#### uname + ``` function uname() ``` @@ -1578,6 +1606,7 @@ HKDF - HMAC-based Key Derivation Function. Генератор ключей на Возвращает то же самое, что и команда uname в shell - название ядра ОС. "Linux", "FreeBSD", "OpenBSD". В Windows возвращается строка, начинающаяся с "CYGWIN", далее следует версия. +#### clock_gettime ``` function clock_gettime() @@ -1585,6 +1614,8 @@ HKDF - HMAC-based Key Derivation Function. Генератор ключей на Узнать точное время. Возвращает 2 значения - unixtime в секундах и наносекунды. Встроенная функция `os.time()` не выдает наносекунды. +#### getpid + ``` function getpid() function gettid() @@ -1599,6 +1630,8 @@ HKDF - HMAC-based Key Derivation Function. Генератор ключей на В следующих функциях будут использоваться стандартные наборы опций - rawsend и reconstruct. Они представляют собой таблицы со специфическими полями. Если nil, считается, что ни одно поле не задано. +#### standard reconstruct + Опции реконструкции диссектов - reconstruct_opts. Реконструкция - это сборка raw пакета из диссекта. | Поле | Тип | Описание | |:------|:----|:---------| @@ -1622,6 +1655,8 @@ badsum вынесен в реконструкцию, поскольку чекс Поэтому по отдельным частям гарантированно испортить чексумму невозможно. Что бы вы туда не вписали, существует маленькая вероятность (1/65536), что она окажется верной. +#### standard rawsend + Опции отсылки raw пакетов - rawsend_opts | Поле | Тип | Описание | |:------|:----|:---------| @@ -1646,6 +1681,8 @@ repeats шлют бинарно идентичный пакет указанно Диссекция - процесс получения структурированного представления raw ip пакета. Реконструкция - обратный процесс - получение raw ip из диссекта. +#### dissect + ``` function dissect(raw_ip) ``` @@ -1654,6 +1691,8 @@ function dissect(raw_ip) Это та же самая операция, что происходит автоматически до вызова desync функций по профилю. Они получают уже готовый диссект. +#### reconstruct_dissect + ``` function reconstruct_dissect(dissect, reconstruct_opts) ``` @@ -1673,6 +1712,8 @@ ip6.ip6_len должен быть рассчитан таким, каким он Если C код видит признаки необходимости фрагментации, он проверяет корректность рассчитанных длин и смещений, и если они корректны, после реконструкции сдвигает содержимое raw пакета в буфере реконструкции, чтобы получился фрагмент с нужными данными. +#### reconstruct_hdr + ``` function reconstruct_tcphdr(tcp) function reconstruct_udphdr(udp) @@ -1685,6 +1726,8 @@ function reconstruct_ip6hdr(ip6, reconstruct_opts) * чексумма ip header считается автоматически, поскольку ни от чего больше не зависит * чексуммы tcp и udp не считаются, поскольку зависят от других компонент +#### csum_fix + ``` function csum_ip4_fix(raw_ipv4_header) function csum_tcp_fix(raw_ip_header, raw_tcp_header, payload) @@ -1703,6 +1746,8 @@ csum_ip4_fix вам наверняка понадобится. ### Прием и отсылка пакетов +#### rawsend + ``` function rawsend(raw_data, rawsend_opts) function rawsend_dissect(dissect, rawsend_opts, reconstruct_opts) @@ -1712,6 +1757,8 @@ function rawsend_dissect(dissect, rawsend_opts, reconstruct_opts) * rawsend_dissect собирает пакет из диссекта и отправляет * dissect представляет собой таблицу, описанную в соответствующем разделе +#### raw_packet + ``` function raw_packet(ctx) ``` @@ -1722,7 +1769,7 @@ LUA функции получают готовый диссект текущег ### Работа с пейлоадами -Следующие функции позволяют искать по маркерам байтовые позиции внутри пейлоадов. +#### Маркеры * **Абсолютный положительный маркер** - числовое смещение внутри пейлоада. * **Абсолютный отрицательный маркер** - числовое смещение внутри пейлоада от следующего за концом байта. -1 указывает на последний байт. @@ -1743,6 +1790,8 @@ LUA функции получают готовый диссект текущег Пример списка маркеров : `100,midsld,sniext+1,endhost-2,-10`. +#### resolve_pos + Задача следующих функций - преобразовать маркеры в абсолютные позиции. ``` @@ -1759,6 +1808,8 @@ function resolve_range(blob,l7payload_type,marker_list[,strict,zero_based_pos]) ### Управление выполнением инстансов +#### instance_cutoff + ``` function instance_cutoff(ctx, outgoing) ``` @@ -1769,6 +1820,8 @@ function instance_cutoff(ctx, outgoing) * outgoing = false - входящее направление * outgoing = nil - оба направления +#### lua_cutoff + ``` function lua_cutoff(ctx, outgoing) ``` @@ -1780,6 +1833,8 @@ function lua_cutoff(ctx, outgoing) Состояние lua cutoff может случиться и естественным образом, если все инстансы превысили верхнюю границу range или самоотсекли себя от направления. +#### execution_plan + ``` function execution_plan(ctx) ``` @@ -1809,6 +1864,8 @@ function execution_plan(ctx) | mode | string | режим счетчика - a, x, n, d, b, s, p | | pos | number | значение счетчика | +#### execution_plan_cancel + ``` function execution_plan_cancel(ctx) ``` @@ -1826,6 +1883,8 @@ function execution_plan_cancel(ctx) Их можно в готовом виде использовать в `--lua-desync`. +### luaexec + ``` function luaexec(ctx, desync) ``` @@ -1836,22 +1895,30 @@ function luaexec(ctx, desync) Пример : `--lua-desync=luaexec:code="desync.rnd=brandom(math.random(5,10))"` +### pass + ``` function pass(ctx, desync) ``` Ничего не делать, только вывести в debug log сообщение "pass". +### pktdebug + ``` function pktdebug(ctx, desync) ``` Вывести структуру desync в debug log. +### argdebug + ``` function argdebug(ctx, desync) ``` +### posdebug + Вывести таблицу аргументов в debug log. ``` @@ -1860,6 +1927,8 @@ function posdebug(ctx, desync) Вывести в debug log информацию о текущих conntrack позициях по прямому и обратному направлению. +### desync_orchestrator_example + ``` function desync_orchestrator_example(ctx, desync) ``` @@ -1869,6 +1938,8 @@ function desync_orchestrator_example(ctx, desync) ## Служебные функции +### var_debug + ``` function var_debug(v) ``` @@ -1876,6 +1947,8 @@ function var_debug(v) Выводит в debug log информацию о параметре v - тип и значение. Если это таблица, происходит рекурсивный проход по вложенным значениям и таблицам, информация представляется в виде дерева. +### deepcopy + ``` function deepcopy(orig) ``` @@ -1892,6 +1965,8 @@ function deepcopy(orig) Если новая строка будет иной по значению, и ее нет в пуле, будет создан новый элемент пула. Иначе будет присвоена ссылка на существующий элемент. +### logical_xor + ``` function logical_xor(a,b) ``` @@ -1900,10 +1975,14 @@ function logical_xor(a,b) ## Работа со строками +### in_list + ``` function in_list(s, v) ``` +### find_next_line + Включена ли строка v в список строк через запятую s. Например, `abc` включено в список `xyz,abc,12345`. ``` @@ -1915,6 +1994,8 @@ function find_next_line(s, pos) ## Обслуживание raw string +### hex + ``` function string2hex(s) function has_nonprintable(s) @@ -1922,7 +2003,6 @@ function make_readable(s) function str_or_hex(s) function hexdump(s, max) function hexdump_dlog(s) -function pattern(pat, offset, len) ``` * string2hex преобразует raw строку в символьное hex представление. байты разделены пробелами. "\xAB\xCD\x01\0x2" => "AB CD 01 02" @@ -1931,7 +2011,16 @@ function pattern(pat, offset, len) * str_or_hex возвращает саму строку, если has_nonpritable(s) = false, иначе string2hex(s) * hexdump преобразует начальные байт raw строки s (до max байт) в hex строку + результат make_readable. Классический hex dump. * hexdump_dlog выполняет hexdump и выводит результат в debug log -* pattern - это часть условно бесконечно повторяющейся raw строки pat, начинающаяся с позиции offset (нумерация с 1) и длиной len + +### pattern + +``` +function pattern(pat, offset, len) +``` + +pattern - это часть условно бесконечно повторяющейся raw строки pat, начинающаяся с позиции offset (нумерация с 1) и длиной len + +### blob ``` function blob(desync, name, def) @@ -1987,6 +2076,8 @@ function pos_str(desync, pos) Диссекция - это разбор некоторого сообщения для представления в структурированной форме. +### dissect_url + ``` function dissect_url(url) ``` @@ -2009,6 +2100,9 @@ function dissect_url(url) string /my_uri/script.php?a=1&b=3 + +### dissect_nld + ``` function dissect_nld(domain, level) ``` @@ -2016,6 +2110,8 @@ function dissect_nld(domain, level) Получение домена уровня level из domain. level=2 'www.microsoft.com' => 'microsoft.com'. Если уровня level нет, возвращается nil. +### dissect_http + ``` function http_dissect_req(http) function http_dissect_reply(http) @@ -2098,12 +2194,16 @@ function http_dissect_reply(http) ## Работа с элементами L3 и L4 протоколов +### find_tcp_options + ``` function find_tcp_option(options, kind) ``` Вернуть первый элемент dis.tcp.options с опцией kind. nil, если не найдено. +### ip6hdr + ``` function find_ip6_exthdr(exthdr, proto) ``` @@ -2116,6 +2216,8 @@ function del_ip6_exthdr(ip6, idx) function fix_ip6_next(ip6, last_proto) ``` +### packet_len + Эти функции работают с диссектом ipv6 заголовка ip6 и его extension headers - ip6.exthdr. При вставлении или удалении extension headers сохраняется корректная цепочка следующих протоколов, начиная с базового ipv6 заголовка. * insert_ip6_exthdr вставляет extension header с протоколом header_type и данными data в диссект ip6 по индексу ip6.exthdr idx. Если idx=nil, вставляется в конец. Размер data должен быть 6+N*4 для IPPROTO_AH и 6+N*8 для остальных, иначе будут ошибки при реконструкции. @@ -2148,6 +2250,8 @@ function packet_len(dis) ## Работа с именами хостов +### genhost + ``` function genhost(len, template) ``` @@ -2167,6 +2271,8 @@ function genhost(len, template) -- no template, len=10 : jgha7c.com ``` +### host_ip + ``` function host_ip(desync) function host_or_ip(desync) @@ -2213,6 +2319,8 @@ delta - это положительная или отрицательная ра В следующих функция и функциях отсылки применяются стандартные блоки опций, представленных в виде полей отдельно передаваемой таблицы. Таблицы опций имеет формат desync.arg. Может передаваться прямо desync.arg без изменений. +### standard ipid + **ipid_options** | Поле | Описание | |:------|:---------| @@ -2224,6 +2332,8 @@ ip_id применяется только в ряде функций, оно н Поскольку ОС не следит за измененными ip_id, в пакетах, которые не трогали, оно может начать идти заново. Windows заменяет нулевые ip_id на собственную последовательность, остальные ОС - нет. +### standard fooling + **fooling_options** | Поле | Описание | |:------|:---------| @@ -2255,6 +2365,8 @@ ipv6 extension headers добавляются в следующем порядк 5. destopt2 6. ah +### standard ipfrag + Опции IP фрагментации ipfrag_options содержат только два стандартных параметра. Остальное берут заменяемые функции фрагментаторы, для которых существуют свои специфические опции. @@ -2267,6 +2379,8 @@ ipv6 extension headers добавляются в следующем порядк | ipfrag_pos_tcp | (фрагментатор ipfrag2) позиция фрагментации tcp. должна быть кратна 8, по умолчанию 32 | | ipfrag_next | (фрагментатор ipfrag2) тип следующего протокола в "fragment" extension header второго фрагмента | +### apply_ip_id + ``` function apply_ip_id(desync, dis, ipid_options, def) ``` @@ -2276,6 +2390,8 @@ function apply_ip_id(desync, dis, ipid_options, def) Если ipid_options = nil, берется desync.arg. def содержит режим назначения по умолчанию. Если nil, применяется "seq". +### apply_fooling + ``` function apply_fooling(desync, dis, fooling_options) ``` @@ -2284,6 +2400,8 @@ function apply_fooling(desync, dis, fooling_options) Если dis = nil, берется desync.dis. Если fooling_options = nil, берется desync.arg +### ipfrag2 + ``` function ipfrag2(dis, ipfrag_options) ``` @@ -2304,6 +2422,8 @@ Unfragmentable part передается в каждом фрагменте с ipfrag2 реализует эту возможность на двух фрагментах через указание параметра ipfrag_next. Некоторые фаерволы пробиваются только большим количество фрагментов - для этого потребуется своя функция фрагментатор. +### wssize_rewrite + ``` function wsize_rewrite(dis, arg) ``` @@ -2319,6 +2439,8 @@ function wsize_rewrite(dis, arg) Следующие функции могут брать несколько блоков описанных выше опций, каждый из которых представлен полем параметра options. Во всех функциях используется `options.reconstruct` и `options.rawsend`. Они соответствуют формату параметров C функции `rawsend_dissect`. +### rawsend_dissect_ipfrag + ``` function rawsend_dissect_ipfrag(dis, options) ``` @@ -2326,6 +2448,8 @@ function rawsend_dissect_ipfrag(dis, options) Использует кастомную функцию фрагментатор, если указано `options.ipfrag.ipfrag`. Отсылает фрагменты в обратном порядке, если указано `options.ipfrag.ipfrag_disorder`. +### rawsend_dissect_segmented + ``` function rawsend_dissect_segmented(desync, dis, mss, options) ``` @@ -2333,6 +2457,8 @@ function rawsend_dissect_segmented(desync, dis, mss, options) Отправить диссект dis с автоматической tcp сегментацией на базе mss с применением `options.fooling` и `options.ipid`. ipid применяется к каждому фрагменту. Для udp сегментация невозможна и не выполняется. +### rawsend_payload_segmented + ``` function rawsend_payload_segmented(desync, payload, seq, options) ``` @@ -2404,6 +2530,8 @@ function replay_drop(desync) По сухому описанию может быть сложно понять как работает оркестрация. Рекомендуется изучить код реальных оркестраторов, а описанием пользоваться для уточнения смысла отдельных действий. +### instance_cutoff_shim( + ``` function instance_cutoff_shim(ctx, desync, dir) ``` @@ -2411,18 +2539,24 @@ function instance_cutoff_shim(ctx, desync, dir) Выполняет обычный instance cutoff по направлению dir, если ctx присутствует, иначе cutoff через дублирующий механизм, состояние которого хранится в desync.track.lua_state. dir = true - исходящее направление, dir = false - входящее, dir = nil - оба направления. +### cutoff_shim_check + ``` function cutoff_shim_check(desync) ``` Проверяет состояние instance cutoff для desync.func_instance по направлению desync.outgoing. +### apply_arg_prefix + ``` function apply_arg_prefix(desync) ``` Выполняет подстановку значений аргументов из desync.arg, начинающихся с `%` и `#`. +### apply_execution_plan + ``` function apply_execution_plan(desync, instance) ``` @@ -2431,18 +2565,24 @@ function apply_execution_plan(desync, instance) тем самым воссоздает состояние desync, как если бы `instance` был вызван напрямую C кодом. execution plan выдается C функцией `execution_plan()` как массив, элементами которого являются `instance`. +### verdict_aggregate + ``` function verdict_aggregate(v1, v2) ``` Аггрегация вердиктов v1 и v2. VERDICT_MODIFY замещает VERDICT_PASS, VERDICT_DROP замещает их обоих. +### plan_instance_execute + ``` function plan_instance_execute(desync, verdict, instance) ``` -Выполняет элемент execution plan `instance` с учетом текущего вердикта verdict. -Возвращает аггрегацию текущего вердикта и вердикта `instance`. +Выполняет элемент execution plan `instance` с учетом instance cutoff и стандартных фильтров payload и range. +Возвращает аггрегацию verdict и вердикта `instance`. + +### plan_instance_pop ``` function plan_instance_pop(desync) @@ -2450,12 +2590,16 @@ function plan_instance_pop(desync) Берет, удаляет и возвращает первый элемент execution plan из desync.plan. Если элементов нет - возвращает nil. +### plan_clear + ``` function plan_clear(desync) ``` Очищает execution plan в desync.plan - удаляет все `instance`. +### orchestrate + ``` function orchestrate(ctx, desync) ``` @@ -2463,6 +2607,8 @@ function orchestrate(ctx, desync) Если оркестратор - первый, т.е. присутствует ctx, забирает execution plan и помещает его в desync.plan, а потом выполняет `execution_plan_cancel()`. Если ctx=nil - не делает ничего. Считается, что план уже находится в desync.plan. +### replay_execution_plan + ``` function replay_execution_plan(desync) ``` @@ -2482,6 +2628,9 @@ function replay_execution_plan(desync) nfqws2 ничего не знает о том, что нужно `--lua-desync` функциям. Поэтому фильтрация направления и типа пейлоадов ложится целиком на вас. По умолчанию стоит запрет только на входящие, потому что они используются редко, а пользователь может не написать ограничение, и все это пойдет на LUA функции и будет напрасно грузить процессор гигабайтами скачиваемого трафика. + +### standard direction + Фильтр по направлению. В большинстве функций, использующих фильтр по направлению, значение по умолчанию - "out", но есть и те, где по умолчанию "any". Фильтр по направлению можно реализовать и средствами C кода `--in-range` и `--out-range`. **standard direction** @@ -2489,6 +2638,8 @@ nfqws2 ничего не знает о том, что нужно `--lua-desync` |:------|:---------| | dir | in - входящее направление
out - исходящее направление
any - любое направление | +### standard payload + Фильтр по пейлоаду берет список типов пейлоада. Список известных типов пейлоада можно получить из help текста nfqws2. Все пустые пакеты имеют пейлоад empty, неизвестные - unknown. Особые значения - all и known. all означает любой пейлоад, known - не unknown и не empty. **standard payload** @@ -2499,79 +2650,93 @@ nfqws2 ничего не знает о том, что нужно `--lua-desync` Применяются так же наборы опций -* [standard ipfrag](#операции-с-диссектами) -* [standard ipid](#операции-с-диссектами) -* [standard fooling](#операции-с-диссектами) -* [standard reconstruct](#опции-по-работе-с-пакетами) -* [standard rawsend](#опции-по-работе-с-пакетами) +* [standard ipfrag](#standard-ipfrag) +* [standard ipid](#standard-ipid) +* [standard fooling](#standard-fooling) +* [standard reconstruct](#standard-reconstruct) +* [standard rawsend](#standard-rawsend) ## Базовые функции +### drop + ``` function drop(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) -* arg: [standard payload](#стандартные-наборы-параметров) +* arg: [standard direction](#standard-direction) +* arg: [standard payload](#standard-payload) * По умолчанию payload=all, direction=any, то есть drop всего. Выносит VERDICT_DROP при выполнении условий фильтра. +### send + ``` function send(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) -* arg: [standard fooling](#операции-с-диссектами) -* arg: [standard ipid](#операции-с-диссектами) -* arg: [standard ipfrag](#операции-с-диссектами) -* arg: [standard reconstruct](#опции-по-работе-с-пакетами) -* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: [standard direction](#standard-direction) +* arg: [standard fooling](#standard-fooling) +* arg: [standard ipid](#standard-ipid) +* arg: [standard ipfrag](#standard-ipfrag) +* arg: [standard reconstruct](#standard-reconstruct) +* arg: [standard rawsend](#standard-rawsend) * режим ip_id по умолчанию - none Отсылает текущий диссект c опциональным применением модификаций. +### pktmod + ``` function pktmod(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) -* arg: [standard fooling](#операции-с-диссектами) -* arg: [standard ipid](#операции-с-диссектами) +* arg: [standard direction](#standard-direction) +* arg: [standard fooling](#standard-fooling) +* arg: [standard ipid](#standard-ipid) Применить модификации к текущему диссекту без отправки и вынесения вердикта. ## Дурение http +### http_hostcase + ``` function http_hostcase(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) +* arg: [standard direction](#standard-direction) * arg: spell - точное написание заголовка. по умолчанию "host" Заменяет регистр http заголовка `Host:` +### http_domcase + ``` function http_domcase(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) +* arg: [standard direction](#standard-direction) Меняет регистр написания домена внутри заголовка `Host:`. Верхний и нижний регистр чредуется каждый символ : `rUtRaCkEr.oRg`. +### http_methodeol + ``` function http_methodeol(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) +* arg: [standard direction](#standard-direction) Вставляет '\r\n' перед методом, отрезая 2 последних символа из содержимого заголовка `User-Agent:`. Работает только на nginx, остальные сервера ломает. ## Замена window size +### wsize + ``` function wsize(ctx, desync) ``` @@ -2583,11 +2748,13 @@ function wsize(ctx, desync) Цель техники - подменить window size со стороны клиента или сервера, чтобы в ответ на это клиент отослал следующий пакет частями, поскольку целиком он не влезает в window size. Может приводить к замедлению. Устаревшая техника, рекомендуется применять только с сервера в крайнем случае для работы по клиентам, которые не делают ничего для обхода блокировки. С клиента лучше применять техники tcp сегментации, поскольку они лишены побочных эффектов в виде замедления скорости и имеют больше возможностей. +### wssize + ``` function wssize(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) +* arg: [standard direction](#standard-direction) * arg: wsize - размер tcp окна * arg: scale - scaling фактор. заменяется в tcp option, если есть. только уменьшение, увеличение блокируется * arg: forced_cutoff - список типов пейлоадов через зяпятую, при получении которых выполняется instance cutoff. Если нужно применять wssize бесконечно, можно указать forced_cutoff=no, то есть несуществующий тип пейлоада, который не придет никогда. @@ -2616,14 +2783,16 @@ function wssize(ctx, desync) иначе это поломает соединение. Без фулинга фейк должен повторять часть оригинальной информации, чтобы сервер не получил ложную информацию. Скрытые фейки не воспринимаются сервером в силу характеристик пакетов, частью которых они являются. +### syndata + ``` function syndata(ctx, desync) ``` -* arg: [standard fooling](#операции-с-диссектами) -* arg: [standard ipfrag](#операции-с-диссектами) -* arg: [standard reconstruct](#опции-по-работе-с-пакетами) -* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: [standard fooling](#standard-fooling) +* arg: [standard ipfrag](#standard-ipfrag) +* arg: [standard reconstruct](#standard-reconstruct) +* arg: [standard rawsend](#standard-rawsend) * arg: blob - blob, содержащий фейковый payload. Должен помещаться в один пакет, сегментация невозможна. * arg: tls_mod - применить указанный tls_mod к пейлоаду blob @@ -2632,34 +2801,38 @@ function syndata(ctx, desync) Таким образом воздействие выполняется на все ретрансмиссии SYN, после чего функция прекращает работу. Является стратегией нулевой фазы, которая работает с хостлистами только в режиме `--ipcache-hostname`. +### fake + ``` function fake(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) -* arg: [standard payload](#стандартные-наборы-параметров) -* arg: [standard fooling](#операции-с-диссектами) -* arg: [standard ipid](#операции-с-диссектами) -* arg: [standard ipfrag](#операции-с-диссектами) -* arg: [standard reconstruct](#опции-по-работе-с-пакетами) -* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: [standard direction](#standard-direction) +* arg: [standard payload](#standard-payload) +* arg: [standard fooling](#standard-fooling) +* arg: [standard ipid](#standard-ipid) +* arg: [standard ipfrag](#standard-ipfrag) +* arg: [standard reconstruct](#standard-reconstruct) +* arg: [standard rawsend](#standard-rawsend) * arg: blob - blob, содержащий фейковый payload. Может быть любой длины - сегментация выполняется автоматически. * arg: tls_mod - применить указанный tls_mod к пейлоаду blob * payload фильтр по умолчанию - "known" Это прямой фейк - отдельный пакет или группа пакетов. Функция не выносит вердикт и не блокирует отправку оригинала. +### rst + ``` function rst(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) -* arg: [standard payload](#стандартные-наборы-параметров) -* arg: [standard fooling](#операции-с-диссектами) -* arg: [standard ipid](#операции-с-диссектами) -* arg: [standard ipfrag](#операции-с-диссектами) -* arg: [standard reconstruct](#опции-по-работе-с-пакетами) -* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: [standard direction](#standard-direction) +* arg: [standard payload](#standard-payload) +* arg: [standard fooling](#standard-fooling) +* arg: [standard ipid](#standard-ipid) +* arg: [standard ipfrag](#standard-ipfrag) +* arg: [standard reconstruct](#standard-reconstruct) +* arg: [standard rawsend](#standard-rawsend) * arg: rstack - отсылка RST,ACK вместо RST * payload фильтр по умолчанию - "known" @@ -2667,17 +2840,19 @@ function rst(ctx, desync) ## TCP сегментация +### multisplit + ``` function multisplit(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) -* arg: [standard payload](#стандартные-наборы-параметров) -* arg: [standard fooling](#операции-с-диссектами) -* arg: [standard ipid](#операции-с-диссектами) -* arg: [standard ipfrag](#операции-с-диссектами) -* arg: [standard reconstruct](#опции-по-работе-с-пакетами) -* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: [standard direction](#standard-direction) +* arg: [standard payload](#standard-payload) +* arg: [standard fooling](#standard-fooling) +* arg: [standard ipid](#standard-ipid) +* arg: [standard ipfrag](#standard-ipfrag) +* arg: [standard reconstruct](#standard-reconstruct) +* arg: [standard rawsend](#standard-rawsend) * arg: pos - список через запятую позиционных маркеров - точек разреза. По умолчанию "2". * arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window * arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00 @@ -2700,18 +2875,19 @@ seqovl - это фактически средство замешивания ф Особое преимущество seqovl - в отсутствии необходимости фулинга. Сервер принимает только часть сегмента за счет игры с sequence numbers, а не за счет модификации каких-то элементов ip и tcp заголовков, что привело бы к полному непринятию. +### multidisorder ``` function multidisorder(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) -* arg: [standard payload](#стандартные-наборы-параметров) -* arg: [standard fooling](#операции-с-диссектами) -* arg: [standard ipid](#операции-с-диссектами) -* arg: [standard ipfrag](#операции-с-диссектами) -* arg: [standard reconstruct](#опции-по-работе-с-пакетами) -* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: [standard direction](#standard-direction) +* arg: [standard payload](#standard-payload) +* arg: [standard fooling](#standard-fooling) +* arg: [standard ipid](#standard-ipid) +* arg: [standard ipfrag](#standard-ipfrag) +* arg: [standard reconstruct](#standard-reconstruct) +* arg: [standard rawsend](#standard-rawsend) * arg: pos - список через запятую позиционных маркеров - точек разреза. По умолчанию "2". * arg: seqovl - маркер - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево * arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00 @@ -2729,17 +2905,18 @@ function multidisorder(ctx, desync) Последний отсылаемый сегмент (1-й в оригинальной очередности) отправляется неизменным, переписывая в буфере сокета ложные данные из seqovl_pattern реальными. Восстанавливается непрерывная последовательность потока, данные передаются в сокет приложения. +### fakedsplit ``` function fakedsplit(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) -* arg: [standard payload](#стандартные-наборы-параметров) -* arg: [standard fooling](#операции-с-диссектами) -* arg: [standard ipid](#операции-с-диссектами) -* arg: [standard reconstruct](#опции-по-работе-с-пакетами) -* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: [standard direction](#standard-direction) +* arg: [standard payload](#standard-payload) +* arg: [standard fooling](#standard-fooling) +* arg: [standard ipid](#standard-ipid) +* arg: [standard reconstruct](#standard-reconstruct) +* arg: [standard rawsend](#standard-rawsend) * arg: pos - один позиционный маркер - точка разреза. По умолчанию "2". * arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window * arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00 @@ -2770,16 +2947,18 @@ function fakedsplit(ctx, desync) В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop". blob позволяет заменить текущией пейлоад на произвольный блоб, и тем самым отослать любой совместимый пейлоад с тем же разбиением. +### fakeddisorder + ``` function fakeddisorder(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) -* arg: [standard payload](#стандартные-наборы-параметров) -* arg: [standard fooling](#операции-с-диссектами) -* arg: [standard ipid](#операции-с-диссектами) -* arg: [standard reconstruct](#опции-по-работе-с-пакетами) -* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: [standard direction](#standard-direction) +* arg: [standard payload](#standard-payload) +* arg: [standard fooling](#standard-fooling) +* 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 @@ -2810,16 +2989,18 @@ function fakeddisorder(ctx, desync) В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop". blob позволяет заменить текущией пейлоад на произвольный блоб, и тем самым отослать любой совместимый пейлоад с тем же разбиением. +### hostfakesplit + ``` function hostfakesplit(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) -* arg: [standard payload](#стандартные-наборы-параметров) -* arg: [standard fooling](#операции-с-диссектами) -* arg: [standard ipid](#операции-с-диссектами) -* arg: [standard reconstruct](#опции-по-работе-с-пакетами) -* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: [standard direction](#standard-direction) +* arg: [standard payload](#standard-payload) +* arg: [standard fooling](#standard-fooling) +* arg: [standard ipid](#standard-ipid) +* arg: [standard reconstruct](#standard-reconstruct) +* arg: [standard rawsend](#standard-rawsend) * arg: host - шаблон для генерации фейкового хоста - random.template * arg: midhost - маркер для дополнительного разреза сегмента с реальным хостом * arg: disorder_after - маркер для дополнительного разреза заключительной реальной части и отправки сегментов в обратном порядке @@ -2847,17 +3028,19 @@ function hostfakesplit(ctx, desync) В случае успеха отсылки выносится VERDICT_DROP, если не указано "nodrop". blob позволяет заменить текущией пейлоад на произвольный блоб, и тем самым отослать любой совместимый пейлоад с тем же разбиением. +### tcpseg + ``` function tcpseg(ctx, desync) ``` -* arg: [standard direction](#стандартные-наборы-параметров) -* arg: [standard payload](#стандартные-наборы-параметров) -* arg: [standard fooling](#операции-с-диссектами) -* arg: [standard ipid](#операции-с-диссектами) -* arg: [standard ipfrag](#операции-с-диссектами) -* arg: [standard reconstruct](#опции-по-работе-с-пакетами) -* arg: [standard rawsend](#опции-по-работе-с-пакетами) +* arg: [standard direction](#standard-direction) +* arg: [standard payload](#standard-payload) +* arg: [standard fooling](#standard-fooling) +* arg: [standard ipid](#standard-ipid) +* arg: [standard ipfrag](#standard-ipfrag) +* arg: [standard reconstruct](#standard-reconstruct) +* arg: [standard rawsend](#standard-rawsend) * arg: pos - список из двух маркеров, определяющий границы tcp сегмента * arg: seqovl - число - смещение относительно текущего sequence для создания дополнительной части сегмента, выходящей влево за границу tcp window * arg: seqovl_pattern - blob, используемый для заполнения seqovl. По умолчанию 0x00