mirror of
https://github.com/bol-van/zapret2.git
synced 2026-03-14 06:13:09 +00:00
update docs
This commit is contained in:
@@ -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
|
||||
|
||||
199
docs/manual.md
199
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=<filename> ; запись 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=<filename> ; фильтр профиля : включающий список ip адресов или подсетей из файла. может быть смешанным ipv4+ipv6.
|
||||
--ipset-ip=<ip_list> ; фильтр профиля : включающий фиксированный список 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<br>IPPROTO_IPV6<br>IPPROTO_ICMP<br>IPPROTO_TCP<br>IPPROTO_UDP<br>IPPROTO_ICMPV6<br>IPPROTO_HOPOPTS<br>IPPROTO_ROUTING<br>IPPROTO_FRAGMENT<br>IPPROTO_AH<br>IPPROTO_ESP<br>IPPROTO_DSTOPTS<br>IPPROTO_MH<br>IPPROTO_HIP<br>IPPROTO_SHIM6<br>IPPROTO_NONE | number | [номера IP протоколов](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) | используются в ipv4 и ipv6 |
|
||||
| IPPROTO_IP<br>IIPPROTO_IPV6<br>IPPROTO_IPIP<br>IPPROTO_ICMP<br>IPPROTO_ICMPV6<br>IPPROTO_TCP<br>IPPROTO_UDP<br>IPPROTO_SCTP<br>IPPROTO_HOPOPTS<br>IPPROTO_ROUTING<br>IPPROTO_FRAGMENT<br>IPPROTO_AH<br>IPPROTO_ESP<br>IPPROTO_DSTOPTS<br>IPPROTO_MH<br>IPPROTO_HIP<br>IPPROTO_SHIM6<br>IPPROTO_NONE | number | [номера IP протоколов](https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml) | используются в ipv4 и ipv6 |
|
||||
| ICMP_ECHOREPLY<br>ICMP_DEST_UNREACH<br>ICMP_REDIRECT<br>ICMP_ECHO<br>ICMP_TIME_EXCEEDED<brICMP_PARAMETERPROB<br>ICMP_TIMESTAMP<br>ICMP_TIMESTAMPREPLY<br>ICMP_INFO_REQUEST<br>ICMP_INFO_REPLY | number | типы icmp |
|
||||
| ICMP_UNREACH_NET<br>ICMP_UNREACH_HOST<br>ICMP_UNREACH_PROTOCOL<br>ICMP_UNREACH_PORT<br>ICMP_UNREACH_NEEDFRAG<br>ICMP_UNREACH_SRCFAIL<br>ICMP_UNREACH_NET_UNKNOWN<br>ICMP_UNREACH_HOST_UNKNOWN<br>ICMP_UNREACH_NET_PROHIB<br>ICMP_UNREACH_HOST_PROHIB<br>ICMP_UNREACH_TOSNET<br>ICMP_UNREACH_TOSHOST<br>ICMP_UNREACH_FILTER_PROHIB<br>ICMP_UNREACH_HOST_PRECEDENCE<br>ICMP_UNREACH_PRECEDENCE_CUTOFF | number | коды icmp для destination unreachable |
|
||||
| ICMP_REDIRECT_NET<br>ICMP_REDIRECT_HOST<br>ICMP_REDIRECT_TOSNET<br>ICMP_REDIRECT_TOSHOST | number | коды icmp для icmp redirect |
|
||||
| ICMP_TIMXCEED_INTRANS<br>ICMP_TIMXCEED_REASS | number | коды icmp для time exceeded |
|
||||
| ICMP6_ECHO_REQUEST<br>ICMP6_ECHO_REPLY<br>ICMP6_DST_UNREACH<br>ICMP6_PACKET_TOO_BIG<br>ICMP6_TIME_EXCEEDED<br>ICMP6_PARAM_PROB<br>MLD_LISTENER_QUERY<br>MLD_LISTENER_REPORT<br>MLD_LISTENER_REDUCTION<br>ND_ROUTER_SOLICIT<br>ND_ROUTER_ADVERT<br>ND_NEIGHBOR_SOLICIT<br>ND_NEIGHBOR_ADVERT<br>ND_REDIRECT | number | типы icmpv6 |
|
||||
| ICMP6_DST_UNREACH_NOROUTE<br>ICMP6_DST_UNREACH_ADMIN<br>ICMP6_DST_UNREACH_BEYONDSCOPE<br>ICMP6_DST_UNREACH_ADDR<br>ICMP6_DST_UNREACH_NOPORT | number | коды icmpv6 для destination unreachable |
|
||||
| ICMP6_TIME_EXCEED_TRANSIT<br>ICMP6_TIME_EXCEED_REASSEMBLY | number | коды icmpv6 для time exceeded |
|
||||
| ICMP6_PARAMPROB_HEADER<br>ICMP6_PARAMPROB_NEXTHEADER<br>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<br>iftype<br>index6<br>speed_xmit<br>speed_recv<br>metric4<br>metric6<br>conntype<br> | 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"
|
||||
|
||||
Это прямой фейк - отдельный пакет или группа пакетов. Функция не выносит вердикт и не блокирует отправку оригинала.
|
||||
|
||||
Reference in New Issue
Block a user