Mimikatz Витягуємо паролі користувачів Windows з пам'яті у відкритому вигляді

У цій статті, написаній в рамках серії статтею, присвяченій забезпеченню безпеки Windows-систем (в останній статті ми обговорювали питання безпеки паролів, збережених в GPP), ми познайомимося з досить простою методикою отримання у відкритому вигляді паролів всіх користувачів, що працюють в Windows-системі за допомогою Open Source утиліти Mimikatz.

Дісклаймер.  Інформація та технології, описані в даній статті, варто використовувати тільки в інформаційно-ознайомлювальних цілях, і ні в якому разі не застосовувати для отримання доступу до облікових записів, інформації і систем третіх осіб.

зміст:

  • Зберігання паролів і хеш в пам'яті Windows
  • Використовуємо Mimikatz для добування паролів користувачів з lsass.exe онлайн
  • Отримання пароля користувача з дампа пам'яті Windows
  • Отримання паролів користувачів з файлів віртуальних машини і файлів глибокого сну
  • Використання Mimikatz в pass-the-hash атаках
  • Як захистити Windows від добування паролів з пам'яті через mimikatz?

Зберігання паролів і хеш в пам'яті Windows

Більшість системних адміністраторів перебувають у впевненості, що Windows не зберігає паролі користувачів у відкритому вигляді, а тільки у вигляді його хеша. І хоча на сьогодні існує велика кількість утиліт, які здатні мати хеші призначених для користувача паролів з системи, можна з певною упевненістю сказати, що при використанні досить складного пароля не «зі словника", у зловмисника практично немає шансів підібрати його прямим брутфорсом або по базі вже розрахованих хеш.

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

Так, наприклад, механізм дайджест-аутентифікації (HTTP Digest Authentication), використовуваний для підтримки SSO (Single Sign On), для своєї роботи вимагає знання вводиться пароля користувача, а не тільки його хешу (про те, чому розробниками це було реалізовано саме так, можна тільки здогадуватися). Паролі (саме паролі, а не їх хеші) користувачів в зашифрованому вигляді зберігаються в пам'яті ОС, а якщо бути більш точним в пам'яті процесу LSASS.EXE. Проблема в тому, що шифрування паролів реалізовано за допомогою стандартних Win32 функцій LsaProtectMemory і LsaUnprotectMemory, які призначені для шифрування / розшифрування деякої ділянки пам'яті. Утиліта французьких розробників mimikatz дозволяє отримувати зашифровані дані з пам'яті і розшифровувати їх за допомогою функції LsaUnprotectMemory, дозволяючи вивести на консоль всі облікові записи користувачів, авторизованих в системі, і їх паролі (у відкритому, вже розшифрованому вигляді!). Для експлуатації уразливості атакуючий повинен мати можливість приєднати спеціальну бібліотеку до процесу lsass.exe.

завантажити утиліту mimikatz можна тут: http://blog.gentilkiwi.com/mimikatz

інфо. Утиліта mimikatz детектується більшістю антивірусів і браузерами, як потенційно небезпечне ПО (хакерська утиліта).

Утиліта mimikatz дозволяє витягти паролі користувачів безпосередньо з пам'яті (шляхом ін'єкції в lsass.exe бібліотеки sekurlsa.dll), з збереженого дампа пам'яті комп'ютера або навіть з файлу гібернації.

Використовуємо Mimikatz для добування паролів користувачів з lsass.exe онлайн

  • Скачайте і запустіть Mimikatz.exe з правами адміністратора (тобто x86 і x64-версії утиліти для відповідних систем)
  • В контексті утиліти виконайте команди

mimikatz # privilege :: debug
mimikatz # sekurlsa :: logonPasswords full

(Остання команда для все активних користувачів в системі відобразить імена облікових записів і їх паролі).

Як ви бачите, утиліта показала нам суперскладний пароль користувача user в відкритому вигляді! Все це завдяки тому, що на даному комп'ютері дозволено використовувати режим налагодження, виставляючи прапор SeDebugPrivilege для потрібного процесу. У цьому режимі програми можуть отримувати низькорівневий доступ до пам'яті процесів, запущених від імені системи.

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

Примітка. У червні 2017 року багато великих компаній Росії, України та інших країн були заражені вірусом-шифрувальником not-petya, які для збору паролів користувачів і адміністраторів домену використовував в тому числі інтегрований модуль mimikatz.Примітка. Дана методика не спрацює при наявності на системі сучасного антивіруса, блокуючого ін'єкцію. В цьому випадку доведеться спочатку створити дамп пам'яті машини і вже на іншій машині "витягнути" з нього паролі для сесій всіх користувачів.

Отримання пароля користувача з дампа пам'яті Windows

Дамп для процесу LSASS можна отримати за допомогою PowerShell функції Out-Minidump.ps1. Імпорт функцію Out-Minidump в PoSh і створіть дамп пам'яті процесу LSASS:

Get-Process lsass | Out-Minidump

Одержаний дамп пам'яті, в нашому прикладі це lsass_592.dmp (За замовчуванням він зберігається в каталозі% windir \ system32%), потрібно скопіювати на інший комп'ютер, в якій є утиліта mimikatz і виконати команду:

