Mimikatz: Извлекаем пароли пользователей Windows из памяти в открытом виде

В этой статье, написанной в рамках серии статьей, посвященной обеспечению безопасности Windows-систем (в последний статье мы обсуждали вопросы безопасности паролей, хранимых в GPP) , мы познакомимся с достаточно простой методикой получения в открытом виде паролей всех пользователей, работающих в Windows-системе с помощью Open Source утилиты 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

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

Mimikatz показать пароли всех пользователей, авторизовавшихся в windows системе

Как вы видите, утилита показала нам суперсложный пароль пользователя user в открытом виде! Все это благодаря тому, что на данном компьютере разрешено использовать режим отладки, выставляя флаг SeDebugPrivilege для нужного процесса. В этом режиме программы могут получать низкоуровневый доступ к памяти процессов, запущенных от имени системы.

Представьте себе, что это терминальный сервер, на котором одновременно работают множество пользователей, и на котором есть в том числе сессия администратора предприятия. Т.е. при наличии прав администратора на одном единственном сервере можно даже перехватить пароль администратора домена.

Примечание. В июне 2017 года многие крупные компании России, Украины и других стран были заражены вирусом-шифровальщиком not-petya, которые для сбора паролей пользователей и администраторов домена использовал в том числе интегрированный модуль mimikatz.
Примечание. Данная методика не сработает при наличии на системе современного антивируса, блокирующего инъекцию. В этом случае придется сначала создать дамп памяти машины и уже на другой машине «вытянуть» из него пароли для сессий всех пользователей.

Получение пароля пользователя из дампа памяти Windows

Дамп памяти для процесса LSASS можно получить с помощью PowerShell функции Out-Minidump.ps1 . Импортируйте функцию Out-Minidump в PoSh и создайте дамп памяти процесса LSASS:

Get-Process lsass | Out-Minidump

Get-Process-lsass PowershellПолучившийся дамп памяти, в нашем примере это lsass_592.dmp (по умолчанию он сохраняется в каталоге %windir\system32%), нужно скопировать на другой компьютер, в которой имеется утилита mimikatz и выполнить команду:

Mimikatz “sekurlsa::minidump lsass_592.dmp”

И следующей командой получим из сохранённого дампа памяти список пользователей, работающих в системе и их пароли:

mimikatz # sekurlsa::logonPasswords

windows узнать пароль пользователя из дампа памяти

Как вы видите, ничего сложного.

Таким способом можно получить дамп памяти с удаленного компьютера с помощью 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

Поиск в дампе памяти процесса lsassИ наконец, набираем:

.process /r /p fffffa800e0b3b30
!mimikatz

и получаем список пользователей Windows и их пароли в открытом виде.

Получаем пароль пользователя 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 не сможет извлечь пароли и хэши.

mimikatz creds_wdigest не работает в Windows 8.1 / 2012 R2 и выше

Однако при наличии прав администратора вы сможете легко изменить этот ключ:

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

UseLogonCredential отключаем в реестре

После этого вы опять сможете получить доступ к паролям в памяти LSA.

В инструментарии mimikatz есть и другие инструменты получения паролей и их хэшей из памяти (WDigest, LM-hash, NTLM-hash, модуль для захвата билетов Kerberos), поэтому в качестве рекомендаций рекомендуется реализовать следующие меры:

  • Запретить хранить пароли с использование обратимого шифрования (Reversible Encryption)
  • Запретить использование сохранённых паролей в 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. Отключаем провайдера wdigest в ветке LSA системыОднако нужно понимать, что атакующему, при наличии соответствующих прав на реестр, не составит труда вернуть настройки обратно.

Выводы. Еще раз напоминаем прописные истины:

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

Предыдущая статья Следующая статья


Комментариев: 12 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)