Использование hashcat, где известны первые 10 символов хеша - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть веб-приложение, которое использует MySQL

Приложение использует хэш-функцию пароля от MySQL для хранения пароля для связанной учетной записи

Проблема в том, что он урезал хешированный пароль, чтобы в поле пароля сохранялись только первые 10 символов

Я хочу доказать своему руководителю, что хешированный пароль может привести к тому, что пароль будет введен в форму входа и принят приложением. Поскольку эти пароли имеют первые 10 символов

Чтобы доказать это, я планирую использовать hashcat. Я скачал довольно большой файл словаря, чтобы помочь моей цели

Итак, кто-нибудь может мне помочь, как параметр, который я должен использовать в hashcat?

Я пытался найти ответ в Google, но безуспешно

Спасибо

1 Ответ

1 голос
/ 18 апреля 2019

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


Ваше описание системы

Вы сказали, что система обрабатывает пароль следующим образом
plaintext passwordhashed passwordfirst 10 characters of the hash

Пример:
Topsecret123*E7C95D33E14D3C2A3AE4EAB25C1D98C88593F7AC*E7C95D33E

Обратите внимание, что префиксы PASSWORD() MySQL хешируются с *, так что вы фактически включаете только 9 символов из хеша.


Ответ на вопрос в фоновом режиме

Вы спрашивали, как найти коллизии хеша для подхода сверху, используя hashcat, но то, что вы на самом деле хотели узнать / показать, было

доказать, что хеширование пароля может сделать [...] другой пароль принятым приложением.

Ваш акцент был сделан на » Тримминг вызывает принятие нескольких паролей«. Однако вы упустили из виду, что даже хеширование без ограничений приводит к принятию нескольких паролей.

Принцип голубиных отверстий

Объяснение настолько простое, что вам не нужно находить хеш-столкновение. Каждый должен понимать следующее:

  • Существует бесконечное количество паролей.
  • Хеши паролей MySQL имеют фиксированную длину, ровно 64 бита. Может быть только 2 64 разных хешей.
  • Функция хэширования паролей отображает пароли на хэши. Поскольку паролей больше, чем хэшей, некоторые пароли должны быть сопоставлены с одним и тем же хешем.
    Если нет, вы бы нашли функцию сжатия, которая позволяла бы хранить что угодно только в 64 битах.

Можно утверждать, что количество действительных паролей не бесконечно. Но даже если бы вы допустили, чтобы действительные пароли были точно длиной 11 и содержали только символы из группы [A-Za-z0-9] (имеет 62 символа), было бы 62 11 уникальных паролей:

62 11 ≈ 5,2 × 10 19 пароли
2 64 ≈ 1,8 × 10 19 хэши

Следовательно, все еще должно быть много столкновений.

Hash Collisions

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


В поисках столкновения

Использование Hashcat

hashcat может вычислять хэши паролей MySQL с -m 300. Вы можете подтвердить это путем вычисления SELECT Password("hashcat"); и сравнения полученного хеша с показанным здесь хешем .

Однако я не мог найти способ обрезать эти хэши / искать префиксные коллизии. Я думаю, hashcat не может делать то, что вы хотите . Вы должны будете реализовать пользовательский хеш-режим для hashcat. Самый простой способ сделать это - изменить текущую реализацию режима MySQL в hashcat . Я не уверен, но может быть достаточно просто изменить const int out_len = 40; на 9. Возможно, вам придется обновить версии OpenCL того же модуля. Искать m00300 здесь .

Использование собственного сценария

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

Следующая программа на Python генерирует усеченные хэши для некоторых числовых паролей:

#! /usr/bin/python3
import hashlib as hl

def mySqlPwHash(password):
        return hl.sha1(hl.sha1(password.encode()).digest()).hexdigest()[:9]

for number in range(0, 300000):
        password = str(number)
        print(password, "\t", mySqlPwHash(password))

Я решил сгенерировать 300'000 хэшей, потому что есть 16 9 усеченных хэшей, и мы можем ожидать столкновения в √ (16 9 ) = 262'144 попытки ( см. день рождения проблема ).

Чтобы найти пароли с таким же хешем, запустите скрипт следующим образом:

./collide.py | sort -k2 | uniq -Df1

Только в двухсекунд сценарий закончен и напечатан

23607    47ae310ff
251848   47ae310ff

И вот он у вас, два пароля (23607 и 251848) с одинаковым урезанным хешем (47ae310ff).

Если ваши урезанные хэши на самом деле содержат 10 шестнадцатеричных цифр, вы можете адаптировать скрипт и найти два пароля 1874547 и 2873667, разделяющих хэш 47fc464b2f.

...