warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Добавляем IP-адрес машины в /
:
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
).
Нашли два открытых порта:
- 22 — служба OpenSSH 7.6p1;
- 80 — веб‑сервер Apache 2.4.29.
На SSH нам ловить нечего, пропускаем его.
Справка: брутфорс учеток
Поскольку вначале у нас нет учетных данных, нет и смысла изучать службы, которые всегда требуют авторизации (например, SSH). Единственное, что мы можем делать здесь, — это перебирать пароли брутфорсом, но машины с HTB почти всегда можно пройти по‑другому. В жизни таких вариантов может не быть, к тому же есть шансы подобрать пароль или получить его при помощи социальной инженерии.
Посмотрим, что нам покажет веб‑сервер. При обращении к нему происходит редирект на страницу /
, где нас встречает форма авторизации.
Понятно, что сайт не одностраничный, поэтому попробуем найти скрытые страницы. Так как первая страница была в формате 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
Нашли много файлов, теперь просканируем и скрытые каталоги.
ffuf -u http://timing.htb/FUZZ -t 256 -w directory_2.3_medium_lowercase.txt
В итоге находим каталоги для хранения скриптов и изображений. Больше нам ничего не доступно. Сканирование файлов бэкапов и поддоменов ничего не дало. Но мы еще не поискали параметры! Для сканирования логично выбрать страницу image.
, которая предположительно должна возвращать изображения. Так как мы не знаем, что будет передано в качестве значения параметра, попробуем передать само название страницы в надежде получить какую‑нибудь ошибку.
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.
Так как мы можем получить код любой страницы, идем по порядку и заглядываем в исходный код страницы login.
.
В нем ничего интересного нет, кроме подключения файла db_conn.
(строка 10). Здесь мы находим учетку для подключения к базе данных. Конечно же, просмотрим и его.
Пароль пока ни к чему не подошел, поэтому копаем дальше. Перейдем к файлам, о которых мы уже знаем. Начнем с upload.
.
В самом начале подключается файл admin_auth_check.
. Затем задаются необходимые параметры для загруженного файла, в том числе и file_name
. Имя файла создается по следующему алгоритму: берется строка '$file_hash'
, затем добавляется текущее время (результат выполнения функции time(
), все это конвертируется в хеш MD5, а дальше добавляется знак нижнего подчеркивания и имя файла, которое использовалось при загрузке. При этом файл должен иметь расширение jpg. А в файле admin_auth_check.
только сравнивается роль пользователя.
Если бы $file_hash
кто‑то по ошибке не обернул в кавычки, то подставилось бы значение переменной, полученное от PHP-функции uniqid(
. Разгадать уникальный идентификатор у нас бы не вышло, а без него единственной преградой будет вывод функции time(
.
Впрочем, пока что здесь больше ничего не сделать, и придется брутить форму авторизации. Для начала найдем имена пользователей, к примеру в файле /
.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»