はじめに
Hashcat は、その速度と汎用性で知られる世界的に有名なパスワードリカバリツールです。大規模なパスワードクラッキングを実行する際、同じハッシュリストに対して複数のシステムを使用して攻撃を行うのが一般的です。この分散アプローチは非効率につながる可能性があります。なぜなら、異なるシステムが同じパスワード候補を試すのに時間を浪費する可能性があるからです。
この問題を解決するために、Hashcat は「Brain」機能を導入しました。Hashcat Brain は、試行されたすべてのパスワード候補の記録を保持する中央サーバーとして機能します。クライアントがパスワードを試す前に、Brain に問い合わせます。パスワードが以前に試行されたものであれば、クライアントはそれをスキップし、貴重な時間とリソースを節約します。
この実験 (Lab) では、以下の方法を学びます。
- Hashcat Brain サーバーの起動方法。
- Hashcat クライアントをサーバーに接続する方法。
- パスワード攻撃を実行し、Brain が冗長な作業をどのように防止するかを観察する方法。
Hashcat Brain の概念を理解する
このステップでは、Hashcat Brain の中心的な概念と、それが解決するために設計された問題について簡単に説明します。このステップは純粋に概念的なものであり、コマンドは必要ありません。
典型的なパスワードクラッキングシナリオでは、ハッシュのリストと潜在的なパスワードのリスト(単語リスト)があります。Hashcat は、単語リストから各パスワードをハッシュに対して試行します。ここで、同じタスクに取り組んでいる 2 台の別々のコンピューター(またはクライアント)があると想像してください。
問題点: クライアント A とクライアント B の両方が、調整なしに、異なる時間に全く同じパスワード(例:「123456」)を試行する可能性があります。これは計算能力の無駄であり、作業が重複しています。
解決策(Hashcat Brain): Hashcat Brain は、スマートな中央サーバーとして機能します。ワークフローは次のとおりです。
- クライアント(例:クライアント A)はパスワード「123456」を試行したいと考えます。
- まず Brain Server に「『123456』は以前に試行されましたか?」というリクエストを送信します。
- Brain Server はデータベースをチェックします。初めての場合は、「いいえ、試行されていません」と応答します。
- クライアント A はパスワードのテストに進みます。完了後、Brain Server に「『123456』をテストしました」と通知します。Brain Server はこれを記録します。
- 後で、クライアント B が「123456」を試行したい場合、Brain Server に問い合わせます。サーバーは「はい、試行されました」と応答します。
- クライアント B は直ちにこのパスワードをスキップし、次のパスワードに進み、時間と電力を節約します。
このメカニズムにより、分散ネットワーク全体で各パスワード候補が一度だけテストされることが保証され、大規模な攻撃の効率が劇的に向上します。
Hashcat Brain サーバーの起動
このステップでは、Hashcat Brain サーバーを起動します。このサーバーは、Hashcat クライアントからの接続を待ち受け、試行されたパスワードのデータベースを管理します。
この実験 (Lab) では、サーバーとクライアントを同じマシンで実行しますが、それらは別々のシステムにあるかのようにネットワーク経由で通信します。
サーバーを起動するコマンドは、--brain-server フラグ付きの hashcat です。また、リッスンするポートも指定します。セキュリティのため、Hashcat はサーバーのパスワードを自動生成できます。
まず、プロジェクトフォルダ内にブレインファイル用のディレクトリを作成しましょう。
mkdir -p ~/project/brain
次に、ターミナルで以下のコマンドを実行してサーバーを起動します。ポート 7890 でリッスンし、データを ~/project/brain/ ディレクトリに保存します。
注意: このコマンドは現在のターミナルを占有します。次のステップでは、ターミナルパネルの
+アイコンをクリックして、新しいターミナルタブを開く必要があります。
hashcat --brain-server --brain-port 7890 --brain-session-path ~/project/brain/
コマンドを実行すると、サーバーが実行中であることを示す出力が表示されます。Password..: という行に特に注意してください。これは、クライアントが接続するために必要となる自動生成されたパスワードです。
Starting brain server on 0.0.0.0:7890...
Password..: 82b5d1a3e... (a long hex string)
Accepting clients...
このターミナルは実行したままにしておきます。閉じないでください。次のステップのために新しいターミナルを開いてください。
Brain サーバーのパスワードを取得する
このステップでは、セッションファイルから Brain サーバーのパスワードを取得する方法を学びます。パスワードはサーバー起動時にターミナルに表示されましたが、自動化された環境で便利なように、ファイルにも保存されています。
セッションファイルは、デフォルトでは hashcat.brain という名前です。--brain-session-path でカスタムパスを指定したため、ファイルは ~/project/brain/hashcat.brain にあります。
新しいターミナルタブで、cat コマンドを使用してこのファイルのコンテンツを表示します。このコンテンツがサーバーのパスワードです。
cat ~/project/brain/hashcat.brain
出力は、パスワードである長い 16 進数文字列になります。
82b5d1a3e4c9a0f7d6b3c1a9f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4c3b2a1f0e9
このパスワードは、Brain サーバーに接続したいすべてのクライアントで必要になります。次のステップでは、コピー&ペーストのエラーを避けるために、このパスワードをファイルから直接読み取るコマンドを使用します。
Brain への接続を設定する Hashcat クライアントの設定
このステップでは、Hashcat クライアントを Brain サーバーに接続するように設定します。これは、標準の hashcat コマンドにいくつかの --brain-* オプションを追加することで行います。
接続をテストするために「ドライラン」コマンドを実行します。Hashcat の --show オプションは、以前にクラックされたハッシュを表示するために使用されますが、ブレインクライアントオプションと組み合わせると、完全な攻撃を開始せずに接続を確認する良い方法として機能します。
必要なクライアントオプションは次のとおりです。
--brain-client: Hashcat にクライアントモードで動作するように指示します。--brain-host: サーバーの IP アドレスです。同じマシン上にあるため127.0.0.1を使用します。--brain-port: サーバーがリッスンしているポートで、7890です。--brain-password: サーバーのパスワードです。コマンド置換$(cat ...)を使用して、ファイルから直接読み取ることができます。
新しいターミナルタブで、以下のコマンドを実行してください。
hashcat --show -m 0 ~/project/hashes.txt --brain-client --brain-host=127.0.0.1 --brain-port=7890 --brain-password=$(cat ~/project/brain/hashcat.brain)
このコマンドは、クライアントターミナルに多くの出力を生成しません。しかし、最初のターミナルタブ(サーバーを実行しているタブ)に戻ると、Client connected from 127.0.0.1 という新しい行が表示されるはずです。これにより、クライアントがサーバーに正常に接続されたことが確認できます。
## サーバーのターミナルで
Accepting clients...
Client connected from 127.0.0.1
これにより、クライアントの設定が正しいことが確認できます。
攻撃を実行し、Brain の通信を観察する
このステップでは、辞書攻撃を実行し、Hashcat Brain が実際に動作する様子を観察します。ここでは、事前に用意された hashes.txt および wordlist.txt ファイルを使用します。
まず、攻撃を実行します。コマンドは、MD5 ハッシュ (-m 0) に対する標準的な辞書攻撃 (-a 0) で、ブレインクライアントオプションが追加されています。
これをクライアントターミナル(2 番目のタブ)で実行してください。
hashcat -m 0 -a 0 ~/project/hashes.txt ~/project/wordlist.txt --brain-client --brain-host=127.0.0.1 --brain-port=7890 --brain-password=$(cat ~/project/brain/hashcat.brain)
攻撃が実行され、パスワードがすぐに発見されるのが確認できます。
...
5f4dcc3b5aa765d61d8327deb882cf99:password
...
Session..........: hashcat
Status...........: Cracked
...
さて、ここが重要な部分です。全く同じコマンドをもう一度実行してください。
hashcat -m 0 -a 0 ~/project/hashes.txt ~/project/wordlist.txt --brain-client --brain-host=127.0.0.1 --brain-port=7890 --brain-password=$(cat ~/project/brain/hashcat.brain)
今回、出力を観察してください。攻撃はほぼ瞬時に終了するはずです。Status の行に注目してください。
...
Session..........: hashcat
Status...........: Exhausted
...
ステータスが Exhausted になるのは、ブレインクライアントがサーバーに wordlist.txt 内のすべてのパスワードについて問い合わせ、サーバーが「はい、これらはすべて以前に試行されました」と応答したためです。クライアントは、やるべき作業がないことを認識し、すぐに終了しました。これは、Hashcat Brain の強力さと効率性を示しています。
まとめ
この実験では、分散型パスワードクラッキング操作の最適化に強力な機能である Hashcat Brain を探求しました。
以下のことを学びました。
- Hashcat Brain の背後にあるコアコンセプトと、冗長な作業をどのように防止するか。
- Hashcat Brain サーバーを起動し、安全なパスワードを生成させる方法。
- サーバーのセッションファイルを見つけてパスワードを取得する方法。
- Brain に接続するために必要なフラグで Hashcat クライアントを設定する方法。
- 攻撃を実行し、Brain が実際に動作する様子を観察し、以前試行されたパスワードをインテリジェントにスキップする方法を目撃する方法。
Hashcat Brain をマスターすることで、大規模または長期間実行されるパスワードリカバリキャンペーンの効率を大幅に向上させ、時間と計算リソースを節約できます。


