Привет, Хабр!
В рамках киберучений CyberCamp 2025 R-Vision выступил партнёром и разработал для участников сценарий расследования инцидента в инфраструктуре крупной компании — Bravera Capital. Задача была не в том, чтобы придумать очередной CTF-квест, а в том, чтобы воспроизвести процесс расследования реальной атаки так, как он выглядит в корпоративной среде.
Часто в CTF-соревнованиях задания бывают оторваны от реальности: стеганография в картинках с котиками или бинарная эксплуатация древних сервисов, которые не встретишь в дикой природе. CyberCamp, напротив, строится на кейсах из повседневной практики ИБ.
Создавая задание для CyberCamp 2025 мы ставили цель смоделировать максимально реалистичный kill chain современной APT-группировки или оператора RaaS (Ransomware-as-a-Service). Нам было важно, чтобы участники прочувствовали ту самую «боль» настоящего Incident Response.
В этой статье разберём «кухню» сценария: почему выбрали связку Confluence + Veeam, зачем переименовывали бинарники и почему именно LockBit стал финальным аккордом. А также предложим варианты выявления подобных атак.
Этап 1. Точка входа: Почему Confluence?
Любая атака начинается с разведки и проникновения. В роли внешней точки входа мы выбрали Atlassian Confluence и не случайно. Это де-факто стандарт (хоть и постепенно уходящий в прошлое) корпоративных баз знаний. Компании нередко предоставляют к ним внешний доступ ради удобства удалённой работы либо забывают закрыть бывшие тестовые стенды.
Для сценария мы использовали комбинацию из двух уязвимостей 2023 года, которые до сих пор встречаются в инцидентах как Initial Access.
Уязвимость №1: Broken Access Control (CVE-2023-22515)
Атакующий не взламывает сервер, а использует логическую уязвимость (Broken Access Control). Она актуальна для версий 8.0.x, 8.1.x, 8.2.x, 8.3.x, 8.4.x, 8.5.0-8.5.1. Уязвимость позволяет неаутентифицированному пользователю создать новую учётную запись администратора. Для этого стенд Confluence принудительно переводится в режим первоначальной настройки с помощью специально сформированного GET‑запроса.
Обнаружение: В журнале Apache access.log Confluence это выглядит следующим образом.
GET /server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false
После этого, как и при обычной первоначальной настройке, нам предложат создать администратора, чем мы и воспользуемся.
Обнаружение: В логах это выглядит как GET-запрос к /setup/setupadministrator.action

