What's new #4
Replies: 37 comments
|
Для максимальной производительности релизы zapret2 собираются с luajit 2.1 от openresty для всех платформ, кроме lexra и ppc. На lexra luajit невозможен в принципе, поскольку обладает не совсем стандартной системой команд mips, а на ppc были какие-то проблемы в сборке. На проблемных платформах собирается с LUA 5.4. Загрузка модулей через "require" невозможна на статических билдах, поставляемых с релизом. Имейте в виду, что lua в nfqws2 запускается с ограниченными правами.
|
|
Сделана песочница в winws2 на базе
Это эффективно предотвращает доступ на запись практически на всю файловую систему, кроме мест, где явно поставлен доступ для low mandatory. Кроме файлов, это рубит доступ на запись ко всем обьектам, защищенным security descriptor. |
|
Появился blockcheck2. standard - это тестилка стратегий, похожая на blockcheck1, но разнесенная по файлам. custom - тестилка стратегий из простого списка из файла. файлы разнесены по протоколам. можно заменить к ним путь. Параметры Режим quick теперь работает совсем иначе. Единственное, что он дает, это прекращение тестирование следующих попыток после получения отрицательного результата. Выхода по первому успеху больше нет ! |
|
Сделал пример кастома для обслуживания типичного веб сервера. В дефолтной стратегии применяется техника tcp split handshake - разбив ответа SYN,ACK на отдельные пакеты SYN и ACK. По http reply и server hello отрабатывает fake+multisplit Параметр |
|
Инсталятор и скрипты запуска адаптированы. |
|
MDIG cache был давно сломан в blockcheck1, проблема перешла и в blockcheck2 |
|
Реализована поддержка имен профилей (names) и шаблонов профилей (templates). Импорт нескольких шаблонов с наложением не реализован. Однако, шаблоны - тоже полноправные профили и могут импортировать другие шаблоны. Здесь будет 2 шаблона и 1 рабочий профиль, который выполнит 3 инстанса Убрана детализация пейлоада stun_binding_req. |
|
Первое практическое применение концепции оркестраторов. Файл zapret-auto.lua. Орекстратор Простейший тест-пример, иллюстрирующий работу. circular берет на себя выполнение execution plan. круговой обход стратегий осуществляется индивидуально по хостам. по каждому хосту хранится состояние какая для него текущая стратегия. есть понятие неудачи (failure). неудача - это когда условно говоря сайт не открылся, подает признаки блокировки.
Для 2 и 3 ему нужны входящие данные, поэтому ставиться Ведется счетчик неудач. Если происходят Параметры орекстратора Практический пример автолиста в памяти , без записи в файл. Сначала применяется стратегия, не делающая ничего. --in-range нужен только для окестратора. дальше он гасится через --in-range=x. |
|
Переработана, упрощена и унифицирована схема детекта ретрансмиссий. Если ранее в C коде автолистов считались ретрансмиссии только в диапазоне TLS запроса (вместе с кибер пакетами всеми), то теперь они считаются в диапазоне relative seq от 0 до нового параметра nfqws2 --hostlist-auto-retrans-threshold , конфиг AUTOHOSTLIST_RETRANS_MAXSEQ. По умолчанию 65536. В оркестраторе circular аналогичная схема с похожими параметрами. Для упрощения детекта ретрансмиссий добавлено отслеживание в conntrack значений "uppos" по направлениям orig,reply. uppos - это максимальный сиквенс, на который когда-либо залезали передаваемые по направлению данные. Под "залезали" считается seq за последним байтом последнего переданного пакета. Так же сохраняется предыдущее значение uppos. Вычисление разницы sequence требует особой логики. Sequence - это 32 битные unsigned номера. В zapret-lib.lua сделана функция для определения является ли текущий диссект ретрансмиссией. Кто понимает в машинной арифметике - поймет |
|
Сделана поддержка udp в standard_failure_detector и как следствие в оркестраторе circular. На quic вполне себе работает с параметрами по умолчанию. |
|
КОПИЯ СТАРОГО ПОСТА С NTC.PARTY Заметил такую ерунду. Вылечилось вот так если включить rx-gro-list на PC с 2 сетевухами realtek, проблемы не наблюдается Так можно сделать универсально без привязки к портам и именам интерфейсов точек доступа |
|
Прощаемся с zapret-info и rublacklist. Убираются скрипты ipset get_reestr_resolve.sh и get_reestr_hostlist.sh как работающие напрямую с z-i. |
|
Мануал дописан в первом приближении. |
|
Сделал анализ DNS ответов и занесение их в --ipcache-hostname. Имена хостов для кэширования берутся из анализа L7 протоколов и из DNS ответов (не DoH). Извлечение DNS работает только по udp протоколу и требует перенаправления пакетов с порта 53. Нужны только ответы DNS, имеющие source port 53. На Windows это будет --wf-udp-in=53. Скорее всего будет обращение к DNS внутри локальной сети, поэтому нужен параметр --wf-filter-lan=0. На роутере, если используется шифрованный DNS, надо ловить запросы от клиента еще до шифрования - на LAN интерфейсе. Если шифрование не используется, можно ловить и на WAN. Для LAN интерфейса они будут исходящими, для интерфейса WAN - входящими, по направлению conntrack - reply. С броузером с включенным Doh или с включенным doh на уровне ОС работать не будет |
|
Обертка в linux вокруг функции экстракции dns ответов не совсем тривиальна. Просто добавить порт 53 не всегда сработает в в openwrt. Чтобы ради этого случая не разрабатывать специальную схему, проще все сделать в кастоме с созданием отдельных цепочек. Итак,
А что в винде делать ? Там --wf-udp-in=53 --wf-filter-lan=0 сработает. Но только если обращение не идет к localhost, на котором крутится dns proxy. В этом случае еще добавляем --wf-filter-loopback=0 |
|
Обнаружилось такое явление, вероятно вызванное некоторыми системами anti ddos защиты. Сервер выдает window size=0 в SYN,ACK и фактором 128 Что это дает ? Клиент не может слать сразу тонны мусора. он ограничен мелким окном от нескольких байт до нескольких сотен байт. Это дает время защите понять не пытаются ли слать какую-то гадость, например. Как это влияет на zapret ? Если входящие не перехватываются в достаточном обьеме, защита не знает window size сервера и не включается, соединение с гарантией виснет, потому что delay дропает пакеты, клиент шлет ретрансы, и это никогда не кончается. Почему могут не перхватываться входящие ? В linux задача решается через достаточные connbytes. На nfqws1 вариант - только отсекать подобные сайты на уровне firewall/windivert, поскольку никаких изменений кода не будет. Защиты от мелких server wsize там нет Еще 1 вариант, приводящий к похожей проблеме, был обнаружен на древней версии macos. tcp slow start с одним пакетом. В современных macos по умолчанию 8. Это правится через sysctl на клиенте. |
|
UPD. Решил принимать window size=0 как известное, если был получен хотя бы 1 входящий пакет - pcounter!=0. Это решение может привести к ложным отменам reasm и сбою стратегий на windows и на других системах при неперехвате или недостаточном перехвате входящих . Но imho это лучше, чем заставлять делать --wf-tcp-in из-за такой редкой мелочи. |
|
Рабочий тестовый пример icmp обфускатора udp от винды к серверу на vps. Будем загонять исходящие с клиента в в icmp type 8 (echo request) code 199 , исходящие с сервера в icmp type 0 (echo reply) code 199. wireguard server - 1.2.3.4:5555 Клиент на винде : Все лишнее отсекается в ядре в windivert - проц зазря не грузит. И включаем wireguard. Если IP клиента постоянен, можно дополнительно на стороне сервера сделать фильтр по IP клиента. Дополнительно можно сделать dataxor=blob на обоих концах, чтобы поксорить пейлоад. |
|
C хелперы для работы с unixtime : localtime,gmtime,timelocal,timegm Распознавание нешифрованного bittorrent протокола. Как ловить в винде ? --wf-tcp-out,--wf-udp-out ? Да, но нужно еще --server В linux - кастом скрипты или свои tables. Прописывание портов в конфиг не поможет. Для экшина над шифрованным bt не забывать про фильтр antidpi функций "standard payload" |
|
Новый оркестратор Оркестратор все последующие инстансы вызывает только, если у них есть аргумент "cond". "cond" - имя iff функции. "cond_neg" - признак инверсии. Инстанс выполняется только если cond вернул true. Например, сервер не поддерживает timestamps. tcp_ts обламывается, соединение ожидаемо виснет, потому что фейк принимается сервером. Что делать ? вот решение : |
|
И на закуску. Аргумент "instances" в condition и per_instance_condition. cond_lua - iff функция, выполняющая произвольный код. Код должен вернуть значение условия. Следующие 2 инстанса только для пакетов tcp с длиной данных не менее 1200 байт В принципе, condition может заменить per_instance_condition, если его писать перед каждым инстансом и дать аргумент instances=1. |
|
Только сейчас выяснилось, что в multiport в iptables нельзя больше 15 портов. |
|
Набор скриптов "builder-linux" в "docs/compile" для простой сборки статиков под любую архитектуру на x86_64 хосте с традиционным linux. Все элементарно
Если у кого-то есть желание, легко адаптируется для z1. Выкидывается lua, меняются URL скачивания и имя фолдера zapret2. остальное там тоже самое |
|
НЕСОВМЕСТИМОЕ ИЗМЕНЕНИЕ В cond_lua параметр "code" переименован в "cond_code". |
|
Подниму тему про ASLR. ASLR - это рандомизация адресного пространства процесса, призванная усложнить жизнь желающим срывать уязвимости кода и перенаправлять выполнение на непредусмотренные адреса памяти, чтобы выполнить собственный код и захватить процесс. Как дела с этим в zapret2
|
|
nfqws и nfqws2 изначально строились на одной единственной событийной модели Если посмотреть на tcp/ip стек ОС, то для реализации, скажем, tcp этой модели недостаточно. Именно это и было добавлено в nfqws2, чтобы он перестал быть только лишь пассивным слушателем и отвечателем. Все достаточно просто
period задается в миллисекундах. В режиме --intercept=0 после выполнения фазы lua-init обработка входит в цикл ожидания таймеров, пока они есть. Когда их не становится - процесс выходит Никаких прямых sleep не предусмотрено - это сломает асинхронную обработку и повесит очередь. Только через события в стиле конечного автомата. timer_set и timer_del можно вызывать из самих таймеров в том числе и в отношении самих себя |
|
Добавлен параметр "delay" в antidpi функцию "send". Чтобы не задерживать все, есть внутрипрофильные фильтры по range и payload. Пока не очень понятно зачем нужно что-то задерживать - на незначительные задержки ТСПУ плевать. Там таймауты в минутах исчисляются. Но как иллюстрация использования таймеров годится. Может какой-то DPI не в России работает по коротким таймаутам для экономии ресурсов. Чтобы не городить велосипед с именами таймеров, созданы хелперы в zapret-lib Конструирует имя таймера, включающее в себя ip адреса src,dst, имя протокола l4, номера портов или icmp коды. Конструирует имя таймера, включающее в себя результат dis_timer_name + номер пакета в conntrack по прямому направлению. |
|
Небольшое изменение в timer_set, timer_info. Кусок кода для примера из lua-tests : timer_info возвращает поле "func" как function, не как string. string больше не запоминается, поэтому преобразовать ссылку на код в имя функции невозможно |
|
Значимые изменения в 1.0.5 При диссекции tcp options обрезаются все нули с конца. Возможность инвертирования действия --filter-ssid, --ssid-filter, --nlm-filter. ВСЕ, КРОМЕ --filter-mark - новый профильный фильтр только для linux. можно в один инстанс загонять соединения, классифицированные любыми, сколько угодно сложными правилами ip/nf tables. Для поддержки классификации входящих требуется сохранять информацию о маркировке в ct mark (connmark), потом восстанавливать в meta mark (mark). blockcheck2 под виндой больше не использует ipset. Вместо него используется kernel аналог --wf-raw-filter. Это позволяет не дергать другие инстансы при параллельном запуске множества блокчеков. Ранее blockcheck2 падал при использовании custom/10-list.sh, если в файл записаны стратегии, вызывающие падение eval (ошибка шелл, неэкранированные символы). При этом оставались ip/nf tables, iptables не удалялись даже после перезапуска blockcheck2. Сделана тестовая проверка в subshell, отказ от реального запуска при ошибке. Скрипт больше не падает. |
|
Несколько изменений в blockcheck2 Вариант custom/10-list.sh читает стратегии из файла. В summary при тестировании нескольких доменов печатается не только пересечение (COMMON), но и покрытие (COVERAGE). Последнее показывает на скольки из скольких доменов стратегия прошла. CURL_PAD=bytes. Добавить мусорных хедеров на указанное кол-во байт для утяжеления запроса, чтобы триггернуть 16 кб блок, когда сайт возвращает короткий ответ. |
Uh oh!
There was an error while loading. Please reload this page.
winws2 интегрирован в zapret-win-bundle.
Переписана стратегия preset_example.cmd в preset2_example.cmd под winws2.
В cygwin-admin.cmd создан alias "winws2-antidpi".
Можно так писать, не заморачиваясь с путями, для тестирования стратегий
winws2-antidpi --wf-tcp-out=80 --debug --lua-desync=passAll reactions