zapret icon indicating copy to clipboard operation
zapret copied to clipboard

Добавить новые возможности

Open Fenrir-0xFF opened this issue 1 year ago • 69 comments

Предложения по расширению функционала и улучшению zapret

Fenrir-0xFF avatar Oct 11 '24 13:10 Fenrir-0xFF

Проблема с длиной команды есть только у ash в интерактивной оболочке. Ее нет на уровне ОС и ее нет в скриптах, обрабатываемых ash.

На счет autolist. У него есть режим дебага. надо смотреть лог. Проблема может быть и в другом. В апгрейде броузера или во включении ECH на cloudflare, например. Надо проверки все начинать с curl. Он более предсказуем по каким протоколам и куда он полезет.

Все остальное это обьемные и сложные изменения, до которых руки вряд ли дойдут в обозримом будущем

bol-van avatar Oct 12 '24 19:10 bol-van

@bol-van а можно пожалуйста хотябы первый пункт реализовать в новой версии? Добавить к примеру параметр --hosts= где через запятую или пробел будет список сайтов (очень нужно), кастыли через /dev/stdin или fifo не прокатывают на урезанных линуксах

Fenrir-0xFF avatar Nov 13 '24 03:11 Fenrir-0xFF

пока есть более важное, а это не приоритетно

bol-van avatar Nov 13 '24 05:11 bol-van

пока есть более важное, а это не приоритетно

Нее, никто тебя не гонит, просто по мере времени, возможностям и желанию)

Начял разбираться с tpws для тех у кого урезанные iptables не тянут NFQUEUE, и кроме как разделить пакет на чясти и поменять эти чясти местами в tpws больше ничего сделать нельзя, в следствии чего не каждый DPI получиться пробить. Если будет время и желание можно реализовать програмно в tpws все методы которые есть в nfqws?

Ещё парочка моментов по nfqws/tpws (речь не о fake) Можно ли добавить опцию модификации SNI? Также добавить модификацию HTTP заголовков с регулярными выражениями? Те методы которые присутствуют на данный момент не прокатывают, причём судя по тому что никто не использует их в конфигах не только у меня. Заменить их все на одну опцию к примеру --http-headers, чтобы можно было менять в них что угодно и как угодно, к примеру теже опции --hostdot и --hosttab добавляют точку и tab вконце домена, а ведь туда можно ещё много чего добавить что теоретически может прокатить к примеру поставить точку не в конце домена а в начяле или добавить .localhost вконце домена, или через ; или пробел после домена добавить второй не заблокированный домен, с расчётом что DPI его пропустит а сервер не станет с него блевать. Да и с темже GET тоже поэксперементировать, щяс возможно только пустую строку перед GET добавить и то только в TPWS, а можно ведь добавить какиенибуть байты чтобы DPI не воспринимал пакет как http что кстати скорей всего прокатит, но то что это нормально прожуёт сервер не факт, такто скорей всего можно будет подобрать то что прожуёт сервер надо эксперементировать.

Fenrir-0xFF avatar Nov 18 '24 03:11 Fenrir-0xFF

tpws умеет tlsrec. тоже неплохое средство, которое в nfqws реализовать невозможно. но tpws практически беззащитен перед анализом ответа сервера. TLS1.2 он часто пробить не в состоянии. TLS модицифировать невозможно. только если делать MiTM да и сервера не примут левый SNI что конкретно нужно модифицировать в http заголовках, что может чем-то помочь ? если бы можно было что-то еще добавить, что не сломало бы протокол, об этом бы написали уже. http к тому же уже мало актуален. если вам удастся создать запрос, который что-то пробивает и корректно обрабатывается сервером, я рассмотрю

но надо понимать, что nfqws не может добавить ничего в поток, что изменит длину а tpws не может работать на уровне отдельных пакетов иначе, чем насилуя не предназначенный для этого socket api. возможности ограничены

bol-van avatar Nov 20 '24 05:11 bol-van

