При аудите паролей регулярно приходится сталкиваться с расшифровкой паролей к хэшам различных видов - MD5, MySQL, SHA-1 и др. Как не спасовать перед этим непонятным набором цифр и букв? Как максимально быстро восстановить из хэша искомый пароль (даже если он сложный и не поддается полному перебору, к примеру "super@dmin")? Как подобрать пароль к хэшу, который имеет уникальный тип и не поддерживается ни в одной известной программе? Об этом и о многом другом расскажет данная статья на примере одного из самых эффективных в мире инструментов по работе с хэшами - программы PasswordsPro.
Введение

Давайте задумаемся - а что такое хэши? "Это зашифрованные пароли" скажет иной читатель и будет не совсем прав. Множество хэшей - это целый мир, так как хэш - это, в первую очередь, хранитель тайны и поверьте - таинственный мир хэшей полон загадок, темных мест и еще неоткрытых возможностей.

Да, за беспорядочным набором символов скрывается пароль. Но ведь пароль открывает доступ к тайне, а эта тайна может быть разной. Хэш может содержать малоинтересный пароль посетителя интернет-форума или же в нем спрятан пароль, открывающий доступ к базе данных с коммерческой информацией, цена которой - сумма со многими нулями. Знание законов таинственного мира хэшей позволяет весьма успешно восстанавливать практически любые пароли и сейчас вы увидите, что в этом мире можно чуствовать себя вполне уверенно, несмотря на то, что восстановление паролей, особенно сложных - это целое искусство, основанное на знании алгоритмов хэширования, на знании психологии и привычек пользователей, на интуиции и, в конце концов, на обыкновенном везении.

Итак у нас есть хэши, полученные каким-либо образом (дамп БД, просмотр cookies, анализ кэша Windows и т.д.), но паролей, зашифрованных в этих хэшах, мы не знаем. Что же делать?

Как известно, в подавляющем большинстве алгоритмов хэширования сделать обратное преобразование "пароль - хэш" невозможно. Отчасти из-за того, что при хэшировании используются необратимые математические операции, такие как OR, AND и др. Например, даже если в выражении "X AND Y = Z" мы знаем Y и Z, то мы никогда не сможем по ним точно восстановить исходное значение X (максимум, что мы можем - это рассчитать область возможных значений X, удовлетворяющих данному равенству). Другая же причина - коллизии, которые неизбежно возникнут из-за того, что область всех возможных хэшей любого алгоритма является величиной конечной и определяется размером хэша (к примеру, для MD5 количество всевозможных хэшей составляет 2 в степени 128), а количество исходных значений - величина бесконечная. Разумеется, существуют такие исходные сообщения, которым соответствует один и тот же хэш. Такие исходные сообщения и называются коллизиями.

Поэтому нам с вами остается только одно - подсчитывать хэши от различных паролей и сравнивать их с исходным хэшем - если они совпали, считаем, что исходный пароль найден. Разумеется, в интернете немало программ (в обиходе - "брутеры" или "брутфорсеры"), автоматизирующих работу по подбору паролей. Все они имеют как преимущества, так и недостатки, но среди них есть программа, имеющая ряд особенностей, благодаря которым она может стать для вас более предпочтительным инструментом для работы с хэшами - PasswordsPro.
Возможности
Поддержка любых типов хэшей

В настоящее время программа поддерживает хэши следующих типов:

* MySQL
* MySQL5
* DES(Unix)
* MD4
* MD4(HMAC)
* MD5
* MD5(HMAC)
* MD5(Unix)
* MD5(APR)
* SHA-1
* SHA-1(HMAC)
* SHA-256
* SHA-384
* Domain Cached Credentials
* Haval-128
* Haval-160
* Haval-192
* Haval-224
* Haval-256
и др.

Дополнительно к этим типам программа поддерживает хэши со всех популярных движков форумов (чего, кстати говоря, в таком объеме не умеет ни одна аналогичная программа в мире) - vBulletin, phpBB3, SMF, IPB, myBB и др. Вот некоторые из этих алгоритмов (в синтаксисе PHP):

* md5($pass.$salt)
* md5($salt.$pass)
* md5(md5($pass))
* md5(md5($pass).$salt)
* md5($salt.md5($pass))
* md5($salt.$pass.$salt)
* md5(md5($salt).$pass)
* md5(md5($salt).md5($pass))
* sha1($username.$pass)
и др.

