【picoCTF】hashcrack - 辞書攻撃でMD5ハッシュから平文パスワードを特定

問題概要

picoCTFの「hashcrack」という問題の解説記事です。

  • カテゴリ: Cryptography
  • 難易度: Easy

問題文

picoCTF hashcrack

解説

ステップ1: picoCTFのサーバーに接続

まず、問題文に記載されているサーバーに接続します。ncコマンドを使用して、指定されたホストとポートに接続します。
nc verbal-sleep.picoctf.net xxxxx
Welcome!! Looking For the Secret?

We have identified a hash: 482c811da5d5b4bc6d497ffa98491e38
Enter the password for identified hash:

※ポート番号は問題文に記載されているものを使用してください。


接続すると、ハッシュ値 482c811da5d5b4bc6d497ffa98491e38 が表示されます。
ハッシュ値は、サーバー側が特定のパスワードをハッシュ化したものであり、この問題では、ハッシュ値をもとに元のパスワードを特定することが求められます。
続いて表示される Enter the password for identified hash: は、 ユーザーに対して このハッシュ値に対応するパスワードを入力するよう求めている ことを意味します。

ステップ2: ハッシュ値のアルゴリズムを特定

表示されたハッシュ値 482c811da5d5b4bc6d497ffa98491e38 の特徴からアルゴリズムを特定します。
以下の特徴から、このハッシュ値は MD5 アルゴリズムで生成されたものであると判断できます。
  • ハッシュ値の長さが32文字であること
  • 使用される文字が16進数(0-9, a-f)であること


ステップ3: hashcatを使ったハッシュ解析

hashcat を使用してハッシュ値を解析し、元のパスワードを特定します。

まず、解析対象のハッシュ値を hash.txt というファイルに保存します。
$ echo "482c811da5d5b4bc6d497ffa98491e38" > hash.txt

次に、使用するワードリストを選定します。 今回は「weakly hashed passwords」と問題文に記述されていることから、弱いパスワードが使われていると推測できます。 そのため、弱いパスワードが多数含まれる有名なワードリスト rockyou.txtを使用します。
$ hashcat -m 0 -a 0 hash.txt /usr/share/wordlists/rockyou.txt
  • -m 0 はMD5ハッシュを指定するオプションです。
  • -a 0 は辞書攻撃モードを指定するオプションです。

出力の一部に以下のような行が含まれていて、解析が成功したことがわかります。

482c811da5d5b4bc6d497ffa98491e38:password123
この場合、ハッシュ値 482c811da5d5b4bc6d497ffa98491e38 に対応するパスワードは password123であることがわかります。


※Kali Linuxなどのペネトレーションテスト用ディストリビューションには、rockyou.txt が標準で含まれていますが、その他の環境では別途ダウンロードが必要です。

以下を参考にrockyou.txtを入手してください。
wget https://github.com/brannondorsey/naive-hashcat/releases/download/data/rockyou.txt

ステップ4: サーバーにパスワードを送信

特定したパスワード password123 をサーバーに送信します。
Enter the password for identified hash: password123    
Correct! You've cracked the MD5 hash with no secret found!

Flag is yet to be revealed!! Crack this hash: b7a875fc1ea228b9061041b7cec4bd3c52ab3ce3
Enter the password for the identified hash: 
サーバーから新たなハッシュ値 b7a875fc1ea228b9061041b7cec4bd3c52ab3ce3 が提示されます。
同様に、このハッシュ値に対応するパスワードを特定します。

ステップ5: 2つ目のハッシュ値のアルゴリズムを特定

表示されたハッシュ値 b7a875fc1ea228b9061041b7cec4bd3c52ab3ce3 の特徴からアルゴリズムを特定します。
以下の特徴から、このハッシュ値は SHA-1 アルゴリズムで生成されたものであると判断できます。
  • ハッシュ値の長さが40文字であること
  • 使用される文字が16進数(0-9, a-f)であること


ステップ6: 2つ目のハッシュ値の解析

同様に、2つ目のハッシュ値 b7a875fc1ea228b9061041b7cec4bd3c52ab3ce3hash2.txt に保存します。
$ echo "b7a875fc1ea228b9061041b7cec4bd3c52ab3ce3" > hash2.txt

次に、hashcat を使用して解析します。
$ hashcat -m 100 -a 0 hash2.txt /usr/share/wordlists/rockyou.txt
  • -m 100 はSHA-1ハッシュを指定するオプションです。

