惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

AWS News Blog
AWS News Blog
Schneier on Security
Schneier on Security
P
Palo Alto Networks Blog
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
S
Secure Thoughts
L
LINUX DO - 最新话题
S
Securelist
C
CXSECURITY Database RSS Feed - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
Recent Announcements
Recent Announcements
S
Schneier on Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Cyberwarzone
Cyberwarzone
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
Security Archives - TechRepublic
Security Archives - TechRepublic
V
Vulnerabilities – Threatpost
T
Tor Project blog
GbyAI
GbyAI
B
Blog
博客园 - 司徒正美
博客园 - 叶小钗
Recorded Future
Recorded Future
F
Fortinet All Blogs
Spread Privacy
Spread Privacy
IT之家
IT之家
Forbes - Security
Forbes - Security
L
Lohrmann on Cybersecurity
有赞技术团队
有赞技术团队
博客园 - 聂微东
A
Arctic Wolf
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
The Blog of Author Tim Ferriss
N
News and Events Feed by Topic
O
OpenAI News
Apple Machine Learning Research
Apple Machine Learning Research
Help Net Security
Help Net Security
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
TaoSecurity Blog
TaoSecurity Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Как работает эта ваша суриката 3 часть
Григорий · 2026-06-20 · via Все публикации подряд на Хабре

Всем привет! 3 часть цикла статей по разбору устройства работы IDS/IPS решения Suricata.

По итогу второй части цикла статей, надеюсь, у Вас сложилось понимание каким образом формируются правила Suricata. Не все функции просты в использовании и понимании. Еще надо учитывать нагрузку на движок Suricata. Как используются те или иные функции, всегда можно посмотреть в документации. Помимо знания синтаксиса, нужно знать и понимать тематику сетевых атак. Так вот в своих статьях хотел посредством анализа сетевых угроз показать как пишутся сигнатурные правила Suricata. 

В рамках данной статьи рассмотрим уязвимость CVE-2025-66698. В репозитории сказано, что тип уязвимости Authentication Bypass в сервисе Veda (Semantic Machines) v5.4.8. Суть уязвимости заключается в неверной валидации параметров ticket-а. Пустое значение воспринимается сервисом как валидная сессия.

Сейчас попрактикуемся: попробуем воспроизвести активность по описанию POC-а (Proof of conception) из репозитория, запишем трафик, напишем правило и попробуем проверить его.

Сначала давайте откроем нашу виртуалку с убунтой. Поставим сервер apache следующими командами:
sudo apt install apache2

После перейдем в файл ports.conf и скорректируем прослушиваемый порт апача:
sudo nano /etc/apache2/ports.conf

Потому что Dalton у нас работает на 80 порту, а два сервиса на одном порту работать не будут.

После запускаем apache2 командой:
sudo systemctl start apache2

Проверяем в браузере через переход по uri http://localhost:8080. Если все работает, то идем дальше. Устанавливаем tcpdump:
sudo apt install tcpdump
и wireshark, если ранее он не был установлен.
sudo apt install wireshark

Мы подготовились. Теперь запустим tcpdump:
tcpdump -i lo -w CVE-2025-66698.pcap

Разберем команду:
tcpdump - утилита, которая выполняет захват пакетов;
“-i lo” - с помощью флага “-i” мы указали loopback интерфейс захвата трафика “lo”;
“-w CVE-2025-66698.pcap” - здесь с помощью флага “-w” мы указываем куда записывать захваченные данные, а именно в файл “CVE-2025-66698.pcap”.

Откроем еще одно терминальное окно и пустим http-запросы из репозитория:
sudo curl "http://localhost:8080/get\_individual?ticket=&uri=cfg:Administrator" -k
sudo curl "http://localhost:8080/get\_membership?ticket=&uri=cfg:SuperUser" -k
sudo curl "http://localhost:8080/is\_ticket\_valid?ticket=" -k

Через комбинацию ctrl+c остановим работу tcpdump и пойдем смотреть пкап.

У нас 3 http-запроса. Они неуспешные, но это нам не помешает написать правило, детектирующее реализацию уязвимости. Нам важна структура запросов.

alert http any any -> any 8080 (msg:"Possible exploit Semantic Machines v5.4.8"; flow:established,to_server; http.uri; content:"?"; content:"ticket="; nocase; distance:0; content:"uri="; nocase; pcre:"/(get_individual|get_membership|is_ticket_valid)\x3f.*ticket=(\x26|$)/i"; sid:101; classtype:attempted-admin; reference:cve,2025-66698;)