Также сторонними разработчиками уже написано немало дополнительных модулей хэширования, а именно: MD2, MS SQL, Oracle DES, Oracle SHA-1, RipeMD-128 и др., которые доступны в дистрибутиве программы или на форуме программы, на котором уже опубликованы различные модули - к примеру, есть модуль для зашифрованных паролей к Lineage II C4.

Конечно же, этими алгоритмами возможности программы не ограничиваются, т.к. в нее можно достаточно просто добавить любой другой алгоритм и ниже вы увидите, как легко это сделать.
Дополнительные возможности

Одна из многих уникальных особенностей программы - то, что она поддерживает неполные хэши всех видов. А такая ситуация возникает нередко, ведь в БД различных сервисов для экономии места (или для усложнения аудита) часто сохраняется не весь хэш от пароля, а его часть (к примеру, половина), т.к. для достоверной проверки вводимого пароля и этого вполне достаточно, но вот при попытке восстановить пароли к таким хэшам практически все программы-брутфорсеры пасуют, сообщая что "хэши имеют неизвестный или неправильный формат". PasswordsPro же успешно работает с хэшами любой длины.

Восстановление паролей в Unicode кодировке - эта особенность также позволяет использовать программу там, где не справляются другие брутеры.

Встроенные в программу дополнительные инструменты (генератор хэшей, генератор паролей, конвертер Base64-текста, генератор словарей и др.) позволяют не выходя из PasswordsPro автоматизировать множество задач, постоянно возникающих при работе с паролями - от чистки и сортировки словарей до генерации случайных паролей по маске.
Атака на хэши

Как известно, все огромное множество паролей пользователей делится на два вида - сгенерированные из случайных символов и сформированные с какой-либо закономерностью.

Пароли из случайных символов пользователю запомнить сложно (разве что записать на стикер и приклеить к монитору), поэтому обычно это те пароли, которые различные интернет-сервисы генерируют самостоятельно и высылают пользователю. Часто эти пароли имеют длину до 8-9 символов и состоят из ограниченного числа символьных наборов (a...z + 0...9 или "abcdef" + 0...9) и вполне поддаются восстановлению. Но иногда бывает, что такие пароли ставятся на доступ к БД или для администрирования сервиса - подобные пароли (особенно длинные) восстановить практически нереально. Можно годами перебирать пароли к таким хэшам, задействуя сеть из множества компьютеров и все будет безрезультатно.

Но при этом сложно представить пользователя, использующего десятки паролей, начиная от входа в Windows и заканчивая доступом к форумам, своему блогу или социальным сетям, что все его пароли являются случайными и выглядят, к примеру, так: IKrGm&j1JPa7. Чаще всего это все-таки пароли, созданные на основе какой-либо закономерности - повторение одинаковых символов, использование в качестве пароля любимого слова или фразы, дата своего дня рождения и т.д. Такие пароли на практике составляют большую часть всех паролей, с которыми приходится иметь дело при аудите и теоретически любой пароль, использующий хоть какую-то закономерность, может быть в итоге восстановлен.

Итак, рассмотрим по порядку все виды атак, которые предлагает PasswordsPro, с помощью которых мы можем найти как случайные, так и неслучайные пароли.
Предварительная атака

Эта атака делает быструю проверку на пароли типа "12345", "ssssss", "abcdef", на ранее найденные пароли (которые программа накапливает в файле PasswordsPro.dic), а также на пароли, представляющие собой комбинации соседних клавиш на клавиатуре ("qwerty" и др.). Здесь проявляется одна важная особенность PasswordsPro - программа использует внешний текстовый файл с готовыми комбинациями клавиш, в который любой желающий может добавить свои комбинации в любом количестве. А т.к. немало паролей формируются из соседних клавиш ("qwerty123456", "q1w2e3r4t5", "qazwsxedc", "qweasd" и др.), то эта атака, несмотря на свое скромное название, часто помогает восстановить сложные пароли, например такие как "q1w2e3r4t5y6u7i8o9p0", которые другим атакам просто "не по зубам".
Атака полным перебором

Брутфорс - он и в Африке брутфорс. Полный перебор всех вариантов - далеко не самый эффективный вид атаки. Диапазон его применения - проверка хэшей на небольшую глубину широким символьным набором или на большую глубину узким символьным набором (0...9, например).