出力の一部に以下のような行が含まれていて、解析が成功したことがわかります。

b7a875fc1ea228b9061041b7cec4bd3c52ab3ce3:letmein
この場合、ハッシュ値 b7a875fc1ea228b9061041b7cec4bd3c52ab3ce3 に対応するパスワードは letmein であることがわかります。

ステップ7: サーバーにパスワードを送信2

特定したパスワード letmein をサーバーに送信します。
Flag is yet to be revealed!! Crack this hash: b7a875fc1ea228b9061041b7cec4bd3c52ab3ce3
Enter the password for the identified hash: letmein
Correct! You've cracked the SHA-1 hash with no secret found!

Almost there!! Crack this hash: 916e8c4f79b25028c9e467f1eb8eee6d6bbdff965f9928310ad30a8d88697745
Enter the password for the identified hash:
な、なんだと…!? まだフラグは出てこないのか…!?
サーバーから新たなハッシュ値 916e8c4f79b25028c9e467f1eb8eee6d6bbdff965f9928310ad30a8d88697745 が提示されます。 同様に、このハッシュ値に対応するパスワードを特定します。

ステップ8: 3つ目のハッシュ値のアルゴリズムを特定

表示されたハッシュ値 916e8c4f79b25028c9e467f1eb8eee6d6bbdff965f9928310ad30a8d88697745 の特徴からアルゴリズムを特定します。 以下の特徴から、このハッシュ値は SHA-256 アルゴリズムで生成されたものであると判断できます。
  • ハッシュ値の長さが64文字であること
  • 使用される文字が16進数(0-9, a-f)であること


ステップ9: 3つ目のハッシュ値の解析

同様に、3つ目のハッシュ値 916e8c4f79b25028c9e467f1eb8eee6d6bbdff965f9928310ad30a8d88697745hash3.txt に保存 します。
$ echo "916e8c4f79b25028c9e467f1eb8eee6d6bbdff965f9928310ad30a8d88697745" > hash3.txt

次に、hashcat を使用して解析します。
$ hashcat -m 1400 -a 0 hash3.txt /usr/share/wordlists/rockyou.txt
  • -m 1400 はSHA-256ハッシュを指定するオプションです。

出力の一部に以下のような行が含まれていて、解析が成功したことがわかります。

916e8c4f79b25028c9e467f1eb8eee6d6bbdff965f9928310ad30a8d88697745:qwerty098
この場合、ハッシュ値 916e8c4f79b25028c9e467f1eb8eee6d6bbdff965f9928310ad30a8d88697745 に対応するパスワードは qwerty098 であることがわかります。

ステップ10: サーバーにパスワードを送信3

特定したパスワード qwerty098 をサーバーに送信します。

頼む、今度こそフラグを出してくれ…!

Enter the password for the identified hash: qwerty098
Correct! You've cracked the SHA-256 hash with a secret found. 
The flag is: picoCTF{xxxxx}
※フラグはマスクしています。
ついにフラグが表示されました!

使用したコマンドの簡単な解説

hashcat

hashcat -m [ハッシュタイプ] -a [攻撃モード] [ハッシュファイル] [ワードリスト]
ハッシュを解析するためのコマンドです。
各オプションの意味は以下の通りです。
  • -m [ハッシュタイプ]: ハッシュアルゴリズムを指定します。
    例: 0 (MD5), 100 (SHA-1), 1400 (SHA-256)
  • -a [攻撃モード]: 攻撃モードを指定します。
    例: 0 (辞書攻撃)
  • [ハッシュファイル]: 解析対象のハッシュ値が保存されたファイルを指定します。
  • [ワードリスト]: 使用するワードリストファイルを指定します。

まとめ

picoCTFの「hashcrack」問題では、提示されたハッシュ値に対応するパスワードを特定することが求められました。
hashcat を使用して、MD5、SHA-1、SHA-256の各ハッシュ値を解析し、最終的にフラグを取得することができました。
▼ポイントは以下の通りです。
  • ハッシュ値の特徴からアルゴリズムを特定すること
  • hashcat を使用して効率的にハッシュ値を解析すること

閲覧ありがとうございました!

NEXT
次におすすめ

【picoCTF】EVEN RSA CAN BE BROKEN??? - 偶数Nの性質を突いてRSA暗号を復号

カテゴリ: Cryptography難易度: Easy#picoCTF
次の記事へ →
同じカテゴリ/難易度/picoCTFでの表示順が近い記事を優先しておすすめしています。