если вам удастся создать запрос, который что-то пробивает и корректно обрабатывается сервером, я рассмотрю но надо понимать, что nfqws не может добавить ничего в поток, что изменит длину

--methodeol; добавить перевод строки перед методом : "GET /" => "\r\nGET /" в tpws она есть, в nfqws её нету, онако метод прокатывает. Достаточно байта 0x0A перед GET, чтобы не изменять длинну можно удалить пробел между Host: и доменом У меня прокатило=) Время будет ещё поэксперементирую, скину рабочие варианты

P.S. Проблему с длинной разве нельзя решить указанием новой длинны пакета и новой контрольной суммой?

Fenrir-0xFF avatar Nov 20 '24 12:11 Fenrir-0xFF

Да , так можно сделать, но потребуется откуда-то еще выкусить эти 2 байта, чтобы длина осталась такой же. Суммы поправить можно, но весь последующий поток поедет по sequence. Чтобы его стабилизировать, придется во всех последующих пакетах входящих и исходящих редактировать sequence, что представляется задачей тяжелой и глупой. Сродни переписыванию части ОС. Зачем, когда есть для этого tpws ?

bol-van avatar Nov 20 '24 12:11 bol-van

Кстати, вариант на http гнать tpws, а на https - nfqws - совершенно нормальный, и легко реализуется под *nix с текущими скриптами запуска

bol-van avatar Nov 20 '24 12:11 bol-van

Да , так можно сделать, но потребуется откуда-то еще выкусить эти 2 байта, чтобы длина осталась такой же.

Дак общий размер заголовков же не изменяется, 1 байт \n добавили, другой байт (пробел после Host:) убрали

Fenrir-0xFF avatar Nov 20 '24 14:11 Fenrir-0xFF

2 байта. \r\n там вообще. \n только в варианте unixeol. это дополнительное издевательство. Можно откуда-нибудь выдернуть. Депробелизировать 2 хедера. Но зачем ? Вижу смысл только для винды, где tpws нет

bol-van avatar Nov 20 '24 14:11 bol-van

2 байта. \r\n там вообще. \n только в варианте unixeol. это дополнительное издевательство. Можно откуда-нибудь выдернуть. Депробелизировать 2 хедера. Но зачем ? Вижу смысл только для винды, где tpws нет

Там кстати и только с \r тоже работает ещё вместо GET прокатывает PRE, но не везде На cloudflare прокатывает, а через него щяс практически все сайты проходят

Fenrir-0xFF avatar Nov 20 '24 14:11 Fenrir-0xFF

Действительно, прокатывает. Но только на cloudflare. Это что-то не стандартное. Гугл не находит.

bol-van avatar Nov 20 '24 14:11 bol-van

Действительно, прокатывает. Но только на cloudflare. Это что-то не стандартное. Гугл не находит.

Дак Я об этом в самом начяле и говорил, что можно нестандартные заголовки использовать и что из того что ещё не проверил в них прокатит можно только гадать и эксперементировать. Если чтото длинное использовать то можно к примеру будет user-agent по маске сократить чтоб вмещялось Не только на cloudfare, на duckduckgo.com PRI прокатывает, на других сайтах тоже, но как повезёт

Fenrir-0xFF avatar Nov 20 '24 15:11 Fenrir-0xFF

Есть какая-то инфа о методе PRE ? Откуда он вообще взялся ? В исходниках nginx ничего такого не находится

bol-van avatar Nov 20 '24 15:11 bol-van

Есть какая-то инфа о методе PRE ? Откуда он вообще взялся ? В исходниках nginx ничего такого не находится

Сорри, опечятка PRI

Fenrir-0xFF avatar Nov 20 '24 15:11 Fenrir-0xFF

PRE тоже сработало. а PRI в nginx тоже нет. По ходу там ни PRI, и не PRE, а что угодно нестандартное считается как GET

bol-van avatar Nov 20 '24 15:11 bol-van

