如何使用 hashcat 找到具有给定后缀的 SHA-256 哈希?

信息安全 密码学 sha256 哈希猫
2021-08-27 12:34:15

最近,我们参加了 X-MAS 2019 CTF,其中许多挑战包括工作证明 (PoW) 检查,以避免针对其服务器的拒绝服务 (DoS) 攻击。最常见的是我们被赋予了一个 6 个字符的后缀,并被要求查找哈希以该后缀结尾的任何内容:

Provide a hex string X such that sha256(X)[-6:] = abcdef

abcdef每次连接到服务器时,后缀都会改变。正确响应的示例:

hash = e38450c7008711d86a4d6c2039c8633a1ed637281b96888d7d9ff257aaabcdef
x = 4cbab1bbb03b4a10aef586b6

这可以使用hashcat吗?

3个回答

使用 hashcat 是不可能的,除非您准备好更改源代码以满足您的需要。

例如,您可以调整s3inlc 的 fork,它添加了一个选项来检查具有某些特定属性的哈希(以尽可能多的 0 开始/结束等)。

其他人可能会纠正我,但我不相信有任何方法可以回答这个问题,除非通过蛮力(这当然是重点)。强大的散列算法即使输入中的微小变化也会有效地返回随机输出,因此它们是专门设计的,因此您无法完全按照您正在尝试做的事情。如果您能够猜出带有某个后缀的散列输入,那么您将有效地进行碰撞攻击,而 SHA256 仍然是安全的。但是,如果您知道他们的工作量证明系统是什么,那么您可以利用这个简单的事实。

这就是我要做的:

  1. 我会计算 10-20 百万个数字的 SHA256 哈希(但是我的计算机可以在合理的时间内计算出多少)。
  2. 例如,如果我计算了前 1600 万个数字的 SHA256 哈希值,我希望这会给我大约 500 万个唯一的 6 个字符后缀(我在这里疯狂猜测)
  3. 这意味着,如果被要求提供一个散列到随机 6 个字符后缀的字符串,那么我的包含约 500 万个唯一 6 个字符后缀的列表有 30% 的机会包含答案。
  4. 由于查找实际上是即时的,这意味着我可以在 30% 的时间内毫不费力地回答挑战。
  5. 因此,虽然我的 DoS 失去了一些效力,但我仍然可以通过!

如果你有一个快速的 CPU 并且可以快速计算散列,那么你可以尝试增加你的唯一后缀池(即散列更多的数字)。请注意,它实际上并不重要是什么,你的哈希-唯一的独特的东西,你的哈希数,因为每个人都会给你一个新的哈希和潜在的,新的唯一后缀。

这里的关键是,尝试匹配一个随机的 6 个字符后缀平均会花费您大约 32,000,000 次尝试。但是,如果您只是存储这些尝试的随机后缀并构建一个查找表,您最终可能会得到一个数据库,该数据库可以为您提供足够好的成功率,而无需进行进一步的散列计算。

这种事情的成功程度很大程度上取决于问题的具体情况,但这可能是你最好的选择。作为参考,“标准”GPU 上的 SHA256 哈希率通常介于 1 Mhash/s 和 1000 Mhash/s 之间。这意味着,如果您甚至有一个低端 GPU(1 Mhash/s),您可以在短短几分钟内散列 100,000,000 个唯一输入。根据我的估计,我预计使用 100,000,000 个哈希值,您可能会在查找表中找到大约 75% 的挑战。

对于它的价值,这里有一个 Python 中的简短脚本,它将执行此 POW:

import hashlib
import random

h=None
while(h is None or h[-6:]!='abcdef'):
    p=random.randrange(1, 0xffffffffffffffffffffffff)
    h=hashlib.sha256(p.to_bytes(12, 'big')).hexdigest()

print('SHA256(' + hex(p) + ')=' + h)

在我的(体面的,相当新的)笔记本电脑上运行大约需要 15 秒,并产生:

SHA256(0xea04518919c6caf94ee194e0)=51e6239c174b2cb27f40a06ebfd6e3ab2caab5a36769bfc64d26b1cbbcabcdef

验证:

import hashlib

p=0xea04518919c6caf94ee194e0
h=hashlib.sha256(p.to_bytes(12, 'big')).hexdigest()
print('SHA256(' + hex(p) + ')=' + h)

生产

SHA256(0xea04518919c6caf94ee194e0)=51e6239c174b2cb27f40a06ebfd6e3ab2caab5a36769bfc64d26b1cbbcabcdef

同样对于 p=0x4cbab1bbb03b4a10aef586b6