- HackWare.ru
- Этичный хакинг и тестирование на проникновение, информационная безопасность
- Как взломать пароль Windows
- Где Windows хранит пароль входа пользователя?
- Как получить хеши паролей Windows
- Дамп хешей паролей Windows на работающем компьютере
- Дамп хешей паролей Windows на выключенном компьютере
- Чем различаются хеши NTLM и NTLMv1/v2 и Net-NTLMv1/v2
- Что такое mimikatz
- Как установить mimikatz в Windows
- Как извлечь хеш пароля пользователя NTLM из файлов реестра
- Извлечение хеша NTLM из дампа lsass.DMP
- Брут-форс хеша NTLM
- Хранение и шифрование паролей Microsoft Windows
- V-блок
- Алгоритмы
- Bootkey
HackWare.ru
Этичный хакинг и тестирование на проникновение, информационная безопасность
Как взломать пароль Windows
В этой статье мы узнаем, где в 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, а именно следующие команды:
В некоторых инструкциях вместо SYSTEM сохраняют куст SECURITY — это ошибка, с кустами SECURITY и SAM восстановить хеш не удасться, нужны именно SYSTEM и SAM!
Хеш пароля также содержится в оперативной памяти, а именно в процессе Local Security Authority Process (lsass.exe). Этот процесс всегда запущен в работающей Windows и можно сделать его дамп (копию процесса в оперативной памяти сохранить на диск в виде файла). Для создания дампа можно использовать различные утилиты, в том числе две официальные:
Диспетчер задач уже имеется в каждой 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. В статье «Взлом сетевой аутентификации Windows» мы уже охотились за хешами NTLMv1 и NTLMv2, название которых довольно похоже.
На самом деле, 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\:
4. Запустите исполнимый файл.
Как извлечь хеш пароля пользователя NTLM из файлов реестра
Следующие команды нужно выполнять в консоли mimikatz.
Команда log включает запись всего вывода в ФАЙЛ:
К примеру, для запуска всего вывода в файл hash.txt:
Я скопировал с выключенного компьютера файлы SYSTEM и SAM, теперь для извлечения хеша мне нужно запустить команду вида:
Пример моей команды:
Вывод довольно обширный и много не до конца понятных данных. Интерес представляют последовательно идущие строки вида:
В моём примере интересные строки:
Также есть строки с именами пользователей:
Но после них нет строк с хешем NTLM, поскольку у этих пользователей не установлен пароль в системе.
Если вы хотите извлечь данные из файлов реестра текущей операционной системы, то выходим из mimikatz, для этого нажмите Ctrl+c.
Теперь сделаем дамп кустов реестра SYSTEM и SAM текущей системы:
Вновь запускаем mimikatz:
Включаем ведение журнала:
И выполняем команду с указанием файлов, в которые сохранены дампы кустов реестра, то есть SystemBkup.hiv и SamBkup.hiv:
Здесь найден только один пользователь с хешем:
На самом деле, для извлечения хешей NTLM из локальной системы необязательно было делать дамп кустов реестра. Другой вариант — повысить привилегии самой программы mimikatz и извлечь хеши непосредственно из системы. Для этого выполните команды:
Извлечение хеша NTLM из дампа lsass.DMP
По логике (и на практике) в дампе процесса Local Security Authority Process должен быть хеш только пользователя, выполнившего вход с паролем.
Вначале укажите путь до файла дампа командой вида:
Затем выполните команду:
Брут-форс хеша NTLM
Для взлома я возьму следующий хеш:
Загляним в справку Hashcat, чтобы узнать номер режима хеша NTLM:
То есть номер хеша NTLM равен 1000.
Чтобы запустить атаку по маске для взлома NTLM в Hashcat нужно выполнить команду вида:
Пример моей реальной команды:
- 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 — маска из пользовательского набора символов
Взломаем ещё один хеш:
Команда (другой хеш и другой набор пользовательских символов):
Итак, в этой статье мы научились извлекать хеш NTLM и взламывать пароль Windows. А что делать, если не удалось взломать NTLM? Ответ на этот вопрос смотрите во второй части, которая называется «Использование NTLM без взлома пароля: атака Pass-the-hash».
Хранение и шифрование паролей Microsoft Windows
Про взлом паролей windows было написано немало статей, но все они сводились к использованию какого-либо софта, либо поверхностно описывали способы шифрования LM и NT, и совсем поверхностно описывали syskey. Я попытаюсь исправить этот неодостаток, описав все подробности о том где находятся пароли, в каком виде, и как их преобразует утилита syskey.
Существует 2 возможности получения пароля — через реестр, или получив прямой доступ к файлам-кустам реестра. В любом случае нужны будут либо привелегии пользователя SYSTEM, либо хищение заветных файлов, например, загрузившись из другой ОС. Здесь я не буду описывать возможности получения доступа, но в целях исследования нагляднее будет выбрать первый вариант, это позволит не заострять внимание на структуре куста реестра. А запуститься от системы нам поможет утилита psExec от sysinternals. Конечно, для этих целей можно использовать уязвимости windows, но статья не об этом.
V-блок
Windows до версии Vista по умолчанию хранила пароль в двух разных хэшах — LM и NT. В висте и выше LM-хэш не хранится. Для начала посмотрим где искать эти хэши, а потом разберемся что из себя они представляют.
Пароли пользователей, а так же много другой полезной информации хранится в реестре по адресу HKLM\SAM\SAM\Domains\Account\users\[RID]\V
, известном как V-блок. Раздел SAM находится в соответствующем файле c:\Windows\System32\config\SAM. RID — уникальный идентификатор пользователя, его можно узнать, например заглянув в ветку HKLM\SAM\SAM\Domains\Account\users\names\ (параметр Default, поле — тип параметра). Например, RID учетной записи «Администратор» всегда 500 (0x1F4), а пользователя «Гость» — 501 (0x1f5). Доступ к разделу SAM по умолчанию возможен только пользователю SYSTEM, но если очень хочется посмотреть — запускаем regedit c правами системы:
PsExec.exe -s -i -d regedit.
Чтобы наблюдать V-блок в удобном виде можно, например, экспортировать его в текстовый файл (File-Export в Regedit).
Вот что мы там увидим:
От 0x0 до 0xCC располагаются адреса всех данных, которые находятся в V-блоке, их размеры и некоторая дополнительная информация о данных. Чтобы получить реальный адрес надо к тому адресу, что найдем прибавить 0xCC. Адреса и размеры хранятся по принципу BIG ENDIAN, т.е понадобится инвертировать байты. На каждый параметр отводится по 4 байта, но фактически все параметры умещаются в одном-двух байтах. Вот где искать:
Адрес имени пользователя — 0xС
Длина имени пользователя — 0x10
Адрес LM-хэша — 0x9с
Длина LM-хэша — 0xa0
Адрес NT-хэша — 0xa8
длина NT-хэша — 0xac
В данном случае имя пользователя найдется по смещению 0xd4 + 0xcc и его длина будет 0xc байт.
NT-хэш будет располагаться по смещению 0x12c + 0xcc и его размер (всегда один и тот же) = 0x14.
Еще одна деталь, касающаяся хранения паролей — как к NT- так и к LM-хэшу всегда добавляются спереди 4 байта, назначение которых для меня загадка. Причем 4байта будут присутствовать даже если пароль отключен. В данном случае видно, что длина LM хэша =4 и если посмотреть на его адрес, можно эти 4 байта увидеть несмотря на то что никакого LM-хэша нет.
Поэтому при поиске смещений хэшей смело прибавляем 4 байта к адресу, а при учете размеров — вычитаем. Если удобнее читать код — вот примерно так будет выглядеть поиск адресов с учетом инверсии, лишних четырех байтов и прибавления стартового смещения 0xcc (код C#)
int lmhashOffset = userVblock[0x9c] + userVblock[0x9d] * 0x100 + 4 + 0xcc;
int nthashOffset = userVblock[0xa8] + userVblock[0xa9] * 0x100 + 4 + 0xcc;
int lmhashSize = userVblock[0xa0] + userVblock[0xa1] * 0x100 — 4;
int nthashSize = userVblock[0xac] + userVblock[0xad] * 0x100 — 4;
int usernameOffset = userVblock[0xc] + userVblock[0xd] * 0x100 + 0xcc;
int usernameLen = userVblock[0x10] + userVblock[0x1a] * 0x100;
userVblock — значение HKLM\SAM\SAM\Domains\Account\users\\V в виде массива байт.
Еще про V-блок можно почитать тут.
Алгоритмы
Теперь разберемся в алгоритмах шифрования.
Формирование NT-хэша:
1. Пароль пользователя преобразуется в Unicode-строку.
2. Генерируется MD4-хэш на основе данной строки.
3. Полученный хэш шифруется алгоритмом DES, ключ составляется на основе RID пользователя.
Формирование LM-хэша:
1. Пароль пользователя преобразуется в верхний регистр и дополняется нулями до длины 14 байт.
2. Полученная строка делится на две половинки по 7 байт и каждая из них по отдельности шифруется алгоритмом DES. В итоге получаем хэш длиной 16 байт (состоящий из двух независимых половинок длиной по 8 байт).
3. Полученный хэш шифруется алгоритмом DES, ключ составляется на основе RID пользователя.
4. В windows 2000 и выше оба полученых хэша дополнительно шифруются алоритмом RC4 с помощью ключа, известного как «системный ключ» или bootkey, сгенерированого утилитой syskey, и шифруются довольно хитрым образом.
Рассмотрим общую последовательность действий для получения исходного пароля и каждый шаг в отдельности
1. Получаем bootkey, генерируем на его основе ключи для RC4, расшифровываем хэши с помощью RC4
2. Получаем ключи для DES из RID’ов пользователей, расшифровываем хэши DES’ом
3. Полученые хэши атакуем перебором.
Bootkey
Системный ключ (bootkey) разбит на 4 части и лежит в следующих разделах реестра:
HKLM\System\CurrentControlSet\Control\Lsa\JD
HKLM\System\CurrentControlSet\Control\Lsa\Skew1
HKLM\System\CurrentControlSet\Control\Lsa\GBG
HKLM\System\CurrentControlSet\Control\Lsa\Data
Раздел system находится в файле c:\Windows\System32\config\system
Следует отметить, что раздел CurrentControlSet является ссылкой на один из разделов controlset и создается в момент загрузки системы. Это значит что не получится его найти в файле system, если система неактивна. Если вы решили искать ключ в файле — необходимо узнать значение ContolSet по умолчанию в HKLM\SYSTEM\Select\default.
например если HKLM\SYSTEM\Select\default = 1 — вместо HKLM\System\CurrentControlSet\ ищем в HKLM\System\controlset001\
У каждого ключа реестра есть некий скрытый атрибут, известный как «class». Regedit его так просто не покажет, однако его можно увидеть, например, если экспортировать эти ключи реестра в текстовые файлы. В winapi для получения этого атрибута есть функция RegQueryInfoKey.
Фрагменты хранятся в строковом представлении шестнадцатеричных чисел, причем по принципу BIG ENDIAN (т.е не строка задом наперед, а число).
Например мы обнаружили вот такие записи:
Key Name: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\JD
Class Name: 46003cdb = <0xdb,0x3c,0x00,0x46>
Key Name: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Skew1
Class Name: e0387d24 = <0x24,0x7d,0x38,0xe0>
Key Name: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\GBG
Class Name: 4d183449 = <0x49,0x34,0x18,0x4d>
Key Name: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Data
Class Name: 0419ed03 =
Собраный из четырех частей ключ будет массивом байт:
Далее элементы этого массива переставляются на основе некоторого константного массива p
key[i] = scrambled_key[p[i]];
В нашем примере получится массив:
этот массив и есть так называемый bootkey. Только в шифровании паролей будет учавствовать не он а некий хэш на основе bootkey, фрагментов f-блока и некоторых констант. Назовем его Hashed bootkey.
Hashed bootkey
для получения Hashed bootkey нам понадобятся 2 строковые константы (ASCII):
string aqwerty = «!@#$%^&*()qwertyUIOPAzxcvbnmQQQQQQQQQQQQ)(*@&%\0»;
string anum = «0123456789012345678901234567890123456789\0»;
Также понадобится F-блок пользователя (HKLM\SAM\SAM\Domains\Account\users\\F), а именно его 16 байт: F[0x70:0x80]
На основе этих значений, склееных в один большой массив формируем MD5 хэш, который будет являться ключем для шифрования RC4
rc4_key = MD5(F[0x70:0x80] + aqwerty + bootkey + anum).
Последним шагом для получения hashed bootkey будет rc4 шифрование( или дешифрование — в rc4 это одна и та же функция) полученым ключем фрагмента F-блока F[0x80:0xA0];
Hashed bootkey у нас в руках, осталось научиться с ним правильно обращаться.
Дешифруем пароли с помощью Hashed Bootkey
для паролей LM и NT нам понадобятся еще 2 строковые константы —
string almpassword = «LMPASSWORD»;
string antpassword = «NTPASSWORD»;
а так же RID пользователя в виде 4х байт (дополненый нулями) и первая половина Hashed Bootkey (hashedBootkey[0x0:0x10]);
Все это склеивается в один массив байт и считается MD5 по правилам:
rc4_key_lm = MD5(hbootkey[0x0:0x10] +RID + almpassword);
rc4_key_nt = MD5(hbootkey[0x0:0x10] +RID + antpassword);
полученый md5 хэш — ключ для rc4, которым зашифрованы LM и NT хэши в V-блоке пользователя
userLMpass = RC4(rc4_key_lm,userSyskeyLMpass);
userNTpass = RC4(rc4_key_lm,userSyskeyNTpass);
На этом этапе мы получили пароли пользователя в том виде в каком они хранились бы без шифрования syskey, можно сказать, что самое сложное позади. Переходим к следующему шагу
На основе четырех байт RID’а пользователя с помощью некоторых перестановок и побитовых операций создаем 2 ключа DES. Вот функции, которые осуществляют обфускацию (С#):
private byte[] str_to_key(byte[] str) <
byte[] key = new byte[8];
key[0] = (byte)(str[0] >> 1);
key[1] = (byte)(((str[0] & 0x01) > 2));
key[2] = (byte)(((str[1] & 0x03) > 3));
key[3] = (byte)(((str[2] & 0x07) > 4));
key[4] = (byte)(((str[3] & 0x0F) > 5));
key[5] = (byte)(((str[4] & 0x1F) > 6));
key[6] = (byte)(((str[5] & 0x3F) > 7));
key[7] = (byte)(str[6] & 0x7F);
for (int i = 0; i
Ну здесь особо комментировать нечего, кроме функции des_set_odd_parity(ref key) — это одна из функций библиотеки openssl, задача которой добавить некоторые «биты нечетности», используется для повышения стойкости ключа к атакам.
Далее разбиваем NT (или LM) хэш на 2 части по 8 байт и дешифруем DES’ом -одна половина зашифрована ключем сформированым функцией sid_to_key1, вторая — sid_to_key2.
obfskey_l = userNTpass[0x0:0x7]
obfskey_r = userNTpass[0x8:0xF]
byte[] deskey1 = sid_to_key1(RID);
byte[] deskey2 = sid_to_key2(RID);
byte[] md4hash_l = DES(obfskey_l, deskey1);
byte[] md4hash_r = DES(obfskey_r, deskey2);
После склеивания двух половин мы получим md4 хэш -в случае NT, или LanMan (DES) — в случае LM. Полученый хэш полностью готов к атаке перебором.
Кстати, md4 Хэш от пустого пароля — 31d6cfe0d16ae931b73c59d7e0c089c0
Исследование проведено на основе исходного кода ophcrack-3.3.1, а так же статьи Push the Red Button:SysKey and the SAM