По ходу там ни PRI, и не PRE, а что угодно нестандартное считается как GET

Да, Я щяс специально от балды туда рандома отправил, хавает всё что заглавными буквами написано

Fenrir-0xFF avatar Nov 20 '24 15:11 Fenrir-0xFF

По ходу это фишка nginx. lighttpd такое не хавает

bol-van avatar Nov 20 '24 15:11 bol-van

Там в конце, если стандартный метод не найден, идет проверка , что метод содержит буквы A-Z, символы _ или -, и если это так, то возвращает NGX_OK

static ngx_int_t
ngx_http_v2_parse_method(ngx_http_request_t *r, ngx_str_t *value)
{
    size_t         k, len;
    ngx_uint_t     n;
    const u_char  *p, *m;

    /*
     * This array takes less than 256 sequential bytes,
     * and if typical CPU cache line size is 64 bytes,
     * it is prefetched for 4 load operations.
     */
    static const struct {
        u_char            len;
        const u_char      method[11];
        uint32_t          value;
    } tests[] = {
        { 3, "GET",       NGX_HTTP_GET },
        { 4, "POST",      NGX_HTTP_POST },
        { 4, "HEAD",      NGX_HTTP_HEAD },
        { 7, "OPTIONS",   NGX_HTTP_OPTIONS },
        { 8, "PROPFIND",  NGX_HTTP_PROPFIND },
        { 3, "PUT",       NGX_HTTP_PUT },
        { 5, "MKCOL",     NGX_HTTP_MKCOL },
        { 6, "DELETE",    NGX_HTTP_DELETE },
        { 4, "COPY",      NGX_HTTP_COPY },
        { 4, "MOVE",      NGX_HTTP_MOVE },
        { 9, "PROPPATCH", NGX_HTTP_PROPPATCH },
        { 4, "LOCK",      NGX_HTTP_LOCK },
        { 6, "UNLOCK",    NGX_HTTP_UNLOCK },
        { 5, "PATCH",     NGX_HTTP_PATCH },
        { 5, "TRACE",     NGX_HTTP_TRACE },
        { 7, "CONNECT",   NGX_HTTP_CONNECT }
    }, *test;

    if (r->method_name.len) {
        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
                      "client sent duplicate :method header");

        return NGX_DECLINED;
    }

    if (value->len == 0) {
        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
                      "client sent empty :method header");

        return NGX_DECLINED;
    }

    r->method_name.len = value->len;
    r->method_name.data = value->data;

    len = r->method_name.len;
    n = sizeof(tests) / sizeof(tests[0]);
    test = tests;

    do {
        if (len == test->len) {
            p = r->method_name.data;
            m = test->method;
            k = len;

            do {
                if (*p++ != *m++) {
                    goto next;
                }
            } while (--k);

            r->method = test->value;
            return NGX_OK;
        }

    next:
        test++;

    } while (--n);

    p = r->method_name.data;

    do {
        if ((*p < 'A' || *p > 'Z') && *p != '_' && *p != '-') {
            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
                          "client sent invalid method: \"%V\"",
                          &r->method_name);

            return NGX_DECLINED;
        }

        p++;

    } while (--len);

    return NGX_OK;
}

bol-van avatar Nov 20 '24 15:11 bol-van

Но все равно польза этого метода очень точечная. Во-первых, сервер должен работать по http и не редиректить на https. Таких уже мало. Во-вторых, там должен быть nginx. Их много, но не все. И ддос гуарды наверно не пропустят. В-третьих, с POST уже ничего не сделать. Любая форма и приехали

bol-van avatar Nov 20 '24 15:11 bol-van

В-третьих, с POST уже ничего не сделать. Любая форма и приехали

Значит пока вариант с \n остаётся и удалением пробела после host: чтобы байт освободить, Я рандомные сайты почекал, пока ещё ниодин ошибок не выдал что на GET что на POST, при этом DPI пробивают