Перед запуском, давайте разберем правило. Мы указали, что нам нужны алерты на любые ip-адреса/сетевые зоны и соединения по порту 8080. Поскольку трафик был записал с loopback интерфейса, мы не можем в правиле указать, что нам нужны пакеты от $EXTERNAL_NET к $HOME_NET. Если мы планируем в дальнейшем правило импортировать в продукт NTA/NDR с suricata, то необходимо будет поменять значения. Далее, мы указали на детекты пакетов по направлению к серверу в рамках установленного соединения. Затем мы в uri http-запроса ищем знак вопроса, “ticket=” (как раз таки та переменная, чья валидация с пустым значением позволяет злоумышленнику обойти аутентификацию) и “uri=”. Причем расстояние между знаком вопроса и “ticket=” может быть нулевым - так мы указали distance:0; что поиск контента "ticket=" производить с конечной позиции относительно предыдущего "?" (https://docs.suricata.io/en/suricata-8.0.1/rules/payload-keywords.html#distance). Дальше мы видим регулярное выражение, которое ищет:
- сначала выражение проверяет, что в URI присутствует один из трёх уязвимых API-эндпоинтов, за которым сразу следует “?”. Группа (get_individual|get_membership|is_ticket_valid) перечисляет целевые пути. \x3f - шестнадцатеричный код символа ?.;
- Далее ".*ticket=(\x26|$)" выражение находит параметр ticket с пустым значением.".*" - пропускает любые символы до следующего сопоставления. (\x26|$) проверяет, что после ticket= идёт либо & (начало следующего параметра), либо конец URI — оба варианта означают отсутствие значения.
- Флаг i делает поиск регистронезависимым.

Вы могли задаться вопросом: “а зачем нам регулярное выражение с поиском того, что мы и так ищем модификатором http_uri?”. Есть такая практика в написании правил Suricata. В работе правила сначала будет совпадение по контенту с модификатором http_uri, а потом регулярным выражением суриката как бы верифицирует это же совпадение. Условия по регулярным выражениям требуют много ресурсов и хорошая практика - использовать их как можно реже. Соответственно, предыдущими условиями мы как бы отсеиваем всё ненужное, чтобы потом регулярка проверялась на максимально малом числе пакетов. Теперь постараюсь объяснить почему же мы взяли за условие именно эти контенты (?, ticket=, uri= и регулярка). Давайте вернемся к описанию уязвимости - Пустое значение ticket воспринимается сервисом как валидная сессия. В написании правил нам нужно опираться на паттерны уязвимости. После знака вопроса в URI начинается запрос, который передает какие-то параметры. Очень хорошо видно в Wireshark:

Самостоятельно проверьте работу правила, запустив его в Dalton-е. Уверен, оно сработает.

Теперь хотел бы перейти ко второй части этой статьи.

Sticky buffer или липкий буфер. Определение его встречается в документации 6 версии Suricata. А в документации к версии 8.0.1, на которой мы работаем, этому дано определение Multiple Buffer Matching. Итак, что это такое и зачем оно нужно. Этот модификатор говорит, что можно указать имя буфера в начале и все последующие совпадения (content, поиск по регулярным выражениям, байтовые операции) будут относиться к этому буферу. Давайте объясню на примере (откройте pcap, записанный в первой части статьи cve-2025-66698.pcap): 

я хочу найти два значения в http uri “is_ticket_valid” и “ticket=”. В моем пкапе запрос:

Если мы посмотрим на документацию, то мы увидим, что для поиска в http uri используем модификатор http.uri буфера. Но если мы посмотрим документацию более старой версии suricata или нам попадутся правила, где увидим там http_uri, то могут возникнуть вопросы. Может быть Вы обращали внимание где я ранее ставил content относительно модификаторов. Давайте разберемся как правильно.

Есть два варианта написания условия для поиска наших фраз:
a) content:"is_ticket_valid"; http_uri; content:"ticket="; http_uri;
b) http.uri; content:"is_ticket_valid"; content:"ticket=";

Липкий буфер был использован в варианте «b». Обратите внимание как это удобно. Мы можем в начале указать один раз какой использовать хотим буфер и писать паттерны для поиска. Вариант «a» также по-прежнему работает в новых версиях и его можно использовать в написании правил. Правда тут есть нюанс. Например, мы используем липкий буфер http.uri и сразу после него используем буфер http_method – (например: «http.uri; content:"is_ticket_valid"; content:"ticket="; content:"GET"; http_method;») - суриката ругнется, так как не поймет что к какому буферу относится. И на этот случай его можно сбросить перед контентом с обычным буфером. Давайте составим правила для тестов:
alert http any any -> any 8080 (msg:"Test buffer uri";content:"is_ticket_valid"; http_uri; content:"ticket="; http_uri; sid:18;)
alert http any any -> any 8080 (msg:"Test STICKY buffer uri"; http.uri; content:"is_ticket_valid"; content:"ticket="; sid:19;)
alert http any any -> any 8080 (msg:"Test STICKY buffer double uri"; http.uri; content:"is_ticket_valid"; http.uri; content:"ticket="; sid:20;)

И пойдем в Dalton смотреть. Запускаем и видим, что все три варианта правил работают:

Совпадение было найдено в http-потоке. Во вкладке Alert Debug будет показано, на какой пакет в HTTP-потоке сработали все три правила.

А еще есть такой вариант, когда мы хотим использовать после липкого буфера обычный буфер (я для него названия не видел или плохо искал).
Запустим следующее правило:
alert http any any -> any any (msg:"Test buffer uri with mistake"; http.uri; content:"is_ticket_valid"; pkt_data; content:"ticket="; http_uri; sid:22;)

Suricata скажет, что мы используем липкий буфер и нужно его сбросить перед использованием модификатора следующего. Сбрасываем:
alert http any any -> any any (msg:"Test buffer uri with mistake"; http.uri; content:"is_ticket_valid"; pkt_data; content:"ticket="; http_uri; sid:22;)
И запускаем:

Успех!

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

Кстати здесь в конце страницы есть список всех модификаторов поддерживающих технологию, так сказать, липкого буфера.

И еще хотел Вас познакомить с вендором Emerging Threats. По этой ссылке Вы можете найти их правила. Они обновляются каждый день. Есть как платная подписка, так и бесплатная. В названии правил (модификатор msg) они используют ключевые слова. Здесь сможете найти им определение. Данные правила, считаю, полезны для изучения. На них можно ориентироваться, при тренировках в написании своих правил.

На этом данную статью хочу закончить. Всем спасибо за прочтение и Ваше внимание. Буду благодарен за конструктивную критику, предложения по разбору сетевого трафика и написания правил Suricata. Если у Вас возникли идеи или нестандартные вопросы – давайте разберемся вместе, и я постараюсь отразить в статьях наше изучение продукта.

Буду и дальше подбирать интересные примеры пкапов для расширения знаний пользования Suricata для написания сигнатурных правил.

Всем добра!