mirror of
https://github.com/bol-van/zapret.git
synced 2025-04-20 22:12:58 +03:00
Compare commits
13 Commits
33d3059dc8
...
6fc4e75d89
Author | SHA1 | Date | |
---|---|---|---|
|
6fc4e75d89 | ||
|
fb894a8e2c | ||
|
86352430d4 | ||
|
e5f20d05f6 | ||
|
b610f08a9c | ||
|
8bbd2d97d5 | ||
|
972f665d88 | ||
|
a9a497fa77 | ||
|
14a170c9a3 | ||
|
d4080b6c6f | ||
|
20f1fb2cfd | ||
|
35c3216287 | ||
|
628f629c49 |
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
blank_issues_enabled: false
|
@ -1,10 +1,19 @@
|
|||||||
|
---
|
||||||
|
name: bugs
|
||||||
|
about: do not write lame questions
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
1. Здесь не место для вопросов, касающихся компьютерной грамотности и навыков использования ОС
|
1. Здесь не место для вопросов, касающихся компьютерной грамотности и навыков использования ОС
|
||||||
2. Здесь не место для вопросов "у меня не работает" без технических подробностей
|
2. Здесь не место для вопросов "у меня не работает" без технических подробностей
|
||||||
3. Здесь не место для вопросов "как мне открыть ютуб", "что писать в ...", "перестало открываться".
|
3. Здесь не место для вопросов "как мне открыть ютуб", "что писать в ...", "перестало открываться".
|
||||||
4. Здесь не место для обсуждения сборок
|
4. Здесь не место для обсуждения сборок
|
||||||
5. Вирусов здесь нет. У вас либо чья-то сборка, либо ваш антивирус давно пора отправить на покой. Антивирусы в основном жалуются на upx и windivert, которые убраны НЕ будут. Не согласны - удаляйте софт. За агрессивные наезды "почему автор распространяет вирусы" молча схватите бан.
|
5. Вирусов здесь нет. У вас либо чья-то сборка, либо ваш антивирус давно пора отправить на покой. Антивирусы в основном жалуются на upx и windivert, которые убраны НЕ будут. upx - это паковщик для сокращения требуемого места на openwrt, windivert - замена iptables для windows, потенциальный инструмент хакера или компонент зловредной программы, но сам по себе вирусом не является. Не согласны - удаляйте софт. За агрессивные наезды "почему автор распространяет вирусы" молча схватите бан.
|
||||||
|
|
||||||
Все означенное обсуждать в дискуссиях или на форумах.
|
Все означенное обсуждать в дискуссиях или на форумах.
|
||||||
При нарушении будет закрываться или конвертироваться в дискуссии.
|
При нарушении будет закрываться или конвертироваться в дискуссии.
|
||||||
Issue только для обсуждения проблем самого софта. Неработа стратегии или ваше неумение настроить - это ваша проблема, а не проблема софта.
|
Issue только для обсуждения проблем самого софта. Неработа стратегии или ваше неумение настроить - это ваша проблема, а не проблема софта.
|
||||||
|
Однокнопочные решения дают только сборщики, поэтому "открытие сайта" не является функцией программы, и нет смысла жаловаться, что он не открывается. Но можно это обсудить в дискуссиях. Не захламляйте issues !
|
9
.github/workflows/build.yml
vendored
9
.github/workflows/build.yml
vendored
@ -327,11 +327,12 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
env:
|
env:
|
||||||
ABI: ${{ matrix.abi }}
|
ABI: ${{ matrix.abi }}
|
||||||
|
API: 21
|
||||||
TARGET: ${{ matrix.target }}
|
TARGET: ${{ matrix.target }}
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
run: |
|
run: |
|
||||||
DEPS_DIR=$GITHUB_WORKSPACE/deps
|
DEPS_DIR=$GITHUB_WORKSPACE/deps
|
||||||
export TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64
|
export TOOLCHAIN=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64
|
||||||
export API=21
|
|
||||||
export CC="$TOOLCHAIN/bin/clang --target=$TARGET$API"
|
export CC="$TOOLCHAIN/bin/clang --target=$TARGET$API"
|
||||||
export AR=$TOOLCHAIN/bin/llvm-ar
|
export AR=$TOOLCHAIN/bin/llvm-ar
|
||||||
export AS=$CC
|
export AS=$CC
|
||||||
@ -360,6 +361,12 @@ jobs:
|
|||||||
CFLAGS="-DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }} -I$DEPS_DIR/include" \
|
CFLAGS="-DZAPRET_GH_VER=${{ github.ref_name }} -DZAPRET_GH_HASH=${{ github.sha }} -I$DEPS_DIR/include" \
|
||||||
LDFLAGS="-L$DEPS_DIR/lib" \
|
LDFLAGS="-L$DEPS_DIR/lib" \
|
||||||
make -C zapret android -j$(nproc)
|
make -C zapret android -j$(nproc)
|
||||||
|
|
||||||
|
# strip unwanted ELF sections to prevent warnings on old Android versions
|
||||||
|
gh api repos/termux/termux-elf-cleaner/releases/latest --jq '.tag_name' |\
|
||||||
|
xargs -I{} wget -O elf-cleaner https://github.com/termux/termux-elf-cleaner/releases/download/{}/termux-elf-cleaner
|
||||||
|
chmod +x elf-cleaner
|
||||||
|
./elf-cleaner --api-level $API zapret/binaries/my/*
|
||||||
zip zapret-android-$ABI.zip -j zapret/binaries/my/*
|
zip zapret-android-$ABI.zip -j zapret/binaries/my/*
|
||||||
|
|
||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
|
@ -1157,13 +1157,16 @@ pktws_curl_test_update_vary()
|
|||||||
# $4 - desync mode
|
# $4 - desync mode
|
||||||
# $5,$6,... - strategy
|
# $5,$6,... - strategy
|
||||||
|
|
||||||
local testf=$1 sec=$2 domain=$3 desync=$4 proto zerofake= splits= pos fake ret=1
|
local testf=$1 sec=$2 domain=$3 desync=$4 proto zerofake= tlsmod= splits= pos fake ret=1
|
||||||
|
|
||||||
shift; shift; shift; shift
|
shift; shift; shift; shift
|
||||||
|
|
||||||
proto=http
|
proto=http
|
||||||
[ "$sec" = 0 ] || proto=tls
|
[ "$sec" = 0 ] || proto=tls
|
||||||
test_has_fake $desync && zerofake="--dpi-desync-fake-$proto=0x00000000"
|
test_has_fake $desync && {
|
||||||
|
zerofake="--dpi-desync-fake-$proto=0x00000000"
|
||||||
|
[ "$sec" = 0 ] || tlsmod="--dpi-desync-fake-tls-mod=rnd,rndsni,padencap"
|
||||||
|
}
|
||||||
if test_has_fakedsplit $desync ; then
|
if test_has_fakedsplit $desync ; then
|
||||||
splits="method+2 midsld"
|
splits="method+2 midsld"
|
||||||
[ "$sec" = 0 ] || splits="1 midsld"
|
[ "$sec" = 0 ] || splits="1 midsld"
|
||||||
@ -1171,7 +1174,7 @@ pktws_curl_test_update_vary()
|
|||||||
splits="method+2 midsld"
|
splits="method+2 midsld"
|
||||||
[ "$sec" = 0 ] || splits="1 midsld 1,midsld"
|
[ "$sec" = 0 ] || splits="1 midsld 1,midsld"
|
||||||
fi
|
fi
|
||||||
for fake in '' $zerofake ; do
|
for fake in '' $zerofake $tlsmod ; do
|
||||||
if [ -n "$splits" ]; then
|
if [ -n "$splits" ]; then
|
||||||
for pos in $splits ; do
|
for pos in $splits ; do
|
||||||
pktws_curl_test_update $testf $domain --dpi-desync=$desync "$@" --dpi-desync-split-pos=$pos $fake && {
|
pktws_curl_test_update $testf $domain --dpi-desync=$desync "$@" --dpi-desync-split-pos=$pos $fake && {
|
||||||
|
@ -451,3 +451,4 @@ nfqws: apply split+seqovl only to the first reasm fragment
|
|||||||
install_easy: dnf packager support
|
install_easy: dnf packager support
|
||||||
nfqws,tpws: hostlist/ipset track not only file mod time but also file size
|
nfqws,tpws: hostlist/ipset track not only file mod time but also file size
|
||||||
nfqws,tpws,ipset: return lists reload on HUP
|
nfqws,tpws,ipset: return lists reload on HUP
|
||||||
|
nfqws,blockcheck: --dpi-desync-fake-tls-mod
|
||||||
|
@ -19,6 +19,7 @@ ___
|
|||||||
- [nfqws](#nfqws)
|
- [nfqws](#nfqws)
|
||||||
- [DPI desync attack](#dpi-desync-attack)
|
- [DPI desync attack](#dpi-desync-attack)
|
||||||
- [Fakes](#fakes)
|
- [Fakes](#fakes)
|
||||||
|
- [Fake mods](#fake-mods)
|
||||||
- [TCP segmentation](#tcp-segmentation)
|
- [TCP segmentation](#tcp-segmentation)
|
||||||
- [Sequence numbers overlap](#sequence-numbers-overlap)
|
- [Sequence numbers overlap](#sequence-numbers-overlap)
|
||||||
- [ipv6 specific modes](#ipv6-specific-modes)
|
- [ipv6 specific modes](#ipv6-specific-modes)
|
||||||
@ -172,6 +173,7 @@ nfqws takes the following parameters:
|
|||||||
--dpi-desync-any-protocol=0|1 ; 0(default)=desync only http and tls 1=desync any nonempty data packet
|
--dpi-desync-any-protocol=0|1 ; 0(default)=desync only http and tls 1=desync any nonempty data packet
|
||||||
--dpi-desync-fake-http=<filename>|0xHEX ; file containing fake http request
|
--dpi-desync-fake-http=<filename>|0xHEX ; file containing fake http request
|
||||||
--dpi-desync-fake-tls=<filename>|0xHEX ; file containing fake TLS ClientHello (for https)
|
--dpi-desync-fake-tls=<filename>|0xHEX ; file containing fake TLS ClientHello (for https)
|
||||||
|
--dpi-desync-fake-tls-mod=mod[,mod] ; comma separated list of TLS fake mods. available mods : none,rnd,rndsni,padencap
|
||||||
--dpi-desync-fake-unknown=<filename>|0xHEX ; file containing unknown protocol fake payload
|
--dpi-desync-fake-unknown=<filename>|0xHEX ; file containing unknown protocol fake payload
|
||||||
--dpi-desync-fake-syndata=<filename>|0xHEX ; file containing SYN data payload
|
--dpi-desync-fake-syndata=<filename>|0xHEX ; file containing SYN data payload
|
||||||
--dpi-desync-fake-quic=<filename>|0xHEX ; file containing fake QUIC Initial
|
--dpi-desync-fake-quic=<filename>|0xHEX ; file containing fake QUIC Initial
|
||||||
@ -260,6 +262,21 @@ Fakes are separate generated by nfqws packets carrying false information for DPI
|
|||||||
|
|
||||||
`--dpi-desync-fooling` takes multiple comma separated values.
|
`--dpi-desync-fooling` takes multiple comma separated values.
|
||||||
|
|
||||||
|
### FAKE mods
|
||||||
|
|
||||||
|
**nfqws** has built-in TLS fake. It can be customized with `--dpi-desync-fake-tls` option.
|
||||||
|
Customized fake data can be anything - valid TLS Client Hello or arbitrary data.
|
||||||
|
It's possible to use TLS Client Hello with any fingerprint and any SNI.
|
||||||
|
|
||||||
|
**nfqws** can do some modifications of valid TLS Client Hello fakes in runtime with `--dpi-desync-fake-tls-mod` option.
|
||||||
|
|
||||||
|
* `none`. Do not do any mods.
|
||||||
|
* `rnd`. Randomize `random` and `session id` fields. Applied on every request.
|
||||||
|
* `rndsni`. Randomize SNI. If SNI >=7 symbols random SLD is applied with known TLD. Otherwise filled with random symbols. Applied only once at startup.
|
||||||
|
* `padencap`. Padding extension is extended by original TLS Client Hello size (including multi packet variation with kyber). Padding extension is added to the end if not present, otherwise it must be the last extension. All lengths are increased. Fake size is not changed. Can be useful if DPI does not analyze sequence numbers properly. Applied on every request.
|
||||||
|
|
||||||
|
By default if custom fake is not defined `rnd,rndsni` mods are applied. If defined - `none`.
|
||||||
|
This behaviour is compatible with previous versions.
|
||||||
|
|
||||||
### TCP segmentation
|
### TCP segmentation
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ zapret является свободным и open source.
|
|||||||
- [nfqws](#nfqws)
|
- [nfqws](#nfqws)
|
||||||
- [АТАКА ДЕСИНХРОНИЗАЦИИ DPI](#атака-десинхронизации-dpi)
|
- [АТАКА ДЕСИНХРОНИЗАЦИИ DPI](#атака-десинхронизации-dpi)
|
||||||
- [ФЕЙКИ](#фейки)
|
- [ФЕЙКИ](#фейки)
|
||||||
|
- [МОДИФИКАЦИЯ ФЕЙКОВ](#модификация-фейков)
|
||||||
- [TCP СЕГМЕНТАЦИЯ](#tcp-сегментация)
|
- [TCP СЕГМЕНТАЦИЯ](#tcp-сегментация)
|
||||||
- [ПЕРЕКРЫТИЕ SEQUENCE NUMBERS](#перекрытие-sequence-numbers)
|
- [ПЕРЕКРЫТИЕ SEQUENCE NUMBERS](#перекрытие-sequence-numbers)
|
||||||
- [СПЕЦИФИЧЕСКИЕ РЕЖИМЫ IPV6](#специфические-режимы-ipv6)
|
- [СПЕЦИФИЧЕСКИЕ РЕЖИМЫ IPV6](#специфические-режимы-ipv6)
|
||||||
@ -193,6 +194,7 @@ dvtws, собираемый из тех же исходников (см. [док
|
|||||||
--dpi-desync-any-protocol=0|1 ; 0(default)=работать только по http request и tls clienthello 1=по всем непустым пакетам данных
|
--dpi-desync-any-protocol=0|1 ; 0(default)=работать только по http request и tls clienthello 1=по всем непустым пакетам данных
|
||||||
--dpi-desync-fake-http=<filename>|0xHEX ; файл, содержащий фейковый http запрос для dpi-desync=fake, на замену стандартному www.iana.org
|
--dpi-desync-fake-http=<filename>|0xHEX ; файл, содержащий фейковый http запрос для dpi-desync=fake, на замену стандартному www.iana.org
|
||||||
--dpi-desync-fake-tls=<filename>|0xHEX ; файл, содержащий фейковый tls clienthello для dpi-desync=fake, на замену стандартному
|
--dpi-desync-fake-tls=<filename>|0xHEX ; файл, содержащий фейковый tls clienthello для dpi-desync=fake, на замену стандартному
|
||||||
|
--dpi-desync-fake-tls-mod=mod[,mod] ; список через запятую режимов runtime модификации фейков : none,rnd,rndsni,padencap
|
||||||
--dpi-desync-fake-unknown=<filename>|0xHEX ; файл, содержащий фейковый пейлоад неизвестного протокола для dpi-desync=fake, на замену стандартным нулям 256 байт
|
--dpi-desync-fake-unknown=<filename>|0xHEX ; файл, содержащий фейковый пейлоад неизвестного протокола для dpi-desync=fake, на замену стандартным нулям 256 байт
|
||||||
--dpi-desync-fake-syndata=<filename>|0xHEX ; файл, содержащий фейковый пейлоад пакета SYN для режима десинхронизации syndata
|
--dpi-desync-fake-syndata=<filename>|0xHEX ; файл, содержащий фейковый пейлоад пакета SYN для режима десинхронизации syndata
|
||||||
--dpi-desync-fake-quic=<filename>|0xHEX ; файл, содержащий фейковый QUIC Initial
|
--dpi-desync-fake-quic=<filename>|0xHEX ; файл, содержащий фейковый QUIC Initial
|
||||||
@ -312,6 +314,24 @@ dvtws, собираемый из тех же исходников (см. [док
|
|||||||
|
|
||||||
Режимы дурения могут сочетаться в любых комбинациях. `--dpi-desync-fooling` берет множество значений через запятую.
|
Режимы дурения могут сочетаться в любых комбинациях. `--dpi-desync-fooling` берет множество значений через запятую.
|
||||||
|
|
||||||
|
### МОДИФИКАЦИЯ ФЕЙКОВ
|
||||||
|
|
||||||
|
В nfqws зашит базовый вариант фейка для TLS. Его можно переопределить опцией `--dpi-desync-fake-tls`.
|
||||||
|
Переопределение фейков дает возможность использовать любые данные в качестве фейка для TLS.
|
||||||
|
Можно использовать фейковый Client Hello с любым фингерпринтом и с любым SNI.
|
||||||
|
|
||||||
|
Некоторые модификации можно делать в процессе выполнения с помощью `--dpi-desync-fake-tls-mod`.
|
||||||
|
Часть из них работает при обработке каждого TLS Client Hello и может подстраиваться под отправляемые данные.
|
||||||
|
Модификации требуют наличия полного валидного TLS Client Hello в качестве фейка, они не работают с произвольными данными.
|
||||||
|
|
||||||
|
* `none`. Не применять никакие модификации.
|
||||||
|
* `rnd`. Рандомизировать поля `random` и `session id`. Выполняется на каждый запрос.
|
||||||
|
* `rndsni`. Рандомизировать SNI. Если SNI >=7 символов, применяется случайный домен 2 уровня с известным TLD, иначе заполняется случайными символами без точки. Выполняется один раз при старте.
|
||||||
|
* `padencap`. Расширяется padding extension на размер передаваемого TLS Client Hello (включая многопакетный вариант с kyber). Если padding отсутствует, он добавляется в конец. Если присутствует - требуется, чтобы padding шел последним extension. Правятся все длины, чтобы создать видимость включения передаваемого TLS Client Hello в padding extension. Размер фейка не изменяется. Расчет идет на DPI, который не анализирует sequence numbers должным образом. Выполняется на каждый запрос.
|
||||||
|
|
||||||
|
По умолчанию если не задан собственный фейк для TLS используются модификации `rnd,rndsni`. Если фейк задан, используется `none`.
|
||||||
|
Это соответствует поведению программы более старых версий.
|
||||||
|
|
||||||
### TCP СЕГМЕНТАЦИЯ
|
### TCP СЕГМЕНТАЦИЯ
|
||||||
|
|
||||||
* `multisplit`. нарезаем запрос на указанных в `--dpi-desync-split-pos` позициях.
|
* `multisplit`. нарезаем запрос на указанных в `--dpi-desync-split-pos` позициях.
|
||||||
|
20
nfq/nfqws.c
20
nfq/nfqws.c
@ -1025,9 +1025,19 @@ static void onetime_tls_mod(struct desync_profile *dp)
|
|||||||
}
|
}
|
||||||
if (dp->fake_tls_mod & FAKE_TLS_MOD_RND_SNI)
|
if (dp->fake_tls_mod & FAKE_TLS_MOD_RND_SNI)
|
||||||
{
|
{
|
||||||
if (!TLSFindExt(dp->fake_tls,dp->fake_tls_size,0,&ext,&extlen,false) || !TLSAdvanceToHostInSNI(&ext,&extlen,&slen))
|
if (!TLSFindExt(dp->fake_tls,dp->fake_tls_size,0,&ext,&extlen,false))
|
||||||
{
|
{
|
||||||
DLOG_ERR("profile %d rndsni set but tls fake structure invalid or does not have SNI\n", dp->n);
|
DLOG_ERR("profile %d rndsni set but tls fake does not have SNI\n", dp->n);
|
||||||
|
exit_clean(1);
|
||||||
|
}
|
||||||
|
if (!TLSAdvanceToHostInSNI(&ext,&extlen,&slen))
|
||||||
|
{
|
||||||
|
DLOG_ERR("profile %d rndsni set but tls fake has invalid SNI structure\n", dp->n);
|
||||||
|
exit_clean(1);
|
||||||
|
}
|
||||||
|
if (!slen)
|
||||||
|
{
|
||||||
|
DLOG_ERR("profile %d rndsni set but tls fake has zero sized SNI\n", dp->n);
|
||||||
exit_clean(1);
|
exit_clean(1);
|
||||||
}
|
}
|
||||||
uint8_t *sni = dp->fake_tls + (ext - dp->fake_tls);
|
uint8_t *sni = dp->fake_tls + (ext - dp->fake_tls);
|
||||||
@ -1035,7 +1045,7 @@ static void onetime_tls_mod(struct desync_profile *dp)
|
|||||||
char *s1=NULL, *s2=NULL;
|
char *s1=NULL, *s2=NULL;
|
||||||
if (params.debug)
|
if (params.debug)
|
||||||
{
|
{
|
||||||
if (s1 = malloc(slen+1))
|
if ((s1 = malloc(slen+1)))
|
||||||
{
|
{
|
||||||
memcpy(s1,sni,slen); s1[slen]=0;
|
memcpy(s1,sni,slen); s1[slen]=0;
|
||||||
}
|
}
|
||||||
@ -1048,7 +1058,7 @@ static void onetime_tls_mod(struct desync_profile *dp)
|
|||||||
sni[slen-4] = '.';
|
sni[slen-4] = '.';
|
||||||
memcpy(sni+slen-3,tld[random()%(sizeof(tld)/sizeof(*tld))],3);
|
memcpy(sni+slen-3,tld[random()%(sizeof(tld)/sizeof(*tld))],3);
|
||||||
}
|
}
|
||||||
else if (slen>=1)
|
else
|
||||||
fill_random_az09(sni+1,slen-1);
|
fill_random_az09(sni+1,slen-1);
|
||||||
|
|
||||||
if (params.debug)
|
if (params.debug)
|
||||||
@ -1281,7 +1291,7 @@ static void exithelp(void)
|
|||||||
" --dpi-desync-any-protocol=0|1\t\t\t; 0(default)=desync only http and tls 1=desync any nonempty data packet\n"
|
" --dpi-desync-any-protocol=0|1\t\t\t; 0(default)=desync only http and tls 1=desync any nonempty data packet\n"
|
||||||
" --dpi-desync-fake-http=<filename>|0xHEX\t; file containing fake http request\n"
|
" --dpi-desync-fake-http=<filename>|0xHEX\t; file containing fake http request\n"
|
||||||
" --dpi-desync-fake-tls=<filename>|0xHEX\t\t; file containing fake TLS ClientHello (for https)\n"
|
" --dpi-desync-fake-tls=<filename>|0xHEX\t\t; file containing fake TLS ClientHello (for https)\n"
|
||||||
" --dpi-desync-fake-tls-mod=mod[,mod]\t\t; comma list of TLS fake mods. available mods : none,rnd,rndsni,padencap\n"
|
" --dpi-desync-fake-tls-mod=mod[,mod]\t\t; comma separated list of TLS fake mods. available mods : none,rnd,rndsni,padencap\n"
|
||||||
" --dpi-desync-fake-unknown=<filename>|0xHEX\t; file containing unknown protocol fake payload\n"
|
" --dpi-desync-fake-unknown=<filename>|0xHEX\t; file containing unknown protocol fake payload\n"
|
||||||
" --dpi-desync-fake-syndata=<filename>|0xHEX\t; file containing SYN data payload\n"
|
" --dpi-desync-fake-syndata=<filename>|0xHEX\t; file containing SYN data payload\n"
|
||||||
" --dpi-desync-fake-quic=<filename>|0xHEX\t; file containing fake QUIC Initial\n"
|
" --dpi-desync-fake-quic=<filename>|0xHEX\t; file containing fake QUIC Initial\n"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user