Еще одно применение этой атаки - поиск конкретного пароля, когда точно известна его длина (к примеру, 9 символов) и набор символов, из которых он состоит (к примеру, a...z + 0...9). В этом случае кроме полного перебора ничего не остается (разумеется, если другие виды атак не дали результата). Причем, в этом случае для обработки всех паролей в разумные сроки мощностей одного компьютера часто недостаточно и желательно распределить весь диапазон паролей между несколькими машинами (такое разбиение в PasswordsPro предусмотрено).

Разумеется, даже короткие пароли типа "R@dm1n" этим видом атаки найти практически нереально, т.к. при увеличении глубины перебора и количества символов в переборе количество перебираемых паролей возрастает лавинообразно - соответственно, возрастает и время их полного перебора.
Атака по маске

Этот вид атаки особенно полезен, если есть какая-либо информация о пароле - к примеру, он начинается на "123456", а дальше идет комбинация латинских заглавных и строчных букв или же пароль имеет длину 10-11 символов и содержит в себе слово "master", остальные символы неизвестны. Также этот вид атаки дает неплохой результат на больших массивах хэшей, когда пользователь последовательно перебирает маски для весьма вероятных паролей - admin?*?*?*, pass?d?d?d?d?d?d и т.д. Скорее всего, в одной из следующих версий PasswordsPro эта атака будет усовершенствована и пользователь сможет однократно составить свой список масок для вероятных паролей, после чего программа будет перебирать пароли, последовательно перебирая эти маски из списка, что немало упростит работу.
Простая атака по словарям

Ну вот, уважаемый читатель, мы и добрались до самых эффективных на сегодняшний день атак. "Эффективных" в том смысле, что они теоретически позволяют восстановить пароли любой длины и любой сложности, но лишь при одном условии - основу пароля составляет осмысленное слово, набор слов или фраза ("administrator", "computer", "iamhacker", "crackmehehe" и т.д.). А если учесть, что таких паролей - большинство, то вполне естественно, что эти виды атак дают нам "львиную" долю восстановленных паролей.

В простой атаке по словарям все действительно просто - загружаем в программу список словарей (т.е. текстовых файлов, содержащих готовые пароли в формате "одна строка = один пароль") и "прогоняем" по ним наши хэши. Эта атака дает хорошие результаты, когда для аудита паролей используются сотни мегабайт словарей, желательно - на разные тематики и на разных языках. Особую ценность представляют словари, содержащие ранее восстановленные пароли. Почему? Увидим ниже...
Комбинированная атака по словарям

Мощная атака, позволяющая быстро найти длинные пароли типа "ilovemercedes", "finalfantasy", "masterblaster" и др. - на практике, кстати, таких паролей немало, т.к. они легко запоминаются и с точки зрения пользователя вполне надежны, т.к. длинные, а значит - сложные для восстановления.

В PasswordsPro она реализована крайне просто - загружаем один словарь в первый набор словарей, другой (к примеру, все цифры от 0 до 99999) - во второй, ставим очередность формирования слов: "Набор словарей 1", "Набор словарей 2" и запускаем атаку. Весьма эффективно комбинировать хороший словарь с самим собой. В дистрибутиве PasswordsPro находится словарь "InsidePro.dic", в котором находятся часто употребляемые слова и части слов, и комбинируя слова из него друг с другом, можно восстановить немало 10...16-символьных "зубров".
Гибридная атака по словарям

Итак, гибридка - без сомнений, основной помощник при аудите паролей. Это именно та атака, которая за небольшое время находит такие сложные пароли, как "P@$$w0rd", "m@st3r", "h4cky0u", "forum+forum", "-lancer-", "h1a2c3k4e5r", "f.o.r.u.m.", "Mr.Johnson", "12345123451234512345", "CrIsTiNa" и многие другие. Поверьте - другими видами атак такие пароли восстановить в принципе невозможно.

Основная идея этой атаки в том, что пользователь берет какое-то известное ему слово, немного видоизменяет его по каким-то своим правилам и использует результат в качестве пароля. Этих правил - огромное количество, но есть среди них те, которые встречаются чаще других - заменить в пароле одни символы другими, напечатать одно и то же слово много раз, поочередно использовать разные регистры символов и т.д. Если "натравить" эту атаку на большой список хэшей из среднестатистических паролей, да еще и с мощным словарем, то вы будете приятно удивлены, глядя, как PasswordsPro щелкает пароли как семечки. Эта атака даже в одиночку может восстановить существенную часть списка хэшей.

