Вопрос или проблема
Я создал хэш, который зашифрован так: $What_i_made=BCrypt(MD5(Plain Text Password))
, и мне интересно, можно ли его взломать. В настоящее время я подумал о двух способах:
- Атакой методом перебора
$What_i_made
получить MD5-хэш, затем провести словарную атаку на MD5-хэш. Однако это займет вечность, так как Bcrypt работает медленно, и MD5 содержит 32 символа. $result=Bcrypt(MD5(random combination))
и сравнить$result
с$What_i_made
до тех пор, пока они не совпадут. Это будет намного быстрее, но я не совсем уверен, как это сделать. Я пробовал John и Hashcat, но не совсем уверен, как это сделать с их помощью, поэтому обращаюсь за помощью к сообществу. Спасибо. 🙂
Кстати, подойдут любые другие инструменты, которые работают, и я бы предпочел метод, который позволяет попробовать все возможные комбинации вместо словарных атак.
Как взломщик паролей, я воодушевляю всех своих целей использовать эту технику. 😉
Это кажется хорошей идеей, но оказывается, что против атак в реальных условиях обертывание несоленого хэша с помощью bcrypt демонстративно слабее простого использования bcrypt.
Это потому, что атакующие могут сделать следующее:
- Получить существующие MD5 пароли – даже те, которые еще не взломаны
- Запустить эти MD5 как словарь против вашего
bcrypt(md5($pass))
корпуса, чтобы идентифицировать bcrypt с известными MD5 - взломать MD5 вне bcrypt на гораздо большей скорости
Другими словами, в многих случаях вы можете просто сначала взломать внутренний хэш. А для быстрого хэша, такого как MD5, это означает, что для любого пароля, который можно взломать Прежде, сопротивление bcrypt атакам методом перебора значительно ослаблено.
(Не могу приписать себе заслугу за технику, известную как “password shucking”, но она очень эффективна – особенно когда пользователи используют одни и те же пароли на нескольких сайтах, а атакующий имеет доступ к слитым данным паролей.)
Вот более конкретный, одиночный сценарий для пользователя:
- Пользователь [email protected] имеет учетную запись на Сайте B, который использует bcrypt(md5($pass))
- Сайт B скомпрометирован, и его списки хэшей паролей утекли в сеть
- Атакующий приобретает утечку Сайта B
- Атакующий проводит быстрое исследование слитых данных и определяет на основе тестов, что сайт использует bcrypt(md5($pass))
- Атакующий сначала проверяет, содержатся ли какие-либо другие известные утечки в их коллекции, содержащие [email protected]
- Если да, и какие-либо из этих других утечек используют MD5, атакующий просто пробует другие MD5 [email protected] чтобы узнать, использовала ли Джо тот же пароль, и является ли он тем, который “внутри” bcrypt
- Если MD5 Джо находится внутри этого bcrypt, атакующий может теперь атаковать этот MD5 на огромных скоростях, пока не найдет взлом. Теперь атакующий знает исходный пароль [email protected] для Сайта B
Теперь представьте, что атакующий хочет атаковать все 100 000 хэшей bcrypt на Сайте B… но атакующий также имеет доступ к тысячам других утечек:
- Атакующий пишет скрипт для проверки всех утечек MD5 на наличие адресов электронной почты, совпадающих с Сайтом B
- Атакующий сначала пробует специфические для пользователя MD5 против каждого конкретного пользователя bcrypt с Сайта B. (Это “корреляционная атака”). Атакующий быстро взламывает около 20% (что также удаляет их соли из общей атаки, увеличивая скорость атаки для оставшихся хэшей)
- Атакующий затем пробует другие известные MD5 из общих паролей и аналогично удаляет эти bcrypt из атаки
- Атакующий затем пробует другие неизвестные MD5 из этих утечек. Если они находят один, они могут атаковать эти MD5 как прямые MD5 (без участия bcrypt вообще)
И да, атаку можно также выполнить напрямую – либо путем шифрования предполагаемых паролей самостоятельно, либо используя инструмент, который поддерживает bcrypt(md5($pass))
, например MDXfind:
$ echo "password" | tee bcrypt-md5.dict
password
$ echo -n 'password' | md5sum | awk '{print $1}'
5f4dcc3b5aa765d61d8327deb882cf99
$ htpasswd -bnBC 10 "" 5f4dcc3b5aa765d61d8327deb882cf99 | tr -d ':\n' | tee bcrypt-md5.hash; echo
$2y$10$JUbSRB0GQv.yKorqYdBaqeVYLtbZ/sRXdbPWt6u/6R3tqbaWTlQyW
$ mdxfind -h '^BCRYPTMD5$' -f bcrypt-md5.hash bcrypt-md5.dict
Работаем с типами хэшей: BCRYPTMD5
Заняло 0,00 секунд для чтения хэшей
Поиск через 0 уникальных хэшей из bcrypt-md5.hash
Поиск через 1 уникальный BCRYPT хэшей
Максимальная глубина цепочки хэшей - 0
Минимальная длина хэша - 512 символов
Используется 4 ядра
BCRYPTMD5 $2y$10$JUbSRB0GQv.yKorqYdBaqeVYLtbZ/sRXdbPWt6u/6R3tqbaWTlQyW:password
Готово - 1 поток поймал
1 строк обработано за 0 секунд
1,00 строк в секунду
0,07 секунд на хэширование, 2 общих вычисления хэша
0,00M хэшей в секунду (приблизительно)
1 общий файл
1 BCRYPTMD5x01 хэшей найдено
1 Общих хэшей найдено
К сожалению (для атакующего 😉 ), похоже, что издание “jumbo” John the Ripper не поддерживает этот алгоритм, используя свою динамическую синтаксис:
$ john --format=dynamic="bcrypt(md5($pass))" --test
Ошибка: динамический хэш должен начинаться с md4/md5/sha1 и НЕ *_raw версии. Это выражение не делается
Но для целенаправленного атакующего гораздо более эффективно просто вытянуть эти MD5 из ваших хэшей, а затем атаковать те MD5 на скоростях миллиардов кандидатов в секунду на GPU.
Если вы хотите сделать что-то подобное – например, чтобы обойти максимальную длину bcrypt в 72 символа – используйте соль для каждого текста, перец для всего сайта или настоящее шифрование на этапе MD5.
Этой составной хэш не имеет преимуществ перед простым bcrypt. Он может быть несколько слабее из-за коллизий MD5, но я не думаю, что кто-то сможет фактически использовать это, чтобы сделать атаку быстрее. В любом случае, нет причин передвигать пароли с помощью MD5. Теперь к самому ответу.
Ваш подход #2 не сработает, потому что bcrypt использует интегрированные случайные соли. Хэширование одного и того же ввода дважды даст два разных хэша, потому что будут сгенерированы разные соли.
Результат bcrypt на самом деле является структурой данных, содержащей фактический хэш и соль. Чтобы проверить, является ли пароль правильным, вы должны извлечь оригинальную соль из оригинальной структуры хэша и использовать ее для хэширования проверяемого пароля. Если полученный хэш совпадает с оригиналом, пароль действителен. Эта функция обычно предоставляется реализациями bcrypt.
Если вы собираетесь выполнить словарную атаку, просто предварительно хэшируйте все записи в вашем словаре с помощью MD5, а затем выполните словарную атаку с использованием bcrypt с помощью словаря MD5. Обратное преобразование MD5 для успешно взломанных паролей будет очень простым, и я оставлю это вам, чтобы разобраться.
Обычная атака методом перебора, при которой проверяются все комбинации, непрактична против bcrypt, и MD5 не имеет значения.
Просто используйте hashcat с режимом 25600. Поскольку алгоритм основан на bcrypt – который медленный – вы можете использовать только небольшой словарь, например, самые часто используемые пароли.
Вы можете игнорировать ответ на тему password shucking, поскольку он неверен. Основные предпосылки для
обертывание несоленого хэша с помощью bcrypt демонстративно слабее, чем просто использование bcrypt
являются неверными. Позвольте мне объяснить почему.
Идея: вы взламываете bcrypt(md5($password))
с помощью словаря MD5. Прямое значение MD5 известно или не известно. Заключение: атака быстрее, bcrypt(md5($password))
хуже, чем bcrypt($password)
.
Проблемы с этим утверждением:
-
Скоростное преимущество от не использования MD5 практически отсутствует. Давайте проверим RTX-4090 https://www.onlinehashcrack.com/tools-benchmark-hashcat-nvidia-rtx-4090.php. Сравните режим hashcat для простого bcrypt (3200) и bcryptmd5 (25600). Разница слишком мала, чтобы ее можно было надежно измерить.
bcrypt(md5($password)
даже быстрее в этих – и многих других – бенчмарках (из-за незначительной разницы, на самом деле медленнее).Более подробная информация. Фактор работы Bcrypt 05: ~4 микросекунды (4.16e-6). Фактор работы 05 используется только для бенчмарков. В настоящее время чаще используется 10, что делает bcrypt в 32 раза медленнее: ~133 микросекунды (1.33e-4). RTX-4090 использует около ~7 пикосекунд (6.66e-12) на MD5 (~150G/s). В результате получается ошеломляющее теоретически максимальное преимущество 0.000005% (6.66e-12 / 1.33e-4 x 100%).
Единственное реальное преимущество по скорости можно найти с чрезвычайно быстрыми алгоритмами, где 7 пикосекунд является значительным количеством времени. Если вы используете такой алгоритм (например,
md5(md5($password))
), вы в любом случае пропали. -
Использование словаря MD5 – это бессмыслица или, в лучшем случае, неоптимально, даже если есть преимущество в скорости. Три причины:
-
Источником всех защищенных паролей в большинстве случаев является большее количество, чем источником только MD5-хешированных паролей. Так что если вы взламываете, например, все MD5 и SHA1 целевого пользователя, у вас будет как минимум такой же, а в многих случаях и лучший словарь.
-
Если вам НЕ удается взломать MD5, вся операция по взлому bcrypt(md5($password)) была напрасной тратой времени. Таким образом, не теоретическое улучшение на 0.000005%, а потеря в 100%.
-
Использование случайно большого словаря против bcrypt не сработает, так как bcrypt медленный. Вам нужен маленький и оптимизированный словарь, чтобы иметь хоть какую-то возможность взломать пароль.
-
Ответ или решение
Теория
Вопрос заключается в том, как взломать хэш, который был зашифрован дважды, а именно в формате $What_i_made=BCrypt(MD5(Plain Text Password))
. Для взлома такого хэша нужно понять особенности обеих используемых функций: MD5 и BCrypt. MD5 — это криптографическая хэш-функция, которая быстро вычисляется, но известна своей уязвимостью к коллизиям. BCrypt, с другой стороны, является медленной хэш-функцией, оптимизированной для защиты от атак методом перебора благодаря использованию соли.
Основной недостаток схемы шифрования BCrypt(MD5(Пароль))
заключается в том, что фактически используется быстрая хэш-функция (MD5) внутри медленной (BCrypt). Это может ослабить защиту, так как у атакующего появляется возможность разобраться с внутренним хэшом.
Пример
Рассмотрим пример использования метода "password shucking". Атака начинается с получения MD5-хэшей, даже если они ещё не взломаны. Затем эти хэши используются как словарь, чтобы взломать внешнюю оболочку BCrypt. Если MD5 от конкретного пользователя удалось найти в других утечках, то злоумышленник может атаковать этот MD5 со скоростью в миллиарды вычислений в секунду, используя GPU.
Применение
Чтобы взломать двойной хэш уровня BCrypt(MD5($Пароль))
, вы можете предпринять несколько шагов:
-
Сбор данных утечек:
- Используйте доступные утечки данных для получения MD5-хэшей пользователей.
- Сравнивайте хэши, чтобы узнать, были ли они использованы внутри вашего BCrypt.
-
Использование инструментов:
- Используйте инструменты как MDXfind, которые могут работать с хэшами формата
BCrypt(MD5($pass))
. - Hashcat может быть настроен на использование режима 25600 для таких случаев. Это поможет сократить число попыток за счет предварительных знаний.
- Используйте инструменты как MDXfind, которые могут работать с хэшами формата
-
Создание словаря MD5:
- Создайте словарь из известных MD5-хэшей и попытайтесь найти совпадения с теми, что зашифрованы в вашем BCrypt.
- Необходимо помнить, что сам MD5 может быть легко атакован из-за его уязвимости к коллизиям.
-
Анализ альтернативных методов:
- Исследуйте возможность установки сайта на использование BCrypt напрямую без предварительного MD5, чтобы избежать избыточной активности, которая может ослабить защиту.
Подводя итоги, добавление MD5 к BCrypt не предоставляет заметной дополнительной защиты, а напротив, может стать уязвимостью. Для оптимальной криптографической защиты следует использовать исключительно проверенные методы на базе BCrypt с уникальными и случайными солями.