From e3e7449d745e0bc37431f61514ce2dad2db2f113 Mon Sep 17 00:00:00 2001 From: bol-van Date: Thu, 21 Nov 2024 10:44:52 +0300 Subject: [PATCH 1/6] doc works --- docs/readme.md | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index a47b862..94d437c 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -424,29 +424,10 @@ DPI может отстать от потока, если ClientHello его у В документации по geneva это называется "TCB turnaround". Попытка ввести DPI в заблуждение относительно ролей клиента и сервера. -!!! Поскольку режим нарушает работу NAT, техника может сработать только если между атакующим устройством + +Поскольку режим нарушает работу NAT, техника может сработать только если между атакующим устройством и DPI нет NAT. Атака не сработает через NAT роутер, но может сработать с него. -Для реализации атаки в linux обязательно требуется отключить стандартное правило firewall, -дропающее инвалидные пакеты в цепочке OUTPUT. Например : `-A OUTPUT -m state --state INVALID -j DROP` -В openwrt можно отключить drop INVALID в OUTPUT и FORWARD через опцию в /etc/config/firewall: - -``` -config zone -option name 'wan' -......... -option masq_allow_invalid '1' -``` - -К сожалению, отключить только в OUTPUT таким образом нельзя. Но можно сделать иначе. Вписать в `/etc/firewall.user`: - -``` -iptables -D zone_wan_output -m comment --comment '!fw3' -j zone_wan_dest_ACCEPT -ip6tables -D zone_wan_output -m comment --comment '!fw3' -j zone_wan_dest_ACCEPT -``` - -Лучше делать так, потому что отсутствие дропа INVALID в FORWARD может привести к нежелательным утечкам пакетов из LAN. -Если не принять эти меры, отсылка SYN,ACK сегмента вызовет ошибку и операция будет прервана. -Остальные режимы тоже не сработают. Если поймете, что вам synack не нужен, обязательно верните правило дропа INVALID. +Для реализации атаки на проходящий трафик требуются nftables и схема [POSTNAT](#nftables-для-nfqws). ### РЕЖИМ SYNDATA @@ -480,7 +461,7 @@ conntrack - простенький, он не писался с учетом в `--wssize` позволяет изменить с клиента размер tcp window для сервера, чтобы он послал следующие ответы разбитыми на части. Чтобы это подействовало на все серверные ОС, необходимо менять window size в каждом исходящем с клиента пакете до отсылки сообщения, -ответ на который должен быть разбит (например, TLS ClientHello). Именно поэтому и необходим conntrack, чтобы +ответ на которое должен быть разбит (например, TLS ClientHello). Именно поэтому и необходим conntrack, чтобы знать когда надо остановиться. Если не остановиться и все время устанавливать низкий wssize, скорость упадет катастрофически. В linux это может быть купировано через connbytes, но в BSD системах такой возможности нет. В случае http(s) останавливаемся сразу после отсылки первого http запроса или TLS ClientHello. From 62b081e9fbbb6be8b7ea457fd5367cdd7a62acc9 Mon Sep 17 00:00:00 2001 From: bol-van Date: Thu, 21 Nov 2024 10:47:11 +0300 Subject: [PATCH 2/6] doc works --- docs/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readme.md b/docs/readme.md index 94d437c..d0972a9 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -502,7 +502,7 @@ nfqws поддерживает реассемблинг некоторых ви На текущий момент это TLS и QUIC ClientHello. Они бывает длинными, если в chrome включить пост-квантовую криптографию tls-kyber, и занимают как правило 2 или 3 пакета. kyber включен по умолчанию, начиная с chromium 124. chrome рандомизирует фингерпринт TLS. SNI может оказаться как в начале, так и в конце, то есть -попасть любой пакет. stateful DPI обычно реассемблирует запрос целиком, и только потом +попасть в любой пакет. stateful DPI обычно реассемблирует запрос целиком, и только потом принимает решение о блокировке. В случае получения TLS или QUIC пакета с частичным ClientHello начинается процесс сборки, а пакеты задерживаются и не отсылаются до ее окончания. По окончании сборки пакеты проходит через десинхронизацию From 182fe850db814249b9d0dd1a558349c4071b1141 Mon Sep 17 00:00:00 2001 From: bol-van Date: Thu, 21 Nov 2024 15:25:19 +0300 Subject: [PATCH 3/6] makefiles: use lto --- ip2net/Makefile | 2 +- nfq/BSDmakefile | 2 +- nfq/Makefile | 3 +-- tpws/BSDmakefile | 2 +- tpws/Makefile | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ip2net/Makefile b/ip2net/Makefile index b144893..5893f58 100644 --- a/ip2net/Makefile +++ b/ip2net/Makefile @@ -1,5 +1,5 @@ CC ?= gcc -CFLAGS += -std=gnu99 -Os +CFLAGS += -std=gnu99 -Os -flto=auto CFLAGS_BSD = -Wno-address-of-packed-member CFLAGS_WIN = -static LIBS = diff --git a/nfq/BSDmakefile b/nfq/BSDmakefile index e782a07..8c611c0 100644 --- a/nfq/BSDmakefile +++ b/nfq/BSDmakefile @@ -1,5 +1,5 @@ CC ?= cc -CFLAGS += -std=gnu99 -s -Os -Wno-address-of-packed-member +CFLAGS += -std=gnu99 -s -Os -Wno-address-of-packed-member -flto=auto LIBS = -lz SRC_FILES = *.c crypto/*.c diff --git a/nfq/Makefile b/nfq/Makefile index 92adf99..3a2659a 100644 --- a/nfq/Makefile +++ b/nfq/Makefile @@ -1,7 +1,6 @@ CC ?= gcc CFLAGS += -std=gnu99 -Os -CFLAGS_BSD = -Wno-address-of-packed-member -CFLAGS_MAC = -mmacosx-version-min=10.8 +CFLAGS_BSD = -Wno-address-of-packed-member -flto=auto CFLAGS_CYGWIN = -Wno-address-of-packed-member -static LIBS_LINUX = -lnetfilter_queue -lnfnetlink -lz LIBS_BSD = -lz diff --git a/tpws/BSDmakefile b/tpws/BSDmakefile index c86e4bd..922ca61 100644 --- a/tpws/BSDmakefile +++ b/tpws/BSDmakefile @@ -1,5 +1,5 @@ CC ?= cc -CFLAGS += -std=gnu99 -s -Os +CFLAGS += -std=gnu99 -s -Os -flto=auto LIBS = -lz -lpthread SRC_FILES = *.c diff --git a/tpws/Makefile b/tpws/Makefile index 00814c4..3d6624d 100644 --- a/tpws/Makefile +++ b/tpws/Makefile @@ -1,5 +1,5 @@ CC ?= gcc -CFLAGS += -std=gnu99 -Os +CFLAGS += -std=gnu99 -Os -flto=auto CFLAGS_BSD = -Wno-address-of-packed-member LIBS = -lz -lpthread LIBS_ANDROID = -lz From 1b14a8210ce8e871104845a373e4e95b2b582161 Mon Sep 17 00:00:00 2001 From: bol-van Date: Thu, 21 Nov 2024 15:44:18 +0300 Subject: [PATCH 4/6] readme: more precise marker definition --- docs/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index d0972a9..4eb896f 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -325,9 +325,9 @@ dvtws, собираемый из тех же исходников (см. [док * **method** - начало метода HTTP ('GET', 'POST', 'HEAD', ...). Метод обычно всегда находится на позиции 0, но поддерживается и нахождение метода после дурение методом `--methodeol` от tpws. Тогда позиция может стать 1 или 2. * **host** - начало имени хоста в известном протоколе (http, TLS) -* **endhost** - конец имени хоста +* **endhost** - байт, следующий за последним байтом имени хоста * **sld** - начало домена 2 уровня в имени хоста -* **endsld** - конец домена 2 уровня в имени хоста +* **endsld** - байт, следующий за последним байтом домена 2 уровня в имени хоста * **midsld** - середина домена 2 уровня в имени хоста * **sniext** - начало поля данных SNI extension в TLS. Любой extension состоит из 2-байтовых полей type и length, за ними идет поле данных. From 6b85884cdf45f50e36a4cf4a5848a4a3e025d78f Mon Sep 17 00:00:00 2001 From: bol-van Date: Thu, 21 Nov 2024 20:30:23 +0300 Subject: [PATCH 5/6] update keentic fix script --- init.d/sysv/custom.d.examples/10-keenetic-udp-fix | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/init.d/sysv/custom.d.examples/10-keenetic-udp-fix b/init.d/sysv/custom.d.examples/10-keenetic-udp-fix index e04706c..554e6fb 100644 --- a/init.d/sysv/custom.d.examples/10-keenetic-udp-fix +++ b/init.d/sysv/custom.d.examples/10-keenetic-udp-fix @@ -8,12 +8,13 @@ zapret_custom_firewall() { # $1 - 1 - add, 0 - stop - local wan wanif + local wan wanif rule # use IFACE_WAN if defined. if not - search for interfaces with default route. wanif=${IFACE_WAN:-$(sed -nre 's/^([^\t]+)\t00000000\t[0-9A-F]{8}\t[0-9A-F]{4}\t[0-9]+\t[0-9]+\t[0-9]+\t00000000.*$/\1/p' /proc/net/route | sort -u | xargs)} for wan in $wanif; do - ipt_print_op $1 "-o $wan -j MASQUERADE" "keenetic udp fix" - ipt_add_del $1 POSTROUTING -t nat -o $wan -j MASQUERADE + rule="-o $wan -p udp -m mark --mark $DESYNC_MARK/$DESYNC_MARK" + ipt_print_op $1 "$rule" "keenetic udp fix" + ipt_add_del $1 POSTROUTING -t nat $rule -j MASQUERADE done } From 09378553b9f006551c142c6320fc3be217054a02 Mon Sep 17 00:00:00 2001 From: bol-van Date: Thu, 21 Nov 2024 20:35:27 +0300 Subject: [PATCH 6/6] keenetic script check disable ipv4 --- .../sysv/custom.d.examples/10-keenetic-udp-fix | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/init.d/sysv/custom.d.examples/10-keenetic-udp-fix b/init.d/sysv/custom.d.examples/10-keenetic-udp-fix index 554e6fb..f9cab11 100644 --- a/init.d/sysv/custom.d.examples/10-keenetic-udp-fix +++ b/init.d/sysv/custom.d.examples/10-keenetic-udp-fix @@ -10,11 +10,13 @@ zapret_custom_firewall() local wan wanif rule - # use IFACE_WAN if defined. if not - search for interfaces with default route. - wanif=${IFACE_WAN:-$(sed -nre 's/^([^\t]+)\t00000000\t[0-9A-F]{8}\t[0-9A-F]{4}\t[0-9]+\t[0-9]+\t[0-9]+\t00000000.*$/\1/p' /proc/net/route | sort -u | xargs)} - for wan in $wanif; do - rule="-o $wan -p udp -m mark --mark $DESYNC_MARK/$DESYNC_MARK" - ipt_print_op $1 "$rule" "keenetic udp fix" - ipt_add_del $1 POSTROUTING -t nat $rule -j MASQUERADE - done + [ "$DISABLE_IPV4" = "1" ] || { + # use IFACE_WAN if defined. if not - search for interfaces with default route. + wanif=${IFACE_WAN:-$(sed -nre 's/^([^\t]+)\t00000000\t[0-9A-F]{8}\t[0-9A-F]{4}\t[0-9]+\t[0-9]+\t[0-9]+\t00000000.*$/\1/p' /proc/net/route | sort -u | xargs)} + for wan in $wanif; do + rule="-o $wan -p udp -m mark --mark $DESYNC_MARK/$DESYNC_MARK" + ipt_print_op $1 "$rule" "keenetic udp fix" + ipt_add_del $1 POSTROUTING -t nat $rule -j MASQUERADE + done + } }