Fenrir-0xFF avatar Nov 20 '24 15:11 Fenrir-0xFF

В mdig кастомный DNS не помешал бы, с игнорированием тех которые в resolv.conf если опция задействована.

Возможность устанавливать TTL в nfqws не только для десинхронизирующих пакетов но и для обычных. А то с изменением TTL средствами системы возникают проблемы К примеру iptables -t mangle -I POSTROUTING -j TTL --ttl-set 64 независимо добавлено до или после перенаправления на nfqws изменяет TTL для всех пакетов в том числе и фейковых. На урезанных iptables где отсутствует -j TTL, попытка использовать кастыль nfqttl в связке с nfqws приводит к тому что вобще интернет перестаёт работать

Fenrir-0xFF avatar Nov 29 '24 07:11 Fenrir-0xFF

менять ттл для всего подряд это несвойственная функция, не имеющая отношения к обходу блоков выделить генерированные пакеты легко десинк марк правда он будет не только у фейков, но и всех генеренных в тч реинжект оригинала но это тоже решаемо если надо исключить сет ттл для фейков с ттл достаточно поставить условие ттл от 1 до 60, например

bol-van avatar Nov 29 '24 07:11 bol-van

менять ттл для всего подряд это несвойственная функция, не имеющая отношения к обходу блоков

Косвенно отношение имеет, на недобросовестных мобильных операторах блокируется раздачя интернета через вайфай, лечиться сменой TTL

достаточно поставить условие ттл от 1 до 60, например

Не прокатило, отсутствует -m ttl в iptables

Fenrir-0xFF avatar Nov 29 '24 08:11 Fenrir-0xFF

@bol-van у тебя есть желание ещё одним проектом заняться? Сделать аналог Privoxy с расширенной обработкой контента, с возможностью использовать переменные и их обработку, а то у Privoxy и всего чего удалось нагуглить работает только аналог команды sed с заменой контента по регулярным выражениям, чего при работе с напрочь засранными сайтами коих становиться только больше уже не достаточно. Там проще создать новый шаблон сайта с минимально необходимыми скриптами для работы чем перелопачивать всё дерьмо которое там понапихано. На Privoxy люди пробовали лепить кастыли, подгружать код и скрипты из папки /doc но всёравно фигня получяется потомучто нет возможности работы с переменными. Я пробовал через Lighttpd трафик пускать с обработкой его lua скриптами, но Lighttpd начинает проц прилично жерать, да и возможности lua там ограничены.

Fenrir-0xFF avatar Feb 24 '25 12:02 Fenrir-0xFF

Чем это поможет, если все https ? И какова цель ? Не лучше ли browser extension ? Трафик надо менять там, где он расшифрован

bol-van avatar Feb 24 '25 13:02 bol-van

Чем это поможет, если все https ? И какова цель ? Не лучше ли browser extension ? Трафик надо менять там, где он расшифрован

Насчёт SSL можно MITM использовать и сертификат подменять, в Privoxy это есть. Цель полноценно пользоваться популярными сайтами созданными быдлокодерами. Например ВК, Авито, чястично тотже гитхаб можно в этот список уже внести, ибо изза туевой хучи JS он уже подглючивать начинает. Всё это дерьмо сильно грузит браузеры, да и не каждый браузер способен его переварить, причём паразиты делают так что если блочиш какието внешние скрипты которые являются трекерами или рекламой то сайт тупо перестаёт работать - самый наглядный пример Авито, который изза малейшей ерунды сразу ошибку выдаёт. Задача поиск конкретных фрагментов из оригинального кода страницы и подстановка их в имеющийся пользовательский шаблон, после чего вывод этого шаблона вместе с данными вместо оригинальной страницы сайта. Пока что таких проектов не встречял, хотя сделать не сложно.

