俺的 Capture The Flag Writeup

Capture The Flag に挑戦したときの記録を自分用にドキュメント化して置いておくだけのブログ。

[CpawCTF] 第八夜: 簡単な Hash を戻す

Q12.[Crypto]HashHashHash!

以下、問題文

Q12.[Crypto]HashHashHash!

10pt

ハッシュ関数とは、値を入れたら絶対にもとに戻せないハッシュ値と呼ばれる値が返ってくる関数です。

ですが、レインボーテーブルなどでいくつかのハッシュ関数は元に戻せてしまう時代になってしまいました。

以下のSHA1というハッシュ関数で作られたハッシュ値を元に戻してみてください!(ヒント:googleで検索)

e4c6bced9edff99746401bd077afa92860f83de3

フラグは

cpaw{ハッシュを戻した値}

です。

答案

今回は hash値 を元に戻そう、という問題らしいです。

ところで hash値 もとい、これを作る hash関数 は簡単にいうと、 「入力に対して、一対一で対応する返事をする関数で、逆演算が『大変な』もの」 という関数になります。

逆演算とは「一旦 hash関数 にかけて暗号化したものを元の入力に戻す」ということです。(だいたい)

用途としては、 返事が入力と一対一で対応しているので (ここが割と大事) 、入力すべきものを何かしら隠したい、などという場合に使われます。

例えば、パスワードを平文のまま使ったり、保存したりすると危ないので、 hash関数 にかけたものを保存しておいたりする、という、いわゆる「暗号化」の一種として使われます。

前にやった問題いくつかの、「古典的」ではない方の暗号...

コンピュータの長く短い歴史の中で、 暗号は「解くのに時間や労力がかかる難しいもの」であること (数年計算しないと元に戻せない、など) を前提に作られ、 コンピュータの性能が上がったり、頭がめちゃくちゃ良い人が解析する方法を見つけてしまったりして、 より難しいものを採択し、アルゴリズムをアップデートしていく...

という、いわば「いたちごっこ」の上で進んできました。

なので、今のコンピュータの性能や、今までに培われてきた理論や技術を用いれば 昔の暗号の一部分は解くことができてしまいます。

今回も、簡単な hash関数 にかけられた値であるようなので、 今までに培われたなんらかの方法で元に戻す手段があるのでしょう。

検索していきます。

キーワードは、今回使われている hash関数 (hash値 を作る方法) がsha1 である、ということです。(問題文より)

  • sha1 戻す [検索]
  • sha1 解析 [検索]

などで探していきます。

方法

簡単な hash値 を元に戻す、というWebサービスがあるみたいです。怖いですね。

具体的な方法は、書いてあったり、書いてなかったり、参考サイトに書いてあるものをそのまま引用すれば

簡単な hash関数 に対して、考えられる入力と、その出力をたくさん DB に登録しておいて、 出力側で一致すれば、入力が DB の関連により求められる。

ということらしいです。

一体いくつ登録されているのでしょう...

また、上記のような総当たり形式ではなくとも、 もしかしたら裏側で解析のための何かしらのアルゴリズムが動いている、などという可能性もあるかと考えられます。

とりあえず、今回は参考に上がっておりました Hash Toolkit というサイトを使わせていただきます。

サイトに載っている説明をみると

What is Hash Toolkit?

Decrypt password hashes super fast with Hash Toolkit. You can decode hashes into the original text. You also can generate hashes using different algorithms. Hashes are used for many applications like security, authentication and passwords.

hash関数により作られたパスワードをめっちゃ早くデクリプト (解析する, 元に戻す, みたいな意味) できるよ。 ハッシュを戻すこともできるし、もちろん hash値 を geneることもできるよ。」だそうです。

Is it possible to decode a hash?

Hash functions are built in a way that it's very easy to generate a hash / fingerprint for a text, but almost impossible to decode the hash back to the original text.

hash値を元に戻すことなんて、できるの?」という項目がありますが、これに対し

hash関数 は超簡単に hash値 を作ることができるように設計されているが、だいたいに於いて、逆演算して元のオリジナルなテキストを得るのは難しいです (´・ω・`)」と、なんだか曖昧なことが書かれていますね。

きっと、「いくつか戻せるものもあって、そういったものは戻せる」(小泉進○郎構文??) ということなのでしょう。

いつも通り、前置きが長くなってきたところで、早速 Flag をゲットしに行こうと思います。

ページの中間くらいに、hash を生成するアルゴリズムが選べるので、問題文にある通り sha1 を選択します。

f:id:comeonknowhow:20200524190502p:plain
sha1

ちょっと見辛いですが、写真左上にあります。

実際のページでは、真ん中にあります... (スクショ撮ってしまうと、実際のページとずれるので、ご容赦ください)

ページ上部に、「ここに hash値 を入れてください」と言わんばかりの入力窓があるので、 問題文から hash値 をコピってここに入力し、虫眼鏡マークをクリックします。

f:id:comeonknowhow:20200524190729p:plain
decrypt

すぐにデクリプトした、オリジナルな値が帰ってきました。

f:id:comeonknowhow:20200524190812p:plain
original text

Shal だそうです。

思ったより短いですが、問題文に従い cpaw{Shal}Flag を提出してみます。

submit

f:id:comeonknowhow:20200524190910p:plain
submit

一度、cpaw{shal}s の大文字小文字を間違えて提出してしまったので、invalid answer を食らってしまいました... みなさまもお気をつけください...

f:id:comeonknowhow:20200524191029p:plain
accepted

無事、受理していただけました。

今回は何かプログラムを書いた訳でもないですし、 自分で何かを使って解析した訳でもなく、 web サービスを使わせていただいただけなので... 「やった感」が小さいですが、クリアはクリアなので、この辺で失礼します。

次回はソートの問題らしいです。