Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Сегодня мы с тобой пройдем путь от базового сканирования сайта до эксплуатации уязвимости типа LFI и загрузки шелла. Для захвата рута нам понадобится найти уязвимость в приложении на Java. А упражняться мы будем на средней по сложности машине Timing с площадки Hack The Box.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts
:
10.10.11.135 timing.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта.
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr 'n' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).
Результат работы скрипта
Нашли два открытых порта:
На SSH нам ловить нечего, пропускаем его.
Справка: брутфорс учеток
Поскольку вначале у нас нет учетных данных, нет и смысла изучать службы, которые всегда требуют авторизации (например, SSH). Единственное, что мы можем делать здесь, — это перебирать пароли брутфорсом, но машины с HTB почти всегда можно пройти по‑другому. В жизни таких вариантов может не быть, к тому же есть шансы подобрать пароль или получить его при помощи социальной инженерии.
Посмотрим, что нам покажет веб‑сервер. При обращении к нему происходит редирект на страницу /login.php
, где нас встречает форма авторизации.
Форма авторизации
Понятно, что сайт не одностраничный, поэтому попробуем найти скрытые страницы. Так как первая страница была в формате PHP, остальные будем перебирать с таким же расширением. Я для этого воспользуюсь сканером ffuf.
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-w
— словарь (я использую словари из набора SecLists);
-t
— количество потоков;
-u
— URL;
-fc
— исключить из результата ответы с кодом 403.
Запускаем его с нужными параметрами:
ffuf -u http://timing.htb/FUZZ -t 256 -w php_files_common.txt
Результат сканирования файлов PHP
Нашли много файлов, теперь просканируем и скрытые каталоги.
ffuf -u http://timing.htb/FUZZ -t 256 -w directory_2.3_medium_lowercase.txt
Результат сканирования скрытых каталогов
В итоге находим каталоги для хранения скриптов и изображений. Больше нам ничего не доступно. Сканирование файлов бэкапов и поддоменов ничего не дало. Но мы еще не поискали параметры! Для сканирования логично выбрать страницу image.php
, которая предположительно должна возвращать изображения. Так как мы не знаем, что будет передано в качестве значения параметра, попробуем передать само название страницы в надежде получить какую‑нибудь ошибку.
ffuf -u 'http://timing.htb/image.php?FUZZ=../image.php' -t 256 -w parameters.txt -fs 0
Результат сканирования параметра
Мы нашли один параметр — img
. То есть мы можем запросить файл с картинкой по его названию. Попробуем таким способом утащить какой‑нибудь системный файл, задав относительный путь.
Сообщение, что обнаружена атака
Нас поймали за руку!
Здесь, судя по всему, используются какие‑то фильтры, которые мешают нам читать любой файл. Я попробовал разные варианты оберток для параметра и обнаружил, что срабатывает запрос вот такого вида:
/image.php?img=php://filter/convert.base64-encode/resource=index.php
Справка: LFI в PHP
Local file inclusion (LFI) — техника, которая используется для получения доступа к файлам в системе через веб‑сервер. Чтобы сервер отобразил файл, а не попытался его выполнить, ему нужно передать «обертку» — команды, которые закодируют файл. После его получения останется лишь раскодировать его обратно. Существует множество готовых оберток, которые ты можешь применять при пентесте.
Содержимое этой страницы, полученной в ответ, будет закодировано в Base64. Декодировать можно прямо Burp, нажав Ctrl-Shift-B.
Получение кода страницы index.php
Так как мы можем получить код любой страницы, идем по порядку и заглядываем в исходный код страницы login.php
.
Исходный код login.php
В нем ничего интересного нет, кроме подключения файла db_conn.php
(строка 10). Здесь мы находим учетку для подключения к базе данных. Конечно же, просмотрим и его.
Исходный код db_conn.php
Пароль пока ни к чему не подошел, поэтому копаем дальше. Перейдем к файлам, о которых мы уже знаем. Начнем с upload.php
.
Исходный код upload.php
В самом начале подключается файл admin_auth_check.php
. Затем задаются необходимые параметры для загруженного файла, в том числе и file_name
. Имя файла создается по следующему алгоритму: берется строка '$file_hash'
, затем добавляется текущее время (результат выполнения функции time()
), все это конвертируется в хеш MD5, а дальше добавляется знак нижнего подчеркивания и имя файла, которое использовалось при загрузке. При этом файл должен иметь расширение jpg. А в файле admin_auth_check.php
только сравнивается роль пользователя.
Если бы $file_hash
кто‑то по ошибке не обернул в кавычки, то подставилось бы значение переменной, полученное от PHP-функции uniqid()
. Разгадать уникальный идентификатор у нас бы не вышло, а без него единственной преградой будет вывод функции time()
.
Исходный код admin_auth_check.php
Впрочем, пока что здесь больше ничего не сделать, и придется брутить форму авторизации. Для начала найдем имена пользователей, к примеру в файле /etc/passwd
.
Содержимое файла /etc/passwd
Источник: xakep.ru