На основе совокупности данных запросов из журнала Apache access.log можем построить правило корреляции на обращение к пути /server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=(false или 0), а после этого выполнение действий /setup/*.action.
Уязвимость №2: RCE через Template Injection (CVE-2023-22527)
Получив доступ (или даже без него, в зависимости от патч-левела), атакующий повышает ставки. Мы использовали инъекцию в шаблон OGNL (text-inline.vm), чтобы получить возможность выполнять произвольные команды на хосте. Эта уязвимость также актуальна для версий 8.0.x, 8.1.x, 8.2.x, 8.3.x, 8.4.x, 8.5.0-8.5.3.
Замысел: Это классический паттерн, сначала закрепиться (с помощью учетной записи), затем получить шелл. В логах это проявляется как POST‑запросы к шаблонам Velocity, исходящие от подозрительных User‑Agent.

Обнаружение: Здесь также нам помогут события из журнала Apache access.log Confluence. Необходимо обнаруживать POST-запросы к конечной точке template/aui/text-inline.vm
Этап 2. Закрепление и обход обнаружения
Получив RCE, скучный хакер сразу скачивает шифровальщик. Умный действует иначе. Мы хотели проверить внимательность участников к деталям командной строки.
Маскировка инструментов: Атакующий скачивает nmap, но это слишком заметно. Поэтому в сценарии было реализовано переименование бинарника
nmapвscnrпри помощи команды mv /usr/bin/nmap /usr/bin/scnr.Урок: SIEM-системы, настроенные только на имена процессов, пропустят это. Нужно смотреть на аргументы командной строки и хеши файлов.

3. Скриптовая обвязка: Вместо ручного ввода команд, атакующий использует скрипты sci, 1scn_sc, скачиваемые с внешнего C2. Это добавляет реализма, операторы часто используют автоматизированные тулсеты для первичной разведки.
Этап 3. Туннелирование: Chisel как стандарт индустрии
Инфраструктура редко бывает плоской. Чтобы добраться до самого ценного, нужно пройти через DMZ вглубь сети.
Для этого этапа мы выбрали утилиту Chisel. Это быстрый TCP/UDP туннель через HTTP. В логах мы умышленно оставили четкий след: /chisel_1.10.1_linux_amd64 client <IP>:443 R:3389:<Internal_IP>:3389.

Почему это важно: Атакующий пробросил порты 6160 и 9401. Опытный глаз сразу узнает эти порты – это стандартные порты Veeam Backup & Replication. Именно этот артефакт служит мостиком к следующему этапу атаки.
Этап 4. Цель – Бэкапы: CVE-2023-27532
Это «жемчужина» нашего сценария. В современном рансомваре правило № 1: «Убей бэкапы, иначе не заплатят».
Мы выбрали уязвимость в Veeam Backup & Replication (CVE‑2023‑27532), которая позволяет неаутентифицированному пользователю (через доступ к API‑порту, который мы умышленно пробросили через Chisel) получить зашифрованные учётные данные из базы конфигурации.
Как это выглядит в логах: Запрос
GetCredentialsилиGetAllCredsв логах Veeam.

Обнаружение: Детектировать подобную активность можно по характерным запросам
getallcredsв журналеVeeam_Backup_API.Результат: Атакующий вытаскивает пароль от учетной записи
vvonka. Это поворотный момент – переход от эксплуатации уязвимостей ПО к легитимному входу под скомпрометированным пользователем.
Этап 5. Финал: LockBit и зачистка следов
Имея валидную учетку vvonka и доступ к серверу бэкапов bkcp01, атакующий наносит решающий удар.
Остановка бэкапов: Мы «заставили» атакующего выполнить команду stop-vbrcomputerbackupjob -job "ad_backup". Это демонстрация намерений. Перед шифрованием нужно убедиться, что данные не восстановить.

Команда на остановку задачи резервного копирования:
-
Deployment: Атакующий заходит на 3 хоста и разворачивает полезную нагрузку.

Хосты задействованные в задании. 2. Атрибуция: В логах антивируса (KSC) и Sysmon мы оставили следы семейства LockBit. Почему LockBit? Это самая активная и опасная группировка последних лет. Их софт быстр, эффективен и часто используется хакерскими группировками.

Интересный момент: Внимательный участник заметил, что этот шифровальщик также побывал на хосте win02, но был успешно удален антивирусным ПО. В то время, как на целевом сервере bkcp01, где установлен Veeam, антивирус имел не обновленные базы и не смог обнаружить шифровальщика. Этот случай как никогда показывает, насколько важно держать сигнатурные базы в актуальном состоянии и всегда их обновлять

Также мы оставили небольшую пасхалку для атрибуции самого оператора hostname его машины macbook-pro засветился в событиях входа (Event ID 4624). Это напоминание о том, что даже хакеры, ну или авторы задания, иногда забывают менять дефолтные настройки своих машин при подключении=).
Митигация: Как сломать этот Kill Chain
Разобранный сценарий показывает, что одной уязвимости недостаточно — успех атаки зависит от цепочки недочётов в конфигурации и мониторинге. Как можно было остановить атакующих на разных этапах?
1. Изоляция Confluence (Initial Access)
Самая очевидная мера — своевременный патчинг (CVE‑2023‑22515, CVE‑2023‑22527). Но в реальности патчи не всегда успевают накатить (как в нашем сценарии).
Рекомендация: не выставляйте Confluence и другие внутренние сервисы (Jira, Wiki) напрямую в интернет. Используйте VPN или Reverse Proxy с аутентификацией (например, Authelia/Keycloak) перед приложением.
WAF: настройте правила блокировки обращений к служебным путям вроде /setup/*.action из внешней сети.
2. Детектирование маскировки (Defense Evasion)
Атакующий переименовал nmap в scnr. Сигнатурный анализ по имени процесса здесь бессилен.
Рекомендация: настройте правила корреляции (SIEM/EDR) на запуск процессов не по имени, а по хеш‑суммам известных хакерских утилит или по метаданным файла (OriginalFileName в PE‑заголовке).
AppLocker/WDAC: в идеальном мире на серверах должен работать принцип белых списков (Allowlisting) — запрет запуска любых бинарников из /tmp или пользовательских директорий.
3. Сегментация сети (Lateral Movement)
Туннель через Chisel позволил добраться до сервера бэкапов.
Рекомендация: реализуйте жёсткую сетевую сегментацию. Серверы из DMZ (где живёт Confluence) не должны иметь сетевого доступа к критическим сегментам (Management/Backup LAN) по портам управления (RPC, SMB, Veeam API). Если веб‑серверу не нужно делать бэкапы самому, доступ должен быть закрыт на уровне межсетевого экрана.
4. Защита Veeam (Credential Access)
Уязвимость CVE‑2023‑27532 позволила вытащить пароли без аутентификации.
Рекомендация: помимо патчинга, ограничьте доступ к API‑портам Veeam (по умолчанию 9401) только доверенными IP‑адресами (администраторов и прокси‑серверов резервного копирования).
5. Гигиена антивируса
Тот факт, что на одном хосте шифровальщик был пойман, а на сервере бэкапов (с устаревшими базами) — нет, говорит сам за себя.
Рекомендация: мониторинг «здоровья» агентов EDR/AV должен быть таким же критичным процессом, как и мониторинг доступности бизнес‑сервисов.
Резюме: почему этот вектор работает
Этот кейс сложен тем, что в нём нет «одной большой кнопки HACK». Это цепочка:
Confluence (
CVE‑2023‑22515/CVE‑2023‑22527) → вход в периметр;Living off the Land (
nmap/chisel) → разведка и скрытность;Veeam (
CVE‑2023‑27532) → кража ключей от королевства (учёток);PowerShell + LockBit → уничтожение инфраструктуры.
Мы хотели, чтобы участники киберучений могли поработать с инцидентом, приближённым к действиям реального злоумышленника в реальной инфраструктуре, и потренировать свои аналитические скиллы. Для успешного расследования (и решения этого CTF) нужно было не просто фильтровать логи по слову ctf{flag}, а коррелировать события между веб‑сервером, auditd Linux, логами приложений Veeam и событиями безопасности Windows.
Именно так выглядят настоящие инциденты. Надеемся, разбор был полезен, и вы смогли посмотреть на это задание с другой стороны!
А какие самые хитрые цепочки атак встречались вам в расследованиях или CTF? Пишите в комментарии!
Watislove
Интересно было читать, спасибо!
Смутила только рекомендация:
или по метаданным файла (OriginalFileName в PE‑заголовке).OriginalFilename не хранится в заголовках файла, оно лежит в секции ресурсов