From 65337446d40341bd41dcf1b0f365f7429e99d15a Mon Sep 17 00:00:00 2001 From: bol-van Date: Wed, 28 Jan 2026 18:09:27 +0300 Subject: [PATCH] update docs --- docs/changes.txt | 5 ++ docs/manual.md | 199 +++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 189 insertions(+), 15 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 07bfbf2..aaf7e9f 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -204,3 +204,8 @@ v0.8.1 * nfqws2: enable dead reasm protection in wsize=0 case * nfqws2: --intercept * winws2: changed icon to multi-res png up to 256px +* nfqws2: support icmp and ipp +* nfqws2: VERDICT_PRESERVE_NEXT +* nfqws2: keepsum reconstruct option +* nfqws2: more helpers +* zapret-obfs: ippxor, udp2icmp diff --git a/docs/manual.md b/docs/manual.md index 9a18507..15d0d74 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -35,6 +35,7 @@ - [Структура диссекта](#структура-диссекта) - [Особенности приема многопакетных пейлоадов](#особенности-приема-многопакетных-пейлоадов) - [Структура track](#структура-track) + - [Особенности обработки icmp](#особенности-обработки-icmp) - [С интерфейс nfqws2](#с-интерфейс-nfqws2) - [Базовые константы](#базовые-константы) - [Стандартные блобы](#стандартные-блобы) @@ -56,6 +57,7 @@ - [parse\_hex](#parse_hex) - [Криптография](#криптография) - [bcryptorandom](#bcryptorandom) + - [bxor,bor,band](#bxorborband) - [hash](#hash) - [aes](#aes) - [aes\_gcm](#aes_gcm) @@ -76,12 +78,14 @@ - [reconstruct\_dissect](#reconstruct_dissect) - [reconstruct\_hdr](#reconstruct_hdr) - [csum\_fix](#csum_fix) + - [Получение ip адресов](#получение-ip-адресов) - [Прием и отсылка пакетов](#прием-и-отсылка-пакетов) - [rawsend](#rawsend) - [raw\_packet](#raw_packet) - [Работа с пейлоадами](#работа-с-пейлоадами) - [маркеры](#маркеры) - [resolve\_pos](#resolve_pos) + - [tls\_mod](#tls_mod) - [Управление выполнением инстансов](#управление-выполнением-инстансов) - [instance\_cutoff](#instance_cutoff) - [lua\_cutoff](#lua_cutoff) @@ -118,6 +122,7 @@ - [Работа с элементами L3 и L4 протоколов](#работа-с-элементами-l3-и-l4-протоколов) - [find\_tcp\_options](#find_tcp_options) - [ip6hdr](#ip6hdr) + - [ip protocol](#ip-protocol) - [packet\_len](#packet_len) - [Работа с именами хостов](#работа-с-именами-хостов) - [genhost](#genhost) @@ -135,6 +140,7 @@ - [ipfrag2](#ipfrag2) - [wssize\_rewrite](#wssize_rewrite) - [dis\_reverse](#dis_reverse) + - [IP адреса и интерфейсы](#ip-адреса-и-интерфейсы) - [Отсылка](#отсылка) - [rawsend\_dissect\_ipfrag](#rawsend_dissect_ipfrag) - [rawsend\_dissect\_segmented](#rawsend_dissect_segmented) @@ -283,7 +289,7 @@ zapret2 является пакетным манипулятором, основ Однако, там нет никаких возможностей собственно для воздействия на трафик. Это вынесено в код на языке Lua, вызываемый из [nfqws2](#nfqws2). Поэтому следующая по важности часть проекта - Lua код. В базовый комплект входит библиотека функций-хелперов [zapret-lib.lua](#библиотека-базовых-функций-zapret-liblua), библиотека программ автономных атак на DPI [zapret-antidpi.lua](#библиотека-программ-атаки-на-dpi-zapret-antidpilua), библиотека функций принятия динамических решений (оркестрации) [zapret-auto.lua](#библиотека-программ-автоматизации-и-оркестрации-zapret-autolua). -Дополнительно присутствует набор тестов C функций `zapret-tests.lua`, средство обфускации wireguard протокола `zapret-wgobfs.lua` и средство записи дампа пакетов в cap файлы `zapret-pcap.lua`. +Дополнительно присутствует набор тестов C функций `zapret-tests.lua`, средства обфускации трафика `zapret-obfs.lua` и средство записи дампа пакетов в cap файлы `zapret-pcap.lua`. Проект может работать с LuaJIT-2.1+ или с PUC Lua 5.3+. Более старые версии могут иметь несовместимости, не тестируются и не поддерживаются. @@ -331,7 +337,7 @@ conntrack отслеживает логическое направление п Когда необходимая информация о пейлоаде получена, наступает очередь системы классификации по [профилям](#использование-множественных-профилей). Профили содержат систему фильтров и команды действия внутри профиля. -Профили фильтруются по L3 - версия IP протокола, ipset-ы - списки IP адресов, L4 - порты tcp или udp, L6/L7 - тип протокола потока, списки доменов (хостлисты). +Профили фильтруются по L3 - версия IP протокола, номер IP протокола, ipset-ы - списки IP адресов, L4 - порты tcp или udp, type/code для icmp, L6/L7 - тип протокола потока, списки доменов (хостлисты). Профили сканируются строго в порядке от первого к последнему. При первом совпадении условий фильтра профиля выбирается этот профиль, а сканирование прекращается. Если ни одно из условий не выполнено, выбирается профиль по умолчанию, в котором нет никаких действий. @@ -625,6 +631,10 @@ winws2 может принимать полные raw фильтры - вы пи `--wf-tcp-out`, `--wf-tcp-in`, `--wf-udp-out`, `--wf-udp-in` берут список портов (`80,443`) или диапазонов портов (`80,443,500-1000`) и включают полный перехват портов по указанному направлению. +`--wf-icmp-out`, `--wf-icmp-in` берут список icmp_type или icmp_type+icmp_code. + +`--wf-ipp-in`, `--wf-ipp-out` берут список raw IP протоколов (для ipv6 не поддерживается выявление истинного протокола при наличии extension headers). + `--wf-raw-part` принимает частичные windivert фильтры. Синтаксис аналогичен `--wf-raw`. `--wf-raw-part` может быть несколько. Частичные фильтры встраиваются конструктором в итоговый фильтр по принципу OR. Или указанные порты, или ваш фильтр1 или ваш фильтр2. @@ -672,6 +682,7 @@ nfqws2 использует стандартный парсер getopt_long_only --version ; вывести версию и выйти --dry-run ; проверить валидность параметров командной строки и наличие файлов. не проверяет корректность скриптов Lua ! --comment=any_text ; любой текст. игнорируется + --intercept=0|1 ; 1 - разрешить перехват. при 0 выполняются lua-init скрипты и процесс завершается, перехват не включается, очередь NFQUEUE не инициализируется --daemon ; отключиться от консоли (демонизироваться) --pidfile= ; запись PID в файл --ctrack-timeouts=S:E:F[:U] ; таймауты conntrack для стадий tcp SYN, ESTABLISHED, FIN и для udp @@ -698,6 +709,8 @@ MULTI-STRATEGY: --filter-l3=ipv4|ipv6 ; фильтр профиля : версия ip протокола --filter-tcp=[~]port1[-port2]|* ; фильтр профиля : порты tcp или диапазоны портов через запятую --filter-udp=[~]port1[-port2]|* ; фильтр профиля : порты udp или диапазоны портов через запятую + --filter-icmp=type[:code]|* ; фильтр профиля : icmp type и code через запятую. если code не задан - любой code. + --filter-ipp=proto ; фильтр профиля : номер raw ip протоколов через запятую --filter-l7=proto[,proto] ; фильтр профиля : список протоколов потока --ipset= ; фильтр профиля : включающий список ip адресов или подсетей из файла. может быть смешанным ipv4+ipv6. --ipset-ip= ; фильтр профиля : включающий фиксированный список ip адресов или подсетей через запятую @@ -821,6 +834,15 @@ nfqws2 <глобальные_параметры> Если нужно, чтобы стратегия начала работу с самого первого пакета и продолжила работать дальше после изменения профиля, нужно дублировать вызовы во всех профилях, по которым может пройти поток. +4 группы фильтров - tcp, udp, icmp и ipp обьединяются по принципу OR. Если нет ни одного фильтра из этих групп, то +считается разрешенным все. Если задается хотя бы один, остальные группы блокируются, если не определены. + +Фильтр ipp не работает с протоколами tcp, udp и icmp. Проверка пойдет по группам фильтра, соответствующим протоколу. Например, если задано только `--filter-ipp=6`, +это не значит, что будут пропущены все tcp. Наоборот, это блокирует все, включая и сам tcp, потому что не задан `--filter-tcp`. Правильно будет указать `--filter-tcp=*`. + +icmp автоматически подразумевает и icmpv6 - они обрабатываются единым образом. Однако, [icmp types](https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) для icmp и icmpv6 отличаются. Это нужно учитывать. + + ### Шаблоны профилей Когда имеется много сложных и повторяющихся стратегий, может быть удобно использовать шаблоны. @@ -1191,8 +1213,10 @@ nfqws2 следит за превышением верхней границы с - VERDICT_PASS передает пакет как есть без учета изменений диссекта - VERDICT_MODIFY выполняет реконструкцию и отправку текущего диссекта - VERDICT_DROP дропает текущий пакет +- VERDICT_PRESERVE_NEXT - отдельный бит, который нужно прибавить к основному вердикту - использовать поля "next protocol" в ipv6 header и ipv6 extension headers. в ином случае они генерируются автоматом по содержимому диссекта Результат всех lua-desync инстансов аггрегируется : VERDICT_MODIFY замещает VERDICT_PASS, VERDICT_DROP замещает их обоих. +VERDICT_PRESERVE_NEXT применяется, если хотя бы один инстанс его вернул. ### Структура таблицы desync @@ -1483,6 +1507,7 @@ ipv6 extension headers и tcp options представляются в форме | ip6 | table | заголовок ipv6 | | tcp | table | заголовок tcp | | udp | table | заголовок udp | +| icmp | table | заголовок icmp | | l4proto | number | IPPROTO_TCP или IPPROTO_UDP | | transport_len | number | длина пакета без L3 заголовков | | l3_len | number | длина L3 заголовков, включая ip options и ipv6 extension headers | @@ -1553,10 +1578,22 @@ ipv6 extension headers и tcp options представляются в форме **tcp options** -| Поле | Описание | -| :--- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Поле | Описание | +| :--- | :-------- | | kind | [тип опции](https://www.iana.org/assignments/tcp-parameters/tcp-parameters.xhtml) : TCP_KIND_END, TCP_KIND_NOOP, TCP_KIND_MSS, TCP_KIND_SCALE, TCP_KIND_SACK_PERM, TCP_KIND_SACK, TCP_KIND_TS, TCP_KIND_MD5, TCP_KIND_AO, TCP_KIND_FASTOPEN | -| data | блок данных опции без kind и length. отсутствует для TCP_KIND_END и TCP_KIND_NOOP | +| data | блок данных опции без kind и length. отсутствует для TCP_KIND_END и TCP_KIND_NOOP | + +**icmp** + +Заголовком icmp считается его постоянная часть - первые 8 байт. Они универсальны как для ipv4, так и для ipv6 версии. +Остальное содержимое icmp зависит от типа icmp и располагается в payload, включая возможные специальные поля заголовка или обрезанный исходный пакет, на который был сгенерирован icmp. + +| Поле | Описание | +| :---------- | :--------------------------------------------------- | +| icmp_type | [тип icmp](https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) | +| icmp_code | [код icmp](https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml) | +| icmp_cksum | чексумма icmp | +| icmp_data | 32-битное поле данных со смещения 4 | ### Особенности приема многопакетных пейлоадов @@ -1642,6 +1679,23 @@ mss дублируется в поле `desync.tcp_mss` независимо о Большее и не отследить через sequence. Нужно всегда учитывать, что при передаче больших обьемов данных они не могут служить счетчиком. `p*counter` являются 64-битными счетчиками, поэтому у них этой проблемы нет. +#### Особенности обработки icmp + +Некоторые типы icmp могут содержать прикрепленный исходный пакет, на который был сгенерирован icmp. Они называются "related". +Такие пейлоады распознаются, по ним ищется исходная запись conntrack. +Если она находится, выбирается кэшированный профиль (тот, к которому относится прикрепленный пакет). +Направление выбирается как обратное относительно найденной записи. +Тип пейлоада устанавливается как "ipv4" или "ipv6", тип протокола сеанса - из профиля исходного пакета. +Далее icmp проходит обычным образом по профилю. Нужно учитывать, что в функцию может придти диссект с icmp, без tcp или udp, +но с desync.track + +Если icmp не содержит прикрепленного пакета, он инвалидный или не найдена запись conntrack, icmp проходит самостоятельно +без track. + +conntrack работает только с tcp и udp, он не ведет учет пингов или других типов icmp. +При проходе icmp по записи conntrack никакие счетчики не меняются. + + # С интерфейс nfqws2 Перед выполнением `--lua-init` C код выставляет базовые константы, блобы и C функции. @@ -1683,7 +1737,15 @@ mss дублируется в поле `desync.tcp_mss` независимо о | IP6 | number | бит "More fragment" поля ip6f_offlg из ipv6 fragment header | 0x0001 | | IPV6_FLOWLABEL_MASK | number | flow label в ip6_flow | 0x000FFFFF | | IPV6_FLOWINFO_MASK | number | flow label, traffic class в ip6_flow | 0x0FFFFFFF | -| IPPROTO_IP
IPPROTO_IPV6
IPPROTO_ICMP
IPPROTO_TCP
IPPROTO_UDP
IPPROTO_ICMPV6
IPPROTO_HOPOPTS
IPPROTO_ROUTING
IPPROTO_FRAGMENT
IPPROTO_AH
IPPROTO_ESP
IPPROTO_DSTOPTS
IPPROTO_MH
IPPROTO_HIP
IPPROTO_SHIM6
IPPROTO_NONE | number | [номера IP протоколов](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) | используются в ipv4 и ipv6 | +| IPPROTO_IP
IIPPROTO_IPV6
IPPROTO_IPIP
IPPROTO_ICMP
IPPROTO_ICMPV6
IPPROTO_TCP
IPPROTO_UDP
IPPROTO_SCTP
IPPROTO_HOPOPTS
IPPROTO_ROUTING
IPPROTO_FRAGMENT
IPPROTO_AH
IPPROTO_ESP
IPPROTO_DSTOPTS
IPPROTO_MH
IPPROTO_HIP
IPPROTO_SHIM6
IPPROTO_NONE | number | [номера IP протоколов](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) | используются в ipv4 и ipv6 | +| ICMP_ECHOREPLY
ICMP_DEST_UNREACH
ICMP_REDIRECT
ICMP_ECHO
ICMP_TIME_EXCEEDEDICMP_TIMESTAMP
ICMP_TIMESTAMPREPLY
ICMP_INFO_REQUEST
ICMP_INFO_REPLY | number | типы icmp | +| ICMP_UNREACH_NET
ICMP_UNREACH_HOST
ICMP_UNREACH_PROTOCOL
ICMP_UNREACH_PORT
ICMP_UNREACH_NEEDFRAG
ICMP_UNREACH_SRCFAIL
ICMP_UNREACH_NET_UNKNOWN
ICMP_UNREACH_HOST_UNKNOWN
ICMP_UNREACH_NET_PROHIB
ICMP_UNREACH_HOST_PROHIB
ICMP_UNREACH_TOSNET
ICMP_UNREACH_TOSHOST
ICMP_UNREACH_FILTER_PROHIB
ICMP_UNREACH_HOST_PRECEDENCE
ICMP_UNREACH_PRECEDENCE_CUTOFF | number | коды icmp для destination unreachable | +| ICMP_REDIRECT_NET
ICMP_REDIRECT_HOST
ICMP_REDIRECT_TOSNET
ICMP_REDIRECT_TOSHOST | number | коды icmp для icmp redirect | +| ICMP_TIMXCEED_INTRANS
ICMP_TIMXCEED_REASS | number | коды icmp для time exceeded | +| ICMP6_ECHO_REQUEST
ICMP6_ECHO_REPLY
ICMP6_DST_UNREACH
ICMP6_PACKET_TOO_BIG
ICMP6_TIME_EXCEEDED
ICMP6_PARAM_PROB
MLD_LISTENER_QUERY
MLD_LISTENER_REPORT
MLD_LISTENER_REDUCTION
ND_ROUTER_SOLICIT
ND_ROUTER_ADVERT
ND_NEIGHBOR_SOLICIT
ND_NEIGHBOR_ADVERT
ND_REDIRECT | number | типы icmpv6 | +| ICMP6_DST_UNREACH_NOROUTE
ICMP6_DST_UNREACH_ADMIN
ICMP6_DST_UNREACH_BEYONDSCOPE
ICMP6_DST_UNREACH_ADDR
ICMP6_DST_UNREACH_NOPORT | number | коды icmpv6 для destination unreachable | +| ICMP6_TIME_EXCEED_TRANSIT
ICMP6_TIME_EXCEED_REASSEMBLY | number | коды icmpv6 для time exceeded | +| ICMP6_PARAMPROB_HEADER
ICMP6_PARAMPROB_NEXTHEADER
ICMP6_PARAMPROB_OPTION | number | коды icmpv6 для parameter problem | ## Стандартные блобы @@ -1889,6 +1951,17 @@ function bcryptorandom(size) Если пул энтропии исчерпывается, может вызывать зависания. Чтобы этого не было - установите haveged или rngd. Не стоит использовать для получения случайных данных, не требующих крипто-стойкости. +#### bxor,bor,band + +``` +function bxor(data1, data2) +function band(data1, data2) +function bor(data1, data2) +``` + +Возвращает результат побайтового xor,and или or между raw строками data1 и data2. data1 и data2 должны быть равны по длине, +иначе вызывается error. + #### hash ``` @@ -1970,7 +2043,6 @@ function gunzip_inflate(zstream, compressed_data, expected_uncompressed_chunk_si * gunzip_init создает и возвращает контекст gzip потока для последующих вызовов других функций. Значение windowBits см. в документации по zlib (по умолчанию 47). * gunzip_end освобождает контекст gzip. может быть освобожден сборщиком мусора, но лучше вызывать явно. -* вместо явного вызова gunzip_end в Lua 5.5+ для контекста можно использовать to-be-closed variable * gunzip_inflate разжимает очередную часть зипованных данных. Данные можно скармливать частями. Разжатые части конкатенируются для получения полных данных. Возвращается 2 аргумента : расжатые данные и bool признак конца gzip. В случае испорченных данных или при нехватке памяти возвращается nil. * expected_uncompressed_chunk_size - необязательный параметр для оптимизации выделения памяти под разжимаемые данные. Если буфера не хватает, вызываются realloc, копирующие блоки памяти и влияющие на производительность. Размер следует выбирать согласно ожидаемой степени сжатия с небольшим запасом. По умолчанию - четырехкратный размер compressed_data. @@ -2028,14 +2100,15 @@ function gettid() | Поле | Тип | Описание | | :---------------- | :----- | :-------------------------------------------------------------------------------------------- | +| keepsum | bool | взять чексумму L4 из диссекта, не считать и не портить | | badsum | bool | испортить L4 checksum. посчитать чексумму и сделать xor со случайным значением от 1 до 0xFFFF | | ip6_preserve_next | bool | использовать значения "next" из ip6.exthdr | | ip6_last_proto | number | если ip6_preserve_next=false, IP протокол последнего exthdr | При сборке ipv6 по умолчанию цепочка ip протоколов в exthdr собирается автоматически. У каждого exthdr есть поле type, поэтому понятно что вписывать в предыдущий exthdr, -либо в основной ip6 хедер. next протокол последнего exthdr устанавливатеся как IPPROTO_TCP -или IPPROTO_UDP в зависимости от наличия в диссекте таблиц tcp или udp. +либо в основной ip6 хедер. next протокол последнего exthdr устанавливатеся как IPPROTO_TCP, +IPPROTO_UDP, IPPROTO_ICMP, IPPROTO_ICMPV6 в зависимости от наличия в диссекте таблиц tcp, udp, icmp, ip6. В большинстве случаев это удобно, поскольку вам при вставлении exthdr не надо реконструировать всю цепочку next протоколов и не надо заполнять поля next. За вас это сделает реконструктор диссекта. @@ -2113,6 +2186,7 @@ ip6.ip6_len должен быть рассчитан таким, каким он ``` function reconstruct_tcphdr(tcp) function reconstruct_udphdr(udp) +function reconstruct_icmphdr(icmp) function reconstruct_iphdr(ip) function reconstruct_ip6hdr(ip6, reconstruct_opts) ``` @@ -2121,7 +2195,7 @@ function reconstruct_ip6hdr(ip6, reconstruct_opts) - реконструкция ip6 задействует reconstruct_opts. из них берется ip6_preserve_next и ip6_last_proto. - чексумма ip header считается автоматически, поскольку ни от чего больше не зависит -- чексуммы tcp и udp не считаются, поскольку зависят от других компонент +- чексуммы tcp, udp и icmp не считаются, поскольку зависят от других компонент #### csum_fix @@ -2129,17 +2203,56 @@ function reconstruct_ip6hdr(ip6, reconstruct_opts) function csum_ip4_fix(raw_ipv4_header) function csum_tcp_fix(raw_ip_header, raw_tcp_header, payload) function csum_udp_fix(raw_ip_header, raw_udp_header, payload) +function csum_icmp_fix(raw_ip_header, raw_icmp_header, payload) ``` Функции для выправления чексумм. Поскольку строки в Lua immutable, они возвращают копию соответствующего заголовка с исправленной чексуммой. - с csum_ipv4_fix все просто. на входе ip заголовок, на выходе ip заголовок с исправленной суммой -- csum_tcp_fix и csum_udp_fix берут raw ip заголовок (ipv4 или ipv6), tcp/udp заголовок и пейлоад. версия ip определяется автоматически. чексумма считается на базе L3, L4 заголовков и пейлоада. +- csum_tcp_fix, csum_udp_fix, csum_icmp_fix берут raw ip заголовок (ipv4 или ipv6), tcp/udp/icmp заголовок и пейлоад. версия ip определяется автоматически. чексумма считается на базе L3, L4 заголовков и пейлоада. Прямая реконструкция отдельных заголовков нужна редко. Обычно все задачи выполняют функции по работе с диссектами. -Но если у вас особый случай, например вам нужно сконструировать icmp, то вам придется собирать его по частям и использовать rawsend для отсылки. -csum_ip4_fix вам наверняка понадобится. + +### Получение ip адресов + +``` +function get_source_ip(target) +``` + +Получить из таблицы маршрутизации ip адрес источника, который будет использован для подключению к ip адресу target. +target представляет собой raw string ipv4 или ipv6. +Функция возвращает raw string адреса источника или nil, если destination unreachable. + +``` +function get_ifaddrs() +``` + +Получить список IP адресов на всех интерфейсах (аналог ip addr, ifconfig, ipconfig). +Возвращается таблица, индексы которой являются именами интерфейсов. +Для Windows имена интерфейсов представлены строками "число.число" - IfIdx.SubIfIdx - как раз то, что выдает и берет windivert. + +Содержимое интерфейса : + +| Поле | Тип | Описание | +| :---------------- | :----- | :------------------ | +| index | number | индекс интерфейса | +| mtu | number | MTU. для loopback может быть 64K или даже 0xFFFFFFFF | +| flags | number | битовые флаги. зависят от ОС | +| ssid | string | SSID wifi сети, если известен. имена сетей получаются только при использовании `--filter-ssid` | +| guid
iftype
index6
speed_xmit
speed_recv
metric4
metric6
conntype
| number | (только windows) дополнительные поля из GetAdaptersAddresses() | +| addr | table | таблица адресов с числовыми индексами от 1 | + +Содержимое адреса : + +| Поле | Тип | Описание | +| :----------- | :----- | :------------------ | +| addr | string | ipv4 или ipv6 адрес | +| netmask | string | маска подсети | +| broadcast | string | (только ipv4) broadcast адрес | +| dst | string | содержимое ifa_dstaddr из getifaddrs() | + +Единственное гарантированное поле - addr. Остальных может не быть. ### Прием и отсылка пакетов @@ -2203,6 +2316,25 @@ function resolve_range(blob,l7payload_type,marker_list[,strict,zero_based_pos]) - если задано zero_based_pos=true, все позиции начинаются с 0, иначе с 1, как это принято в Lua. - при невалидных значениях l7payload_type, marker, marker_list, если количество маркеров не равно 2 для resolve_range - вызывается error +#### tls_mod + +``` +function tls_mod(blob, modlist, payload) +``` + +- blob - блоб, с которым производится действие +- payload - содержимое, под которое модифицируется blob. для разных модов может быть произвольным или требуется валидный tls. +- modlist - список модификаций + +Моды : + +- **rnd** - заполнить поля random и session id случайными данными +- **dupsid** - скопировать session id с payload. выполняется после rnd, требует валидного tls в payload, иначе не применяется +- **rndsni** - замена sni на случайный. если длина оригинального sni >=7 символов, выбирается случайный поддомен из известных 3-буквенных TLD. иначе без точки случайные символы `[a-z][a-z0-9]*` +- **sni**=domain.com - замена sni на конкретный домен +- **padencap** - подкорректировать blob таким образом, чтобы payload стал частью padding extension. payload может быть произвольным. + + ### Управление выполнением инстансов #### instance_cutoff @@ -3024,6 +3156,26 @@ function del_ip6_exthdr(ip6, idx) function fix_ip6_next(ip6, last_proto) ``` +### ip protocol + +``` +function ip_proto_l3(dis) +function ip_proto_l4(dis) +function ip_proto(dis) +``` + +Функции "додумывают" ip protocol полезной нагрузки диссекта dis. + +* ip_proto_l3 - ipv4 - ip.ip_p , ipv6 - ip6.ip6_nxt или next из последнего extension header. nil, если next пуст. +* ip_proto_l4 - IPPROTO_TCP, IPPROTO_UDP, IPPROTO_ICMP, IPPROTO_UDP в зависимости от наличия в диссекте tcp,udp,icmp,ip6. nil, если tcp,udp,icmp отсутствуют. +* ip_proto - ip_proto_l4. если он вернул nil, то ip_proto_l3. + +``` +function fix_ip_proto(dis, proto) +``` + +Установить протокол полезной нагрузки диссекта dis как proto. Если proto не задан - использовать результат ip_proto(dis). + ### packet_len Эти функции работают с диссектом ipv6 заголовка ip6 и его extension headers - ip6.exthdr. @@ -3310,6 +3462,23 @@ function dis_reverse(dis) Поменять местами ip адреса и порты src/dst и seq/ack. +## IP адреса и интерфейсы + +``` +function update_ifaddrs() +``` + +Обертка вокруг C функции [get_ifaddrs](#get-ifaddrs). Может так случиться, что надо узнавать адреса на каждом пакете. +Каждый раз дергать get_ifaddrs тяжело для системы. Адреса и интерфейсы меняются редко. Хотелось бы из закэшировать. +update_ifaddrs() берет на себя функцию ведения кэша, который обновляется не чаще 1 раза в секунду. +Результат кладется в глобальную переменную ifaddrs. + +``` +function ip2ifname(ip) +``` + +Получить имя интерфейса, на котором находится ip адрес, используя кэш ifaddrs. nil, если не найден. + ## Отсылка Следующие функции могут брать несколько блоков описанных выше опций, каждый из которых представлен полем параметра options. @@ -3676,7 +3845,7 @@ function syndata(ctx, desync) - arg: [standard reconstruct](#standard-reconstruct) - arg: [standard rawsend](#standard-rawsend) - arg: blob - [blob](#передача-блобов), содержащий фейковый payload. Должен помещаться в один пакет, сегментация невозможна. -- arg: tls_mod - применить указанный tls_mod к пейлоаду blob +- arg: tls_mod - применить указанный [tls_mod](#tls_mod) к пейлоаду blob Функция добавляет в tcp SYN пакет пейлоад, применяет к нему модификации и отправляет вместо оригинала, вынося VERDICT_DROP. Если проходит пакет без SYN, выполняется [instance cutoff](#instance_cutoff). @@ -3727,7 +3896,7 @@ function fake(ctx, desync) - arg: [standard rawsend](#standard-rawsend) - arg: blob - blob, содержащий фейковый payload. Может быть любой длины - сегментация выполняется автоматически. - arg: optional - отказ от операции, если blob отсутствует -- arg: tls_mod - применить указанный tls_mod к пейлоаду blob +- arg: tls_mod - применить указанный [tls_mod](#tls_mod) к пейлоаду blob - payload фильтр по умолчанию - "known" Это прямой фейк - отдельный пакет или группа пакетов. Функция не выносит вердикт и не блокирует отправку оригинала.