在已知哈希的前10个字符的地方使用hashcat

时间:2019-04-18 05:59:55

标签: linux bash shell hashcat

我有使用MySQL的Web应用程序

应用程序使用MySQL的密码哈希功能存储相关帐户的密码

问题是,它会修剪哈希密码,以便仅将前10个字符存储在密码字段中

我想向我的主管证明,修整哈希密码可以使不同的密码在登录表单中输入并被应用程序接受。因为这些密码的前10个字符相同

为了证明这一点,我打算使用hashcat。我已经下载了很大的词典文件来帮助我实现目标

那么,有没有人可以帮助我在hashcat中应该使用的参数呢?

我试图用谷歌搜索答案,但是没有运气

谢谢

1 个答案:

答案 0 :(得分:1)

有关实际问题的答案,请跳至该答案的最后一部分。其他部分不会直接回答您的问题,但是您在阅读它们后可能会发现不再需要此问题。


您对系统的描述

您说系统按如下方式处理密码
plaintext passwordhashed passwordfirst 10 characters of the hash

示例:
Topsecret123*E7C95D33E14D3C2A3AE4EAB25C1D98C88593F7AC*E7C95D33E

请注意MySQL's PASSWORD() prefixes hashes with a *,因此您实际上仅包含哈希中的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 哈希

因此,仍然必须有很多冲突。

哈希冲突

修整散列不是冲突问题的根本原因,但是当然,它大大增加了发生冲突的可能性。通常,哈希冲突不是问题,因为它们很少发生,以至于您不会遇到它们。但是,在像您这样经过严格修剪的哈希中,碰撞成为一个真正的问题。


发现碰撞

使用Hashcat

hashcat可以使用-m 300计算MySQL密码哈希。您可以通过computing SELECT Password("hashcat");并将其与显示为here的哈希进行比较来确认。

但是,我找不到修整这些哈希值/查找前缀冲突的方法。我猜 hashcat不能做你想要的。您将必须为hashcat实现自定义的hashmode。最简单的方法是更改​​current implementation of hashcat's MySQL mode。我不确定,但是将const int out_len = 40;更改为9也许就足够了。您可能还必须更新同一模块的OpenCL版本。搜索m00300 here

使用自定义脚本

或者,查找密码哈希对列表或自己生成一个,然后在该表中查找前缀冲突。这很有趣,所以我自己做了

以下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中找到冲突尝试(请参见birthday problem)。

要查找具有相同哈希值的密码,请按以下方式运行脚本:

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

仅两秒钟,脚本完成并打印

23607    47ae310ff
251848   47ae310ff

在那里,您将得到两个密码(23607251848),它们具有相同的修剪散列(47ae310ff)。

如果修剪后的哈希实际上包含10个十六进制数字,则可以修改脚本并找到共享哈希值1874547的两个密码287366747fc464b2f