Mimikatz "sekurlsa :: minidump lsass_592.dmp"

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

mimikatz # sekurlsa :: logonPasswords

Як ви бачите, нічого складного.

Таким способом можна отримати дамп пам'яті з віддаленого комп'ютера за допомогою psexec або через WinRM (при наявності прав адміністратора) і витягти з нього пароль користувача.

Отримання паролів користувачів з файлів віртуальних машини і файлів глибокого сну

Йдемо далі. За допомогою простих маніпуляцій зловмисник може легко витягти паролі користувачів з файлів дампов пам'яті, файлу гібернації системи (hiberfil.sys) і. vmem файлів віртуальних машин (файли підкачки віртуальних машин і їх снапшоти).

Для цього знадобиться пакет Debugging Tool for Windows (WinDbg), сам mimikatz і утиліта перетворення .vmem в файл дампа пам'яті (Для Hyper-V це можливо vm2dmp.exe або MoonSols Windows Memory toolkit для vmem файлів VMWare).

Наприклад, в разі необхідності перетворити файл підкачки vmem віртуальної машини VMWare в дамп, виконаємо команду:

bin2dmp.exe "winsrv2008r2.vmem" vmware.dmp

Отриманий дамп завантажуємо в WinDbg (File -> Open Crash Dump), завантажуємо бібліотеку mimikatz з ім'ям mimilib.dll (версію вибрати залежно від розрядності системи):

.load mimilib.dll

Шукаємо в дампі процес lsass.exe:

!process 0 0 lsass.exe

І нарешті, набираємо:

.process / r / p fffffa800e0b3b30
!mimikatz

і отримуємо список користувачів Windows і їх паролі у відкритому вигляді.

Отримання паролів користувачів Windows у відкритому вигляді за допомогою утиліти Mimikatz працює на наступних системах, в тому числі запущених на Гіпервізор Hyper-V 2008/2012 і VMWare різних версій:

  • Windows Server 2008/2008 R2
  • Windows Server 2012 / R2
  • Windows 7
  • Windows 8
Примітка. До речі кажучи, функціонал mimikatz вже впроваджений в Metasploit Framework.

Використання Mimikatz в pass-the-hash атаках

У тому випадку, якщо не вдається отримати пароль користувача, а тільки його хеш, Mimikatz можна використовувати для так званої атаки pass-the-hash (повторне використання хеша). В цьому випадку хеш може використовувати для запуску процесів від імені користувача. Наприклад, отримавши NTLM хеш користувача, наступна команда запустить командний рядок від імені привілейованого аккаунта:
sekurlsa :: pth / user: Administrator / domain: CORP / ntlm: NTLM-хеш / run: cmd

Як захистити Windows від добування паролів з пам'яті через mimikatz?

У Windows 8.1 і Server 2012 R2 (і вище) можливості по вилученню паролів через LSASS дещо обмежені. Так, по-замовчуванню в цих системах в пам'яті не зберігаються LM хеш і паролі у відкритому вигляді. Цей же функціонал бекпортірован і на більш ранні версії Windows (7/8 / 2008R2 / 2012), в яких потрібно встановити спеціальне оновлення KB2871997 (Оновлення дає і інші можливості посилити безпеку системи) і в гілці HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ WDigest установити параметр DWORD реєстру UseLogonCredential рівним 0 (WDigest відключений).

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

Однак при наявності прав адміністратора ви зможете легко змінити цей ключ:

reg add HKLM \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ WDigest / v UseLogonCredential / t REG_DWORD / d 1

Після цього ви знову зможете отримати доступ до паролів в пам'яті LSA.

В інструментарії mimikatz є й інші інструменти отримання паролів і їх хеш з пам'яті (WDigest, LM-hash, NTLM-hash, модуль для захоплення квитків Kerberos), тому в якості рекомендацій рекомендується реалізувати наступні заходи:

  • Заборонити зберігати паролі з використання оборотного шифрування (Reversible Encryption)
  • відключити NTLM
  • Заборонити використання збережених паролів в Credential Manager
  • Заборонити кешувати облікові дані доменних користувачів (ключ CachedLogonsCount і політика Interactive logon: Number of previous logons to cache)
  • Якщо функціональний рівень домену не нижче Windows Server 2012 R2, можна додати облікові записи адміністартороав в спеціальну групу Protected Users
Порада. Докладна стаття про способи захисту пам'яті Windows систем від добування паролів і хеш - Методи захисту від mimikatz в домені Windows

При тестуванні mimkatz в Windows 10 Pro x64 з настройками утиліта mimkatz 2.0 змогла отримати хеші пароля активного користувача (але не пароль у відкритому вигляді).

На старіших системах потрібно в якості тимчасового рішення потрібно обмежити отримання привілеї debug і відключити постачальника безпеки wdigest через реєстр. Для цього в гілці HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa знайдіть ключ Security Packages і видалити зі списку пакетів рядок wdigest. Однак потрібно розуміти, що атакуючому, при наявності відповідних прав на реєстр, не важко буде повернути настройки назад.

висновки. Ще раз нагадуємо прописні істини:

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