Программа поддерживает множество правил, а также имеет в своем составе уже готовый файл с комбинациями этих правил (файл "Rules.txt"), который можно весьма успешно использовать как базовый набор, со временем расширяя его новыми комбинациями. Также удобно и то, что программа поддерживает список файлов с правилами, а значит можно создать несколько разных файлов "под себя" и использовать их с разными наборами словарей.

Перефразируя известное выражение - "кто больше знает таких правил, тот владеет миром", в смысле - доступом. И это факт. Чем больше будет известно таких правил переборщику паролей, тем эффективней будет его работа. Поэтому, поиск новых правил - задача, которую приходится выполнять регулярно. Именно с этой целью на сервисе База хэшей была организована очередь хэшей, пароли к которым не найдены в базе. Эта очередь из тысяч хэшей доступна всем и любой желающий может попробовать восстановить к ним пароли. Активные пользователи сервиса помогли восстановить уже многие тысячи паролей, которые в дальнейшем были опубликованы на форуме, и списки таких паролей - кладезь ценнейшей информации, позволяющая "брать на вооружение" все новые и новые правила, повышая эффективность этой атаки. Также для поиска новых правил полезно делать анализ словарей, состоящих из ранее восстановленных паролей.

Есть и еще одна приятная возможность, доступная в этой атаке - таблицы замены символов в паролях, особенно эффективные в не-англоязычных странах, где клавиатура имеет две раскладки, как, к примеру, у нас в России. Эти таблицы "на лету" подменяют символы в паролях, формируя вместо "привет" пароль "privet" или "ghbdtn". К примеру, пароль "fktrcfylh2008" без использования таких таблиц восстановить любыми видами атак практически нереально. А с таблицами атака на него займет несколько минут, т.к. это не что иное, как пароль "александр2008", набранный в английской раскладке клавиатуры.
Атака по Rainbow-таблицам

Это еще одна очень эффективная атака (разумеется, если у вас имеются таблицы для нужного алгоритма и "success rate" этих таблиц не ниже 95...98%). Тут все просто - в настройках программы загружаем таблицы, отмечаем нужные хэши и нажимаем "Старт".

В этой атаке проявляется еще одна уникальная особенность PasswordsPro - умение работать с таблицами для любых алгоритмов, таблицы для которых сгенерированы в формате программы rtgen.exe v1.2. К примеру, "штатная" утилита rcrack.exe для брута по таблицам поддерживает лишь два алгоритма - MD5 и LM. Для поддержки других алгоритмов ее нужно перекомпилировать. А с PasswordsPro ничего перекомпилировать не надо - генерируйте таблицы хоть для MD2, хоть для SHA-512, хоть для RipeMD-128, затем добавляйте их в программу и спокойно ищите по ним свои пароли - главное, чтобы в наличии был нужный DLL-модуль хэширования.
Создание своих модулей

Представьте ситуацию - мы извлекли из БД форума кучу хэшей пользователей и, покопавшись в исходниках форума, обнаружили, что его автор использовал алгоритм, который не поддерживает ни один известный переборщик паролей - пусть, к примеру, это будет алгоритм md5(md5($pass).$pass). Сразу возникает вопрос - что делать? Правильно! Выбора нет - сначала надо сбегать за пивом...

Сбегали? А вот теперь у нас есть выбор.

Можно написать свой переборщик паролей под этот алгоритм, на что уйдет уйма времени, а можно сделать проще - написать лишь код для реализации нужного алгоритма, "обернуть" его парой функций, скомпилировать в DLL-файл и загрузить в PasswordsPro. Заманчиво? Не то слово! А если учесть, что в дистрибутиве программы находятся исходные тексты готового модуля на Visual C++ .NET 2003, то пользователь, имеющий хорошие навыки использования VC++, сможет брутить подобные хэши со всей "мощью" PasswordsPro, затратив всего 10-15 минут!

Смотрим каталог \Modules\API дистрибутива программы, находим в нем архив "RAdmin_Sources.zip", разархивируем и запускаем файл "RAdmin.vcproj". А теперь отвлечемся немного от Visual Studio и прочитаем небольшой файл "ReadMe.chm" в том же каталоге. Так-c... Для связи модуля с PasswordsPro достаточно... двух функций и пары флагов. Всего-то?! Да.
#include "stdafx.h"
#include "MD5.h"
#include "Modules.h"

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}

