はじめに
この実験では、強力なオープンソースのパスワードクラッキングツールである John the Ripper を使用して SHA1 ハッシュをクラックするプロセスを探求します。ハッシュがどのようにクラックされるかを理解することは、パスワードセキュリティの脆弱性を理解し、より強力なセキュリティ対策を実装するために不可欠です。平文パスワードから SHA1 ハッシュを生成し、これらのハッシュを John the Ripper 用に準備し、その後ツールを使用して元のパスワードを回復する方法を学びます。この実践的な経験は、ハッシュアルゴリズムの効果と、強力でユニークなパスワードの重要性についての洞察を提供します。
パスワードから SHA1 ハッシュを生成する
このステップでは、いくつかのサンプルパスワードから SHA1 ハッシュを生成します。SHA1(Secure Hash Algorithm 1)は、入力を受け取り、160 ビット(20 バイト)のハッシュ値を生成する暗号学的ハッシュ関数であり、通常は 40 桁の 16 進数で表示されます。SHA1 は、特定のアプリケーションにおいては脆弱性により暗号学的に破られていると考えられていますが、ハッシュクラッキングの原則を実証するためには依然として有用です。
まず、いくつかの簡単なパスワードを含む passwords.txt という名前のファイルを作成しましょう。
echo -e "password123\nlabexuser\nsecretpass" > passwords.txt
次に、sha1sum コマンドを使用して、passwords.txt ファイル内の各パスワードの SHA1 ハッシュを生成します。-t オプションは sha1sum にテキストモードで読み取るように指示し、-b オプションはバイナリモードで読み取るように指示します。xargs を使用して、ファイルの各行を sha1sum の引数として渡します。
cat passwords.txt | xargs -I {} sh -c 'echo -n "{}" | sha1sum' > hashes.txt
このコマンドは、passwords.txt から各パスワードを読み込み、それを sha1sum にパイプします(echo -n を使用して、ハッシュを変更する改行文字の追加を防ぎます)。その後、出力(ハッシュと元のパスワード)を hashes.txt という新しいファイルにリダイレクトします。
hashes.txt の内容を表示してみましょう。
cat hashes.txt
以下のような出力が表示されるはずです。各行には SHA1 ハッシュと元のパスワードが含まれています。
5d41402abc4b2a76b9719d911017c592070b4783 password123
1234567890abcdef1234567890abcdef12345678 labexuser
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 secretpass
注意: 2 番目の列(元のパスワード)は、デフォルトで sha1sum によって含まれています。クラッキングのためには、John the Ripper は通常ハッシュ自体のみを必要とします。次のステップでファイルを John 用に準備します。
SHA1 用ハッシュファイルの準備
このステップでは、hashes.txt ファイルを、John the Ripper がクラッキングのために期待する形式である、SHA1 ハッシュのみを含むように準備します。現在の hashes.txt ファイルにはハッシュと元のパスワードの両方が含まれており、これは John への入力としては理想的ではありません。
hashes.txt からハッシュ値のみを抽出し、sha1_hashes_for_john.txt という新しいファイルに保存します。awk コマンドを使用すると、ファイルの特定の列を簡単に選択できるため、これを実現できます。
awk '{print $1}' hashes.txt > sha1_hashes_for_john.txt
このコマンドは、hashes.txt の各行の最初のフィールド($1)を出力し、その出力を sha1_hashes_for_john.txt にリダイレクトするように awk に指示します。
それでは、新しいファイルの内容を確認して、ハッシュのみが含まれていることを確認しましょう。
cat sha1_hashes_for_john.txt
以下のような出力が表示されるはずです。SHA1 ハッシュのみがリストされています。
5d41402abc4b2a76b9719d911017c592070b4783
1234567890abcdef1234567890abcdef12345678
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
このファイルは、John the Ripper の入力として使用する準備ができました。
John the Ripper で SHA1 ハッシュをクラックする
このステップでは、John the Ripper を使用して sha1_hashes_for_john.txt に保存されている SHA1 ハッシュをクラックします。John the Ripper は、多くのオペレーティングシステムで利用可能な高速なパスワードクラッカーです。その主な目的は、弱い Unix パスワードを検出することです。SHA1 を含む様々なハッシュタイプをサポートしています。
この実験では、John the Ripper を「単語リストモード」で使用してハッシュのクラッキングを試みます。このモードは、定義済みのリスト(「単語リスト」)からパスワードを試します。この実験では、元のパスワードを含む簡単な単語リストを作成します。実際のシナリオでは、はるかに大きく、より包括的な単語リストを使用することになります。
まず、wordlist.txt という名前の簡単な単語リストファイルを作成します。
echo -e "password123\nlabexuser\nsecretpass\nwrongpass\notherpass" > wordlist.txt
次に、準備したハッシュファイルと単語リストを使用して John the Ripper を実行します。
john --format=raw-sha1 --wordlist=wordlist.txt sha1_hashes_for_john.txt
コマンドの内訳を見てみましょう。
john: John the Ripper を呼び出すコマンドです。--format=raw-sha1: 入力ハッシュが生の SHA1 ハッシュであることを指定します。John は多くのフォーマットをサポートしており、正しいものを指定することで効率的なクラッキングが可能になります。--wordlist=wordlist.txt: クラッキングのためにwordlist.txtを辞書として使用するように John に指示します。sha1_hashes_for_john.txt: クラック対象のハッシュを含むファイルです。
コマンドを実行すると、John はハッシュのクラッキングを試みます。成功した場合、クラックされたパスワードが表示されます。
以下のような出力が表示され、クラックされたパスワードが示されるはずです。
Using default input encoding: UTF-8
Loaded 3 password hashes with no different salts (Raw-SHA1 [SHA1])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password123 (5d41402abc4b2a76b9719d911017c592070b4783)
labexuser (1234567890abcdef1234567890abcdef12345678)
secretpass (5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8)
3g 0:00:00:00 DONE (2023-10-27 10:30) 100.0% (ETA: 00:00:00) 3.000g/s 100.0p/s 100.0c/s 100.0C/s password123..secretpass
Session completed.
クラックされたパスワードを再度表示するには、--show オプションを使用できます。
john --show sha1_hashes_for_john.txt
このコマンドは、John が正常にクラックし、その内部 pot ファイルに保存したすべてのハッシュを表示します。
password123:5d41402abc4b2a76b9719d911017c592070b4783
labexuser:1234567890abcdef1234567890abcdef12345678
secretpass:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
3 password hashes cracked, 0 left
SHA1 クラッキングのパフォーマンス分析
このステップでは、John the Ripper が SHA1 ハッシュをクラックする際のパフォーマンスを簡単に分析します。この例では非常に小さな単語リストと単純なパスワードを使用していますが、実際のシナリオでは、クラッキングのパフォーマンスは重要な要素となります。
John the Ripper は、出力に「g/s」(1 秒あたりの推測回数)や「p/s」(1 秒あたりのパスワード数)などのパフォーマンスメトリックを提供します。これらのメトリックは、John が 1 秒あたりに実行できるパスワード試行回数を示します。
クラッキングコマンドを再度実行し、出力を注意深く観察しましょう。
john --format=raw-sha1 --wordlist=wordlist.txt sha1_hashes_for_john.txt
出力の中から、以下のような行を探してください。
3g 0:00:00:00 DONE (2023-10-27 10:30) 100.0% (ETA: 00:00:00) 3.000g/s 100.0p/s 100.0c/s 100.0C/s password123..secretpass
ここで、3.000g/s は John が 1 秒あたり 3 回の推測を実行したことを示し、100.0p/s は 1 秒あたり 100 個のパスワードを処理したことを示します。これほど少ないハッシュセットと非常に小さな単語リストの場合、クラッキングはほぼ瞬時に完了します。
クラッキングのパフォーマンスに影響を与える要因:
- パスワードの複雑さ: 単純で一般的なパスワードは、複雑でユニークなパスワードよりもはるかに速くクラックされます。
- 単語リストのサイズと質: 大きく関連性の高い単語リストは、クラッキングの成功率を高めますが、それに伴い時間も増加します。
- ハッシュアルゴリズム: 一部のハッシュアルゴリズムは、クラッキングの試みを遅くするために計算集約的に設計されています(例:bcrypt、scrypt)。一方、生の SHA1 のようなものは比較的迅速です。
- ハードウェア: クラッキングマシンの処理能力(CPU/GPU)は、パフォーマンスに大きく影響します。
この簡単な分析は、John the Ripper のような強力なツールを使用しても、元のパスワードの強度とハッシュアルゴリズムが、ハッシュをクラックするのにかかる時間に重要な役割を果たすことを強調しています。
SHA1 ハッシュの特性を理解する
このステップでは、SHA1 ハッシュの特性と、パスワードストレージに強力なハッシュアルゴリズムを使用することがなぜ重要なのかをより深く理解します。
SHA1 の主な特性:
- 固定出力サイズ: SHA1 は、入力サイズに関係なく、常に 160 ビット(20 バイト)のハッシュ値を生成します。そのため、40 文字の 16 進数文字列が表示されます。
- 一方向関数: ハッシュ値から元の入力を取得するために、ハッシュ処理を逆算することは計算上不可能です。そのため、クラッキングは総当たり攻撃または辞書攻撃に依存します。
- 決定論的: 同じ入力は常に同じ SHA1 ハッシュを生成します。この特性は、データの整合性を検証するために不可欠です。
- アバランシェ効果: 入力にわずかな変更(1 ビットだけでも)を加えると、ハッシュ出力が劇的に変化します。これにより、ハッシュの類似性に基づいて入力を推測することが困難になります。
SHA1 がパスワードストレージとして安全でないと考えられる理由:
- 衝突攻撃: 2017 年、SHA1 に対する実用的な衝突攻撃が実証されました。衝突とは、2 つの異なる入力が同じハッシュ出力を生成する場合を指します。衝突を見つけても元のパスワードが直接明らかになるわけではありませんが、ハッシュ関数の整合性が損なわれ、さまざまな攻撃に悪用される可能性があります。
- 速度: SHA1 は比較的計算速度が速いです。この速度は、最新のコンピューティングパワーと相まって、特に一般的または弱いパスワードに対して、総当たり攻撃や辞書攻撃に対して脆弱になります。
- ソルト(Salting)の欠如: この実験で実証された生の SHA1 ハッシュには、本質的に「ソルト」が含まれていません。ソルトとは、ハッシュ化する前に各パスワードに一意のランダムな文字列を追加することです。これにより、事前に計算されたレインボーテーブルの効果を防ぎ、同じデータベースに保存されていても、同じパスワードが異なるハッシュを持つことを保証します。
今日の安全なパスワードストレージには、bcrypt、scrypt、または Argon2 のような、より強力で、遅く、ソルト化されたハッシュアルゴリズムが推奨されます。これらのアルゴリズムは計算集約的に設計されており、総当たり攻撃をはるかに時間のかかる、コストのかかるものにします。
この実験では、SHA1 を使用したハッシュクラッキングの基本的な原則を実証しました。これは、堅牢なハッシュアルゴリズムと強力でユニークなパスワードを使用することの重要性を思い出させるものであり、機密情報を保護するために不可欠です。
まとめ
この実験では、平文パスワードから SHA1 ハッシュを生成し、クラッキングの準備を行う方法を学びました。その後、John the Ripper を単語リストモードで使用してこれらの SHA1 ハッシュをクラックし、元のパスワードを復元しました。さらに、ハッシュクラッキングのパフォーマンスに影響を与える要因についての洞察を得て、SHA1 の主な特性を理解しました。これには、その速度と衝突攻撃に対する脆弱性により、パスワードストレージとして安全ではないと見なされる理由が含まれます。この実践的な経験は、安全なパスワード管理のために、強力でユニークなパスワードと、bcrypt、scrypt、または Argon2 のようなモダンで堅牢なハッシュアルゴリズムを使用することの重要性を再確認させます。