Насчёт браузерных модулей вобще не вариант, у них черезмерно низкий КПД (много ресурсов жерут), и кроме как заблокировать внешние скрипты или скрыть чясть контента больше ничего не могут, при этом html код толком не вычищяют. Поэтому щяс Privoxy юзаю, но его функционала уже не хватает, ибо сайты засраны настолько что проще вставить нужный контент в нормальный шаблон чем всё это дерьмо вычищять.

Fenrir-0xFF avatar Feb 24 '25 16:02 Fenrir-0xFF

У расширений гораздо больше возможностей. Они работают не с raw потоком, а с уже распарсенным HTML и JS. Сделать расширение намного проще. Разве не так ? В любом случае вмешательство в разные сайты это неблагодарная задача, требующая постоянной траты ресурсов для анализа и обновления определений. Так, как это сделано в блокировщиках рекламы

MitM это практически гвоздь в крышку гроба. Мало кто его станет делать. Пара-тройка гиков

bol-van avatar Feb 24 '25 16:02 bol-van

Сделать расширение намного проще. Разве не так ?

КПД у них очень низкий, тотже ADBlock браузер грузит прилично при этом всегото сверяет списки и меняет или удаляет чясть кода на страницах. Privoxy потребляет максимум несколько процентов от того что потребляет ADBlock на браузере. В случяе реализации шаблонов проект может раза в полтора больше чем Privoxy будет жерать ресурсов, но зато освободиться туева хучя ресурсов потребляемых браузером. К примеру у меня щяс на браузере открыта только данная страница гитхаба где пишу, из расширений стоит только NoScript при этом браузер уже использует свыше 300мб ОЗУ, несмотря на то что использую Basilisk который от фоксовского дерьма почищен.

В любом случае вмешательство в разные сайты это неблагодарная задача, требующая постоянной траты ресурсов для анализа и обновления определений. Так, как это сделано в блокировщиках рекламы

Люди найдутся быстро, тотже ВК к примеру туева хучя народу юзает, как минимум человек 500 гарантировано станут шаблонами пользоваться, те кто разбирается оперативно в течении чяса смогут в случяе чего изменения внести и скинуть актуальный скрипт/шаблон в дискуссии к примеру.

Просто уже настали времена когда людям нужно не блокировать дерьмо на сайтах, а вытаскивать нужные данные из дерьма. Подобных проектов пока ещё нигде нет

MitM это практически гвоздь в крышку гроба. Мало кто его станет делать. Пара-тройка гиков

Можно и по http сайты с браузера юзать, по https уже сам прокси будет подключяться. В код шаблона можно накрайняк пару строк на html добавить, чтоб уведомление вылазило если с сертификатом чтото нетак будет. И даже кнопки продолжить и отмена с get запросом который прога будет обрабатывать.

P.S. Для наглядности выкладываю скрин. Столько дерьма без поломки сайта не очистит ниодин из существующих на данный момент фильтров или блокировщиков рекламы, а уж темболее браузерные расширения. Image

Fenrir-0xFF avatar Feb 24 '25 16:02 Fenrir-0xFF

Несколько предложений по сокращению количества опций (а то их слишком много становиться)

  1. Можно убрать опцию --socks в tpws ? Сделать автоматический выбор типа прокси (tproxy или socks) на основании входящих на порт пакетов, ответные клиенту пакеты будут подгоняться под тип входящих пакетов к примеру до истечения --local-tcp-user-timeout=

  2. Обьединить опции --hostlist= и --hostlist-domains= тоже самое с exclude списками доменов. Автоматически определить тип (файл или текст) можно по символам присутствующих в параметре / = файл , = текст также можно и со списками ipset домены обьединить, по маске их различять

  3. Имеется опция --skip которая пропускает стратегию, можно вместо неё добавить символ отрицания? К примеру --!new пропускает стратегию, --dpi-desync=fake,!split2 пропускает метод split2 и использует только fake и т.д. для всех остальных параметров.

Fenrir-0xFF avatar Mar 22 '25 15:03 Fenrir-0xFF