Сброс пароля в Windows 7

Способ #1
Самая известная из утилит для сброса пароля — это Offline NT Password and Registry editor, которая умеет работать с паролями и реестром Windows XP/Vista/7. Скачайте USB- или CD-версию утилиты, запишите загруженный образ на диск или воспользуйтесь советами по созданию мультизагрузочной флешки.
Утилита не имеет графического интерфейса, но пугаться этого не стоит — всё в ней довольно просто и понятно. К тому же часто нужная опция предлагается по умолчанию, так что от вас потребуется только нажать клавишу Enter .
Загрузитесь со съёмного носителя Offline NT Password and Registry editor. Вам вряд ли понадобятся дополнительные опции загрузки, но в некоторых случаях придётся опытным путём подобрать те, которые помогут утилите запуститься.
На следующем этапе надо выбрать номер раздела, на котором установлена Windows. Ориентироваться придётся в первую очередь по его размеру. В принципе, до самого последнего момента программа не вносит никаких изменений в Windows, поэтому в случае ошибки можно просто начать процедуру сброса пароля заново.
Затем утилита попросит указать путь до папки, где находятся файлы SAM (фактически это куст реестра). По умолчанию это %WinDir%\System32\config, его же и предлагает вначале программа.
Потом надо выбрать первый пункт (Password reset), так как мы собрались сбросить пароль.
Дальше всё просто. Выбираем первый пункт (Edit user data and password).
Вписываем имя пользователя или его идентификатор в формате 0xabcd, где abcd — это RID, указанный в первом столбце. RID пригодится, если имя пользователя некорректно отображается или его не получается ввести. Например, при использовании кириллицы.
Осталось указать пункт 1 (сброс пароля) или 2 (смена пароля) для выбранного пользователя.
Выходим из режима редактирования пароля, введя восклицательный знак и нажав Enter .
Всё, почти готово. Выходим из режима редактирования пользователя, введя q и нажав Enter .
Затем соглашаемся с внесением изменений, введя y и ещё раз нажав Enter .
Отказываемся от дальнейшей работы в Offline NT Password and Registry editor (n), извлекаем флешку или CD-диск и нажимаем заветную комбинацию Alt + Ctrl + Del для перезагрузки. Готово — пароль сброшен!
Это был простой способ сброса пароля Windows 7. Сложностей с ним быть не должно. Надо всего лишь быть внимательным и аккуратным. Проблемы могут возникнуть только при отсутствии необходимых драйверов для работы с жёстким диском. Тогда придётся закинуть их на дискету (если вы, конечно, найдёте живого представителя этого почти вымершего вида и рабочий привод для него) или на USB-флешку и на первом этапе выбрать пункт fetch additional drivers.
Способ #2
Для второго и третьего способов понадобится только установочный диск Windows 7 и больше ничего. Более сложный вариант подразумевает включение изначально скрытой учётной записи «Администратор» путём правки реестра из установочной среды Windows 7. В дальнейшем можно будет войти в систему под этой учётной записи и отредактировать любой другой аккаунт в ОС . По умолчанию «Администратор» не имеет пароля, что только играет нам на руку.
Итак, загружаемся с установочного диска и нажимаем Shift + F10 для вызова командной строки, где вбиваем regedit и жмём Enter для запуска редактора реестра.
Выделяем раздел HKEY_LOCAL_MACHINE, а в меню выбираем «Файл» → «Загрузить куст» («File» → «Load hive»). Нам надо открыть файл SAM, который находится в папке %WinDir%\System32\config на том разделе, где установлена Windows 7.
При открытии будет предложено ввести имя загружаемого куста — вбивайте любое (например temp_hive ). Теперь нужно перейти к следующему разделу:
HKEY_LOCAL_MACHINE\ temp_hive \SAM\Domains\Account\Users\0001F4 и дважды кликнуть по ключу F. Откроется редактор, в котором надо перейти к первому числу в строке 038 — это 11. Его надо изменить на 10. Будьте аккуратны и не ошибитесь — поменять надо только его, не добавляя и не удаляя другие числа!
Теперь надо выделить наш куст HKEY_LOCAL_MACHINE\ temp_hive \ и в меню необходимо выбрать «Файл» → «Выгрузить куст» («File» → «Unload hive»), а затем подтвердить выгрузку куста.
Всё, можно перезагрузиться, вытащив предварительно установочный диск, и войти в систему под администраторским аккаунтом. В панели управления Windows в разделе управления пользователями можно изменить настройки другой учётной записи. В том числе поменять пароль.
Способ #3
Окошко это принадлежит маленькой вспомогательной программке sethc.exe , которая лежит в системной директории Windows. Более того, она запускается даже на экране приветствия, когда вам предлагают выбрать пользователя и ввести пароль. Но ведь её можно заменить чем-нибудь полезным. К примеру, cmd.exe . Естественно, не прямо в запущенной ОС , а загрузившись с установочного диска Windows 7 и нажав Shift + F10 .
Начать надо с определения буквы диска, на котором установлена Windows. Самое легкое — просто просмотреть содержимое корня раздела командой dir .
Определившись с буквой тома (например C: ), выполняем две простые команды — одной копируем на всякий случай оригинальный файл sethc.exe в корень диска или куда душе угодно, а второй меняем его на cmd.exe .
Перезагружаемся, быстро нажимаем несколько раз клавишу Shift (или Ctrl ) и наблюдаем окно с командной строкой. В нём надо ввести ещё одну команду, подставив соответственно имя нужного пользователя и новый пароль. С другими параметрами этой команды можно ознакомиться в официальной справке.
Если вы захотите вернуть всё на круги своя, то надо снова загрузиться с установочного диска, открыть консоль и выполнить команду:
Впрочем, можно ничего не восстанавливать, а оставить такой маленький трюк в системе на всякий случай.
Помимо перечисленных выше способов, есть множество других методик сброса или восстановления пароля в Windows, но сейчас мы их рассматривать не будем. Ещё раз призываем наших читателей быть внимательными и аккуратными при работе с внутренностями ОС , а ещё лучше не доводить ситуацию до «хирургического» вмешательства в SAM. Удачного вам восстановления доступа к учётным записям!
lmhosts.sam – что это за файл?
Lmhosts.sam — что за файл? Lmhosts — это файл локальных хостов, используемый Microsoft Wins Clients, который обеспечивает сопоставление IP-адресов с именами компьютеров NT (имена NetBIOS). Содержание Lmhosts.sam меняется, если пользователь не может получить доступ или испытывает трудности с DNS-сервером.
Одна из мер безопасности, предпринятых Microsoft для защиты Windows Vista и Windows 7 от вредоносных программ, заключалась в том, что было труднее редактировать файлы lmhosts и hosts. В старых версиях операционной системы вредоносный код мог изменить эти файлы, что приводило к заражению ПК. Многие начинающие пользователи задаются вопросом: «Lmhosts.sam — что это?». Постараемся ответить на него.
Файл lmhosts.sam — что это такое и что он делает?
lmhosts представляет собой текстовый файл, который сопоставляет адреса интернет-протокола (IP) с именами удаленных серверов NetBIOS, с которыми пользователь связывается по протоколу TCP/IP. Файл lmhosts находится в папке %SystemRoot%\System32\drivers\etc. Файл hosts содержит IP-адрес для сопоставлений имен доменов для TCP/IP. Имена доменов и имена NetBIOS должны быть одинаковыми, но поскольку их можно настроить в двух разных местах, могут возникнуть конфликты. Поэтому IP-сопоставления должны храниться в файле lmhosts, так как изначально именно этот файл
Как найти и отредактировать lmhosts.sam?
Найдите и откройте файл. Поскольку он может находиться в разных местах, обычно проще всего открыть поиск в Windows и выполнить поиск файла lmhosts.sam.
Для пользователей, которые вручную ищут местонахождение файла, ниже приведен список версий Microsoft Windows и расположение файла lmhosts:
- XP, Vista, 7 и 8 — C:\Windows\System32\Drivers\Etc;
- 2000 — C:\WINNT\System32\Drivers\Etc;
- 98 и ME — C:\Windows\.
После того, как файл был найден, щелкните правой кнопкой мыши по иконке и выберите «Открыть с . », в ответ на приглашение выберите «Выбрать программу из списка» и нажмите ОК. В списке программ, используемых для открытия файла, прокрутите список и в нижней части перечня выделите WordPad или предпочтительный текстовый редактор и нажмите кнопку ОК.
Lmhosts.sam — что за файл?
По умолчанию файл lmhosts уже содержит данные, такие как комментарии и примеры, похожие на приведенные ниже:
- 127.0.0.1 localhost # — пример локального хоста;
- 4.7.5.3 example # — пример поддельного IP-адреса и имени.
В приведенных выше двух строках есть IP-адрес, имя NetBIOS и примечание # для этой строки. Localhost и example — это имена NetBIOS.
Если вы используете Windows Vista, 7 или 8 dthcb., вы можете получить ошибку «отказано в доступе» при попытке сохранить изменения в файле lmhost. Эта ошибка возникает, когда ваш текстовый редактор не имеет прав администратора. Чтобы решить эту проблему, запустите «Блокнот» или WordPad в качестве администратора.
Файл lmhosts.sam — что это? LMHosts предназначен специально для сетей на базе Microsoft. Если вы связываете DNS с файлом hosts, LMhosts эквивалентен WINS. Это позволяет понять, кто является контроллером домена и какой домен просматривается.
Инструкция для пользователя
Создание и редактирование записей в Lmhosts.sam — что это? Используйте следующие правила для работы с данными в этом файле:
- Запись состоит из IP-адреса компьютера, за которым следует по крайней мере одна вкладка и имя NetBIOS компьютера.
- Вы не можете добавить запись LMHOSTS для компьютера, который является клиентом DHCP, потому что IP-адреса DHCP-клиентов изменяются динамически. Чтобы избежать проблем, убедитесь, что компьютеры, имена которых введены в файлы LMHOSTS, настроены на статические IP-адреса.
- Каждая запись должна быть отдельной строкой.
- Имена NetBIOS могут содержать символы верхнего и нижнего регистра и специальные символы.
- Каждое имя NetBIOS имеет длину 16 байт. Определяемая пользователем часть имени NetBIOS — это первые 15 символов. По умолчанию 16-й символ устанавливается для идентификации службы сетевого клиента, которая зарегистрировала это имя.
Наиболее знакомым примером имени NetBIOS является имя компьютера на любом компьютере под управлением Windows. Когда компьютер запущен, запускаются службы Microsoft Network Client и регистрируются их имена, которые состоят из имени компьютера плюс уникальный 16-й символ. Например, имя является службой Microsoft Workstation; имя — это служба Microsoft Server. Как вы можете видеть, единственная разница между этими двумя именами — это 16-й символ, который позволяет однозначно идентифицировать каждую из сетевых клиентских служб, запущенных на компьютере.
Хранение и шифрование паролей 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



