最近、X-MAS 2019 CTFに参加しました。課題の多くには、サーバーに対するサービス拒否(DoS)攻撃を回避するための作業証明(PoW)チェックが含まれていました。最も一般的なのは、6文字のサフィックスが与えられ、ハッシュがそのサフィックスで終わっているものを見つけるように求められたものです。
Provide a hex string X such that sha256(X)[-6:] = abcdef
サフィックスabcdef
は、サーバーに接続するたびに変更されます。正しい応答の例:
hash = e38450c7008711d86a4d6c2039c8633a1ed637281b96888d7d9ff257aaabcdef
x = 4cbab1bbb03b4a10aef586b6
これはhashcat
を使用して実行できますか?
ニーズに合わせてソースコードを変更する準備ができていない限り、hashcatを使用してこれを行うことはできません。
たとえば、 s3inlcのfork を適応させることができます。これにより、特定のプロパティ(可能な限り多くの0で開始/終了するなど)のハッシュをチェックするオプションが追加されました。
他の誰かが私を訂正するかもしれませんが、力ずくで(それはもちろん、要点です)以外にそのクエリに答える方法はないと思います。強力なハッシュアルゴリズムは、入力の小さな変更でもランダムな出力を効果的に返すため、意図したとおりの操作を実行できないように特別に設計されています。特定のサフィックスでハッシュされた入力を推測できた場合、SHA256が依然として安全である衝突攻撃への途上にあることになります。しかし、彼らの作業証明システムが何であるかを知っている場合は、その単純な事実を利用できます。
これは私がすることです:
高速なCPUを使用していて、ハッシュをすばやく計算できる場合は、一意のシフィックスのプールを増やすことを試みることができます(つまり、より多くの数値をハッシュします)。実際には問題ではないことに注意してくださいwhatハッシュ-ハッシュする固有のものの数のみ。それぞれが新しいハッシュと、場合によっては新しい固有のサフィックスを提供するためです。
ここで重要なのは、ランダムな6文字のサフィックスを照合しようとすると、平均で約32,000,000回の試行が行われることです。ただし、これらの試行のランダムなサフィックスを格納してルックアップテーブルを作成するだけの場合は、データベースを作成して、ハッシュ計算を行わなくても十分な成功率が得られる可能性があります。
このようなものがどれほど成功するかは、問題の詳細に大きく依存しますが、おそらくそれが最善の策です。参考までに、「標準」GPUでのSHA256のハッシュレートは通常、1 Mhash/sから1000 Mhash/sの間です。これは、ローエンドのGPU(1 Mhash/s)でも、数分で100,000,000の一意の入力をハッシュできることを意味します。頭上から推定すると、1億回のハッシュで、おそらく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