extern "C" __declspec(dllexport) void GetInfo(MODULEINFO *info)
{
// Наш хэш зависит только от пароля и имеет бинарный формат
info->dwFlags = MODULE_HASH_SIMPLE | MODULE_HASH_BINARY;

// Тип нашего хэша
info->szHashType = "md5(md5($pass).$pass)";

// О модуле
info->szAbout = "Тестовый модуль для хэшей вида md5(md5($pass).$pass)";
}

extern "C" __declspec(dllexport) int GetHash(HASHINFO *info)
{
unsigned char buf[256];

// Формируем md5($pass)
MD5_CTX context;
MD5Init(&context);
MD5Update(&context, (unsigned char *)info->szPassword, info->nPasswordLen);
MD5Final(buf, &context); // 16 байт хэша -> в buf

// Т.к. PHP-функция md5() возвращает MD5-хэш
// в 32-символьном текстовом виде, то и нам надо сделать
// такое же преобразование. Автор использует для этого
// собственную inline-функцию, написанную на Ассемблере,
// но для сокращения места она не приводится, тем более,
// что преобразовать 16 байт хэша в HEX-формат, к примеру:
// "e2fc714c4727ee9395f324cd2e7f331f" - задача элементарная.

// Преобразуем хэш в текстовую строку по адресу &buf[16]
HashToText(&buf[16], buf, 16);

// Копируем пароль после текстового хэша
memcpy(&buf[48], info->szPassword, info->nPasswordLen);

// Финальное хэширование строки md5($pass).$pass
MD5Init(&context);
MD5Update(&context, &buf[16], info->nPasswordLen + 32);
MD5Final(info->pBuf, &context);

return 16;
}

Компилируем, запускаем PasswordsPro, открываем настройки, ищем закладку "Модули хэширования", кликаем правой кнопкой мыши, добавляем наш модуль в список и, если он скомпилирован правильно, программа радостно скажет "Модуль загружен успешно!".

Небольшое тестирование... Нажимаем F6, вызывая встроенный в программу генератор хэшей, и смотрим, как новоявленный модуль реагирует на изменение пароля. Для проверки стабильности работы модуля можно потестировать пароль на максимальную длину в 127 символов. Если все ок, то принимайте поздравления - вы успешно "подружили" PasswordsPro со своим алгоритмом!

Что делать теперь? Брутить, брутить и брутить! Но сначала сбегаем еще за пивом... Что значит "еще не закончилось"? Даже вторая бутылка не открыта? Ну вот, видите - создать нужный модуль хэширования к программе за 10 минут вполне реально.

Любители Дельфи или VB без труда сформируют собственные прототипы нужных функций, а поклонников Ассемблера ждет приятный сюрприз - на форуме программы есть уже готовые шаблоны для MASM'а и FASM'a.
Заключение

Ну что ж, мы воочию убедились, что программа PasswordsPro в умелых руках (особенно "укомплектованная" большим количеством хороших словарей и Rainbow-таблиц) - это реально боевая машина пехоты (в смысле - специалиста по аудиту), смело пробирающаяся по туманному миру хэшей, ломая их направо и налево. Но и она не всесильна, к сожалению.

В этом таинственном мире есть такие места, где PasswordsPro (как и другие программы) просто "буксует", перебирая хэши, алгоритмы которых пока не позволяют получить скорость перебора выше нескольких тысяч, сотен и даже десятков паролей в секунду.

Есть над чем подумать и в отношении коллизий - о них много говорят, но пока никто не нашел ни одной пары разных паролей, дающих одинаковый SHA-1 или MD5-хэш. Первая же найденная пара таких паролей даст бесценную информацию о том, как разные биты этих паролей "пробегают" по всем ступенькам хэширования, трансформируясь в одинаковый результат.

Конечно же, и существующие в программе атаки еще не до конца раскрыли свой потенциал, так что направлений развития программы - масса. От создания новых модулей хэширования и оптимизации существующих (к примеру, задействование видеопроцессоров для перебора паролей) до увеличения "интеллектуальности" самих атак.

Поэтому так и хочется воскликнуть: "PasswordsPro - все только начинается"!

©InsidePro Software, апрель 2008