linux - 使用 hashcat,其中散列的前 10 个字符是已知的

标签 linux bash shell hashcat

我有使用 MySQL 的 Web 应用程序

应用程序使用 MySQL 的密码哈希函数来存储相关帐户的密码

问题是,它会修剪散列密码,使其仅将前 10 个字符存储到密码字段中

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

为了证明这一点,我打算使用 hashcat。我已经下载了相当大的字典文件来帮助我的目的

那么,是否有人可以帮助我在 hashcat 中应该使用的参数如何?

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

谢谢

最佳答案

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

您对系统的描述

你说系统处理密码如下plaintext passwordhashed passwordfirst 10 characters of the hash
示例:Topsecret123*E7C95D33E14D3C2A3AE4EAB25C1D98C88593F7AC*E7C95D33E
请注意 MySQL's PASSWORD() prefixes hashes with a * ,所以你实际上只包含哈希中的 9 个字符。

在后台回答问题

您询问了如何使用 hashcat 从上面的方法中查找哈希冲突,但您真正想知道/显示的是

prove trimming hashed password can make different password [...] accepted by the application.



您的重点是 » 修剪 导致接受多个密码«。但是,您忽略了即使未修剪的散列也会导致接受多个密码。

鸽巢原理

解释很简单,你不必找到哈希冲突。大家应该明白以下几点:
  • 有无限数量的密码。
  • MySQL 密码哈希有一个固定的长度,正好是 64 位。只能有 264 个不同的哈希值。
  • 密码散列函数将密码映射到散列。由于密码多于散列,因此必须将某些密码映射到相同的散列。
    如果没有,您将找到一个压缩功能,它允许您仅以 64 位存储任何内容。

  • 有人可能会争辩说,有效密码的数量不是无限的。但是,即使您将有效密码的长度限制为 11 并且仅包含来自组 [A-Za-z0-9] 的符号(有 62 个符号)会有 6211 个唯一密码:

    6211 ≈ 5,2×1019 个密码
    264 ≈ 1,8×1019 哈希

    因此,仍然必须有很多碰撞。

    哈希冲突

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

    寻找碰撞

    使用哈希猫

    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 个哈希,因为有 169 个修剪过的哈希,我们可以期望在 √(169) = 262'144 次尝试中找到冲突(参见 birthday problem)。

    要查找具有相同哈希的密码,请运行以下脚本:
    ./collide.py | sort -k2 | uniq -Df1
    

    脚本仅用了两秒钟就完成并打印了
    23607    47ae310ff
    251848   47ae310ff
    

    你有它,两个密码( 23607251848 )具有相同的修剪哈希( 47ae310ff )。

    如果您修剪的哈希实际上包含 10 个十六进制数字,您可以调整脚本并找到两个密码 18745472873667共享哈希 47fc464b2f .

    关于linux - 使用 hashcat,其中散列的前 10 个字符是已知的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55739914/

    相关文章:

    shell - awk 相当于 cut -f2-

    php - 如何在php代码中执行linux命令

    shell - 为 shell 脚本构建 debian 包

    node.js - 无法在 Linux 上安装 @angular/cli

    excel - 将粘贴制表符分隔的结果复制到 excel 文件中

    bash - 'ls' 参数是否有既定顺序?

    node.js - 如何使用 Promisified Node exec 将文本通过管道传输到命令中

    regex - 当一个字符不是文件名中的前 8 个字符之一时,如何使用 prename 查找和替换该字符?

    php - 从 php 文件执行 Powershell 脚本

    c - Open SSL 在大文本上的性能