web-dev-qa-db-ja.com

hashcatを使用して、特定のサフィックスを持つSHA-256ハッシュを見つけるにはどうすればよいですか?

最近、X-MAS 2019 CTFに参加しました。課題の多くには、サーバーに対するサービス拒否(DoS)攻撃を回避するための作業証明(PoW)チェックが含まれていました。最も一般的なのは、6文字のサフィックスが与えられ、ハッシュがそのサフィックスで終わっているものを見つけるように求められたものです。

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

サフィックスabcdefは、サーバーに接続するたびに変更されます。正しい応答の例:

hash = e38450c7008711d86a4d6c2039c8633a1ed637281b96888d7d9ff257aaabcdef
x = 4cbab1bbb03b4a10aef586b6

これはhashcatを使用して実行できますか?

5
Kristopher Ives

ニーズに合わせてソースコードを変更する準備ができていない限り、hashcatを使用してこれを行うことはできません。

たとえば、 s3inlcのfork を適応させることができます。これにより、特定のプロパティ(可能な限り多くの0で開始/終了するなど)のハッシュをチェックするオプションが追加されました。

5
Benoit Esnard

他の誰かが私を訂正するかもしれませんが、力ずくで(それはもちろん、要点です)以外にそのクエリに答える方法はないと思います。強力なハッシュアルゴリズムは、入力の小さな変更でもランダムな出力を効果的に返すため、意図したとおりの操作を実行できないように特別に設計されています。特定のサフィックスでハッシュされた入力を推測できた場合、SHA256が依然として安全である衝突攻撃への途上にあることになります。しかし、彼らの作業証明システムが何であるかを知っている場合は、その単純な事実を利用できます。

これは私がすることです:

  1. 1000万から2,000万の数値のSHA256ハッシュを計算します(ただし、私のコンピューターの多くは妥当な時間内に計算できます)。
  2. たとえば、最初の1,600万個の数値のSHA256ハッシュを計算した場合、およそ500万個の一意の6文字のサフィックスが得られると期待します(ここでは大まかに推測しています)。
  3. つまり、ランダムな6文字のサフィックスにハッシュする文字列を要求された場合、最大500万の一意の6文字のサフィックスを持つリストには、回答が含まれる可能性が30%あります。
  4. ルックアップは事実上瞬時に行われるため、それ以上の労力をかけることなく、時間の30%でチャレンジに答えることができます。
  5. したがって、私のDoSはその有効性の一部を失っていますが、それでも私は乗り越えることができます!

高速なCPUを使用していて、ハッシュをすばやく計算できる場合は、一意のシフィックスのプールを増やすことを試みることができます(つまり、より多くの数値をハッシュします)。実際には問題ではないことに注意してくださいwhatハッシュ-ハッシュする固有のものの数のみ。それぞれが新しいハッシュと、場合によっては新しい固有のサフィックスを提供するためです。

ここで重要なのは、ランダムな6文字のサフィックスを照合しようとすると、平均で約32,000,000回の試行が行われることです。ただし、これらの試行のランダムなサフィックスを格納してルックアップテーブルを作成するだけの場合は、データベースを作成して、ハッシュ計算を行わなくても十分な成功率が得られる可能性があります。

このようなものがどれほど成功するかは、問題の詳細に大きく依存しますが、おそらくそれが最善の策です。参考までに、「標準」GPUでのSHA256のハッシュレートは通常、1 Mhash/sから1000 Mhash/sの間です。これは、ローエンドのGPU(1 Mhash/s)でも、数分で100,000,000の一意の入力をハッシュできることを意味します。頭上から推定すると、1億回のハッシュで、おそらく75%のチャレンジでルックアップテーブルにヒットする可能性があると思います。

3
Conor Mancone

価値のあるものとして、ここに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

2
mti2935