[Создание своих модулей]
Представьте ситуацию - мы извлекли из БД форума кучу хэшей пользователей и, покопавшись в исходниках форума, обнаружили, что его автор использовал алгоритм, который не поддерживает ни один известный переборщик паролей - пусть, к примеру, это будет алгоритм 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 достаточно... двух функций и пары флагов. Всего-то?! Да.
PHP код:
#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;
}
Листинг 1. Исходный текст модуля для алгоритма md5(md5($pass).$pass).
Компилируем, запускаем PasswordsPro, открываем настройки, ищем закладку "Модули хэширования", кликаем правой кнопкой мыши, добавляем наш модуль в список и, если он скомпилирован правильно, программа радостно скажет "Модуль загружен успешно!".
Небольшое тестирование... Нажимаем F6, вызывая встроенный в программу генератор хэшей, и смотрим, как новоявленный модуль реагирует на изменение пароля. Для проверки стабильности работы модуля можно потестировать пароль на максимальную длину в 127 символов. Если все ок, то принимайте поздравления - вы успешно "подружили" PasswordsPro со своим алгоритмом!
Что делать теперь? Брутить, брутить и брутить! Но сначала сбегаем еще за пивом... Что значит "еще не закончилось"? Даже вторая бутылка не открыта?

Ну вот, видите - создать нужный модуль хэширования к программе за 10 минут вполне реально.
Любители Дельфи или VB без труда сформируют собственные прототипы нужных функций, а поклонников Ассемблера ждет приятный сюрприз - на форуме программы есть уже готовые шаблоны для MASM'а и FASM'a.
[Заключение]
Ну что ж, мы воочию убедились, что программа PasswordsPro в умелых руках (особенно "укомплектованная" большим количеством хороших словарей и Rainbow-таблиц) - это реально боевая машина пехоты (в смысле - специалиста по аудиту), смело пробирающаяся по туманному миру хэшей, ломая их направо и налево. Но и она не всесильна, к сожалению.
В этом таинственном мире есть такие места, где PasswordsPro (как и другие программы) просто "буксует", перебирая хэши, алгоритмы которых пока не позволяют получить скорость перебора выше нескольких тысяч, сотен и даже десятков паролей в секунду.
Есть над чем подумать и в отношении коллизий - о них много говорят, но пока никто не нашел ни одной пары разных паролей, дающих одинаковый SHA-1 или MD5-хэш. Первая же найденная пара таких паролей даст бесценную информацию о том, как разные биты этих паролей "пробегают" по всем ступенькам хэширования, трансформируясь в одинаковый результат.
Конечно же, и существующие в программе атаки еще не до конца раскрыли свой потенциал, так что направлений развития программы - масса. От создания новых модулей хэширования и оптимизации существующих (к примеру, задействование видеопроцессоров для перебора паролей) до увеличения "интеллектуальности" самих атак.
Поэтому так и хочется воскликнуть: "PasswordsPro - все только начинается"!
(c)InsidePro