はじめに:unique とは? 🤔
John the Ripper (JtR) は、パスワードのセキュリティ監査やリカバリのための強力なオープンソースツールとして広く知られています。システム管理者やセキュリティ専門家が、脆弱なパスワードを特定するために利用する定番ツールの一つです。JtR は、辞書攻撃、ブルートフォース攻撃、インクリメンタルモードなど、多様なパスワードクラッキング手法をサポートしています。
JtR スイートには、パスワードクラッキング本体の `john` 以外にも、いくつかの補助的なユーティリティが含まれています。その中でも `unique` は、特に辞書攻撃(Wordlist mode)を行う際に非常に役立つツールです。
`unique` の主な機能は、入力されたテキストファイル(通常は単語リストやパスワードリスト)から重複する行を取り除き、ユニークな行だけを出力ファイルに書き出すことです。これは、パスワードクラッキングの効率を向上させる上で重要なステップとなります。なぜなら、同じパスワード候補を何度も試行するのは時間の無駄であり、リソースの浪費につながるからです。
このブログ記事では、`unique` ツールの基本的な使い方から、便利なオプション、具体的な活用事例までを詳しく解説していきます。JtR を使ったパスワード監査やセキュリティテストの効果を高めたい方は、ぜひ参考にしてください。✨
unique の基本的な使い方 🚀
`unique` の基本的な構文は非常にシンプルです。通常、1つ以上の入力ファイルを受け取り、重複を除去した結果を指定された出力ファイルに書き出します。
基本的なコマンド形式は以下の通りです。
unique [オプション] 出力ファイル [入力ファイル1 入力ファイル2 ...]
各要素について説明します。
- `unique`: コマンド本体です。
- `[オプション]`: 動作を調整するためのオプションを指定します(後述します)。
- `出力ファイル`: 重複が除去された結果が書き込まれるファイル名を指定します。このファイルが存在しない場合は新規に作成され、存在する場合は上書きされます。
- `[入力ファイル1 入力ファイル2 …]`: 重複を除去したい元のファイル名を指定します。複数のファイルを指定することができ、その場合はすべてのファイルの内容が結合されてから重複除去が行われます。入力ファイルが指定されなかった場合、`unique` は標準入力(stdin)からデータを読み取ります。これは、パイプ (`|`) を使って他のコマンドの出力を `unique` に渡す場合に便利です。
例1:単一のファイルから重複を除去する
`wordlist.txt` というファイルから重複行を除去し、結果を `unique_wordlist.txt` に保存する場合:
unique unique_wordlist.txt wordlist.txt
このコマンドを実行すると、`wordlist.txt` 内の重複行が取り除かれ、ユニークな行だけが `unique_wordlist.txt` に書き込まれます。元の `wordlist.txt` ファイルは変更されません。
例2:複数のファイルを結合して重複を除去する
`list1.txt` と `list2.txt` という2つのファイルを結合し、重複を除去して `combined_unique.txt` に保存する場合:
unique combined_unique.txt list1.txt list2.txt
このコマンドは、まず `list1.txt` と `list2.txt` の内容をメモリ上で結合し、その後で全体の重複行を除去します。結果は `combined_unique.txt` に保存されます。
例3:標準入力から読み込んで重複を除去する
`cat` コマンドで `wordlist.txt` の内容を標準出力に出し、それをパイプで `unique` に渡して重複を除去し、結果を `output.txt` に保存する場合:
cat wordlist.txt | unique output.txt
この方法は、他のコマンド(例えば `crunch` や `sed` など)で生成した単語リストを直接 `unique` で処理したい場合に便利です。
`unique` は、入力ファイル内の行の順序を保持したまま重複を除去します。つまり、最初に出現した行が保持され、それ以降に出現した同じ内容の行は除去されます。
主要なコマンドラインオプション ⚙️
`unique` は、動作をカスタマイズするためのいくつかの便利なオプションを提供しています。以下に主要なものを紹介します。
オプション | 説明 |
---|---|
-v |
Verbose モードを有効にします。 処理中および処理完了時に、読み込んだ行数や出力したユニークな行数などの統計情報を表示します。大規模なファイルを処理する際に進捗を確認するのに役立ちます。 |
-inp=FILENAME |
標準入力(stdin)の代わりに使用する入力ファイルを指定します。 通常、`unique` はコマンドライン引数で指定されたファイル、またはそれがなければ標準入力を読み込みます。このオプションを使うと、コマンドライン引数に他のファイルを指定しつつ、特定のファイルを入力の主ソースとして扱うことができます。少し特殊な使い方ですが、他のファイルと結合する前のベースとなるファイルを指定するようなケースで使われることがあります。 |
-cut=LEN |
各入力行を指定された長さ `LEN` バイトに切り詰めてから重複判定を行います。 例えば、パスワードリストの中に非常に長い行が含まれており、最初の数文字だけが重要である場合などに使用できます。切り詰められた後の文字列で重複が判定され、出力されるのは元の(切り詰められる前の)行です。-ex_file や -ex_file_only で指定されたファイルの内容も同様に切り詰められます。
|
-mem=NUM |
重複判定に使用するメモリ量を調整します。 `NUM` はハッシュテーブルのサイズを対数(2のべき乗)で指定します。デフォルト値は通常 21 であり、これは 221 エントリのハッシュテーブルを使用することを意味します。値を大きくすると(最大 25 まで)、より多くのメモリを使用しますが、非常に巨大なファイルや重複が多いファイルの処理速度が向上する可能性があります。逆に、メモリが少ない環境では値を小さくする必要があるかもしれません。値を大きくしすぎると、システムがスワップを多用し、かえって処理が非常に遅くなることがあるため注意が必要です。メモリ使用量は、この値を1増やすごとに約2倍になります。 |
-ex_file=FILENAME2 |
追加の除外リストファイルを指定します。 `FILENAME2` に含まれる行は、入力ファイル(または標準入力)の重複除去に使用されますが、`FILENAME2` 自体の内容は出力ファイルには書き込まれません。つまり、`FILENAME2` に存在する行は、入力ファイルにあっても最終的な出力からは除外されます。これは、既知の単語リスト(例えば、既に試行済みのパスワードリストなど)を基に、新しいリストからそれらの単語を除外したい場合に便利です。繰り返し辞書を作成する際に役立ちます。 |
-ex_file_only=FILENAME2 |
`FILENAME2` を唯一の重複チェック対象とします。 このオプションを使用すると、入力ファイルの内容は `FILENAME2` の内容とだけ比較され、入力ファイル内での重複はチェックされません。`FILENAME2` は既にユニークであることが前提となります。`-ex_file` と似ていますが、入力ファイル内の行同士の比較を行わない点が異なります。特定の「マスターリスト」に含まれていない行だけを抽出したい場合などに使えます。 |
オプションの使用例
例1: 詳細な情報を表示しながら重複を除去する
unique -v unique_words.txt large_wordlist.txt
処理中に行数カウントなどが表示されます。
例2: メモリ割り当てを増やして大規模ファイルを処理する (メモリ 2^23 エントリ分を確保)
unique -mem=23 huge_unique_list.txt massive_list1.txt massive_list2.txt
例3: 既存の除外リスト `tried.txt` に含まれる単語を `new_list.txt` から除外し、結果を `candidates.txt` に保存する
unique -ex_file=tried.txt candidates.txt new_list.txt
この場合、`new_list.txt` に含まれる行のうち、`tried.txt` にも含まれている行は `candidates.txt` には出力されません。また、`new_list.txt` 内での重複も除去されます。
例4: 各行を最初の8バイトに切り詰めてから重複判定を行う
unique -cut=8 short_unique.txt long_lines.txt
`long_lines.txt` 内の各行が最初の8バイトで比較され、重複がないと判断された元の行が `short_unique.txt` に出力されます。
活用事例とシナリオ 💡
`unique` は、そのシンプルさにもかかわらず、様々なシナリオで役立ちます。特に John the Ripper を使用する上で、効率的なパスワードクラッキングを行うためには欠かせないツールと言えるでしょう。
シナリオ1:単語リストの最適化
インターネット上で公開されている単語リストや、自分で収集した単語リストには、しばしば大量の重複が含まれています。例えば、有名な `rockyou.txt` のような巨大なリストでも、内部に重複が存在する可能性があります。
JtR の辞書攻撃モード (`–wordlist`) でこれらのリストを使用する前に `unique` を適用することで、無駄な試行を減らし、クラッキングプロセス全体の時間を短縮できます。
# ダウンロードした wordlist.txt から重複を除去して最適化
unique optimized_wordlist.txt wordlist.txt
# 最適化されたリストを使って JtR を実行
john --wordlist=optimized_wordlist.txt --format=sha256 hashes.txt
重複を除去することで、リストのファイルサイズも小さくなり、メモリ使用量の削減にも繋がる可能性があります。📈
シナリオ2:複数の単語リストの統合
異なるソースから入手した複数の単語リスト(例: 言語別のリスト、特定のテーマに関するリスト、過去の漏洩パスワードリストなど)を組み合わせて、より包括的な辞書を作成したい場合があります。
これらのリストを単純に結合すると、リスト間で重複する単語が多く含まれる可能性があります。`unique` を使えば、これらのリストを効率的に結合し、重複のない単一のリストを作成できます。
# list_en.txt, list_jp.txt, leaked_passwords.txt を結合して重複を除去
unique combined_unique_list.txt list_en.txt list_jp.txt leaked_passwords.txt
# 統合されたリストで JtR を実行
john --wordlist=combined_unique_list.txt hashes_to_crack.txt
これにより、個々のリストに含まれるユニークな単語をすべて網羅しつつ、重複による無駄を排除した強力なカスタム辞書を作成できます。💪
シナリオ3:JtR のルール適用結果の最適化
JtR の強力な機能の一つに、ルールベースの単語変形(Word Mangling Rules)があります。これは、元の単語リストの単語に対して、大文字小文字の変更、数字や記号の追加・置換などのルールを適用し、より多くのパスワード候補を生成する機能です (`–rules` オプション)。
しかし、ルールを適用した結果、異なる元の単語から同じ候補が生成されることがあります(例: “password” にルールで “1” を追加 → “password1″、”Password” にルールで小文字化+ “1” を追加 → “password1″)。
このような重複を避けるために、まず `–stdout` オプションを使って JtR にルール適用後の候補を標準出力させ、それを `unique` にパイプで渡して重複を除去し、その結果をファイルに保存したり、さらに別の JtR プロセスに渡したりすることができます。これは特に、ハッシュ計算が遅い形式(例: bcrypt)をクラックする場合に有効です。事前にユニークな候補リストを生成しておくことで、実際のクラッキング時の計算量を最小限に抑えられます。
# 元のリストにルールを適用し、結果を標準出力
john --wordlist=base_list.txt --rules=KoreLogicRules --stdout > candidates_with_duplicates.txt
# unique で重複を除去
unique unique_candidates.txt candidates_with_duplicates.txt
# 重複除去後のリストで本番のクラッキングを実行
john --wordlist=unique_candidates.txt --format=bcrypt slow_hashes.txt
あるいは、パイプを使って一連の処理を行うことも可能です。
# ルール適用結果を unique に直接渡し、最適化されたリストを生成 (-mem=25 はメモリを多く使う例)
john --wordlist=base_list.txt --rules=Best64 --stdout | unique -mem=25 optimized_candidates.txt
このテクニックは、JtR のチートシートなどでも紹介されており、効率的なパスワードクラッキングのための重要なステップとされています。💯
シナリオ4:インクリメンタルクラック用の文字セット生成支援
JtR のインクリメンタルモード (`–incremental`) は、定義された文字セットに基づいて総当たり攻撃を行いますが、その効率は文字セットの質に依存します。`john –make-charset` コマンドは、既存のクラック済みパスワード(`.pot` ファイル)などから文字の出現頻度に基づいたカスタム文字セットファイル (`.chr`) を生成します。
`.pot` ファイルには同じパスワードが複数回記録されることは通常ありませんが、他のソース(例えば、ルール適用後の候補リスト)から文字セットを生成する場合、そのソースに重複が含まれていると頻度計算が偏る可能性があります。このような場合に、ソースとなるリストを事前に `unique` で処理しておくことで、より正確な文字頻度に基づいた文字セットを生成するのに役立ちます。
# ルール適用後の候補リスト (重複を含む可能性あり)
john --wordlist=base.txt --rules=All --stdout > raw_candidates.txt
# 重複を除去
unique unique_candidates_for_charset.txt raw_candidates.txt
# unique なリストから文字セットを生成
john --make-charset=mycharset.chr --input=unique_candidates_for_charset.txt
# 生成したカスタム文字セットを使ってインクリメンタルモードを実行
john --incremental=mycharset --format=md5 hashes.txt
パフォーマンスとメモリに関する考慮事項 💾⏱️
`unique` は一般的に高速に動作しますが、処理するファイルのサイズや内容、そして利用可能なシステムリソース(特にメモリ)によってパフォーマンスが影響を受けます。
- ファイルサイズ: 当然ながら、入力ファイルが大きくなればなるほど、処理に必要な時間とメモリは増加します。数GBを超えるような巨大なファイルを処理する場合、相応の時間とメモリが必要になります。
- 重複の度合い: ファイル内の重複が多いほど、`unique` は多くの行を破棄するため、出力ファイルは小さくなります。重複判定のプロセス自体には、重複が多いか少ないかで大きな速度差は出にくいですが、最終的な書き込み処理は重複が多い方が速く終わる傾向があります。
-
メモリ使用量 (`-mem=NUM` オプション): `unique` はハッシュテーブルを使って行の重複を管理します。このハッシュテーブルのサイズがパフォーマンスに大きく影響します。
- デフォルトのサイズ(通常 `-mem=21`)は、一般的なサイズのファイルに対しては十分な場合が多いです。
- 非常に巨大なファイル(数億行以上など)を処理する場合、ハッシュテーブルの衝突が増加し、パフォーマンスが低下する可能性があります。このような場合、`-mem` オプションで値を大きくする(例: `-mem=23` や `-mem=24`、最大 25)ことで、衝突を減らし、処理速度を改善できることがあります。
- ただし、`-mem` の値を大きくすると、使用メモリ量が指数関数的に増加します(1増えるごとに約2倍)。システムの搭載メモリ量を超える値を指定すると、ディスクスワップが多発し、極端にパフォーマンスが低下する可能性があります。システムの空きメモリ量を考慮して適切な値を設定することが重要です。
- `-v` オプションを使うと、処理中におおよそのメモリ使用量が表示されることがあるため、調整の参考になります。
- ディスク I/O: ファイルの読み込みと書き込み速度も全体のパフォーマンスに影響します。特に巨大なファイルを処理する場合、高速なストレージ(SSDなど)を使用することで、処理時間を短縮できます。
まとめ 📜
John the Ripper スイートに含まれる `unique` ツールは、テキストファイルから重複行を効率的に除去するためのシンプルかつ強力なユーティリティです。
主な利点と用途は以下の通りです。
- 📝 単語リストの最適化: JtR の辞書攻撃で使用するリストから重複を削除し、クラッキング効率を向上させます。
- ➕ 複数リストの統合: 異なるソースからのリストを結合し、重複のない包括的なカスタム辞書を作成します。
- ⚙️ ルール適用結果の整理: JtR のルール機能で生成された候補リストから重複を除去し、特に計算コストの高いハッシュ形式のクラッキングを効率化します。
- 💾 メモリ管理: `-mem` オプションにより、処理するファイルのサイズに応じてメモリ使用量を調整できます。
- 🔍 除外機能: `-ex_file` オプションを使って、特定のリストに含まれる単語を除外した新しいリストを作成できます。
`unique` を効果的に活用することで、John the Ripper を使ったパスワード監査やセキュリティテストの準備段階を効率化し、クラッキングプロセス全体の時間短縮とリソースの節約に貢献します。ぜひ、日々のセキュリティ業務や学習に取り入れてみてください。🚀
参考情報 📚
-
John the Ripper official website:
https://www.openwall.com/john/
John the Ripper の公式サイト。ダウンロード、ドキュメントなど。
-
John the Ripper command line options (including unique options):
https://www.openwall.com/john/doc/OPTIONS.shtml (unique についての言及は少ないですが、関連ツールとして) or GitHub mirror: https://github.com/openwall/john-documentation/blob/master/OPTIONS.md
JtR のコマンドラインオプションに関する公式ドキュメント。他のツールについても記載があります。
-
Kali Linux Tools – john:
https://www.kali.org/tools/john/
Kali Linux に含まれる John the Ripper パッケージの一部として unique コマンドの簡単な説明が含まれています。
コメント