注意事項
他者の端末から許可を得ずに情報を取得する行為は法律に抵触する可能性があります。本ツールを用いる場合は、管理者から許可を得た情報や自身で作成した情報に対して使用するようにしてください。
概要
John the RipperはOpenwall社が公開しているオープンソースのパスワードクラッキングツールです。ユーザーが設定したパスワードはハッシュ化された状態で端末に保存されています。本ツールは、ハッシュ化されたパスワード(パスワードハッシュ)から、元のパスワードを特定するために使用します。そのため、本ツールを利用するには事前にパスワードハッシュを別途入手しなければなりません。パスワードハッシュを入手できた後、ペネトレーションテスターの環境でパスワードクラッキングを行い、元のパスワードを特定していく流れが一般的です。そして、特定したパスワードを用いて横展開などを行い、ペネトレーションテストの目的を果たすための活動を続けます。
John the RipperはWindowsやLinux/Unixなど、さまざまなOSプラットフォーム上で動作します。Linuxの場合は、下記のコマンドで[PASSWORD-FILES]に記載されたパスワードハッシュの解析が実行されます。
john [OPTIONS] [PASSWORD-FILES]
本記事では紹介しませんが、CUI操作に慣れていない場合はGUI版の「Johnny」が便利です。
パスワードからパスワードハッシュに変換するハッシュ関数にはさまざまなものが存在し、その多くにJohn the Ripperは対応しています。加えて、圧縮ファイル(ZIPファイル・7zファイルなど)やOfficeファイルに設定されたパスワードの解析にも対応しています。
John the Ripperには4種類のパスワードクラッキング手法が用意されています。
1.Wordlist mode
辞書攻撃を実行します。脆弱なパスワードや辞書に登録されている単語などをまとめたワードリストが必要になります。John the Ripperにはワードリストが含まれているので別途用意する必要はありませんが、外部公開されているものや自作したものを利用することも可能です。
用意したワードリストに対してマングリングルールを設定することもできます。マングリングルールとは、元の文字列から似た文字列を派生させるルールのことを指します。
(例)”a”を”@”に置換、文字列の語尾に数値を追加、文字列の順番を逆転 など
マングリングルールに関しても、ワードリスト同様にユーザーが任意に設定することが可能です。
2.Single crack mode
ユーザー名、GECOSフィールド(ユーザーに関するコメント)のフルネーム、ユーザーのホームディレクトリ名に基づき解析を実行します。そして、これらの情報に対して、大規模なマングリングルール「single」を適用させることでパスワードの特定を試みます。
3.Incremental mode
ブルートフォース攻撃(総当たり攻撃)を実行します。パスワードクラッキング端末の性能に大きく依存しますが、文字の数や種類が少ない場合は数時間~数日でパスワードを特定できる場合があります。一方で、文字の数や種類が多い場合は膨大な時間を要します。
参考:パスワードクラッキングに要する時間
実行される総当たりの内容は、ユーザーが任意に設定することも可能です。デフォルトで実行される総当たりの内容は、[$john/john.conf]に記載されています。著者が実行しているバージョンでは、デフォルトで実行するとIncremental:ASCIIが選択され、最大文字数13文字、文字種95種類の総当たりが実行されます。
4.External mode
外部のプログラムやスクリプトを呼び出して解析を行います。John the Ripperが対応していないハッシュ関数やパスワードクラッキング手法を試す際に役立ちます。
ペネトレーションテストにおける利用方法
日本国内の企業からペネトレーションテストの依頼を受け、調査対象端末への侵入に成功し、複数のパスワードハッシュを入手できたと仮定します。入手できたユーザー名とパスワードハッシュなどを[password-hash.txt]にまとめました。
以下では、ペネトレーションテスターのパスワードクラッキング端末でJohn the Ripperを実行し、パスワードを特定していく様子を紹介します。
パスワードを特定するヒントがない場合、まずはオプションを設定せずにJohn the Ripperを実行します。
オプションを設定しない場合、John the Ripperは下記の順番で解析を行います。
- ハッシュ関数の特定
[password-hash.txt]内の各行に”$6$”の文字列があるため、Linuxの場合であればパスワードハッシュはすべてSHA512で暗号化されていることが特定されました。 - Single crack mode
ユーザー「test1」がユーザー名を2回並べただけのパスワード「test1test1」を利用していたため、本モードで特定されました。 - Wordlist mode
デフォルトのパスワードリスト[password.lst]を用いて解析を行った結果、ユーザー「test2」はパスワード「password」を利用していることが特定されました。 - Incremental mode
デフォルトに設定された総当たりの内容に沿って解析を行います。約10分経過したところで、ペネトレーションテスターが解析を終了させました。
Incremental modeは膨大な時間を要するため、可能な限り避けたい手法になります。クラッキングに成功したパスワードを確認すると非常に脆弱なものが多いため、少し工夫をすることで特定できるものがほかにもあるかもしれません。
まずは、マングリングルールを適用させてみます。John the Ripperには、さまざまなマングリングルールが用意されています。各ルールの内容は[$john/john.conf]内に記載されています。
今回はSingle crack modeと同じマングリングルールをデフォルトのパスワードリスト[password.lst]に適用してみます。なお、既に特定したパスワードは[~/.john/john.pot]にまとめられ、再び解析されることはありません。
その結果、ユーザー「test3」はパスワード「password2024」を利用していることが特定できました。
続いて、インターネット上に公開されているワードリストを利用してみます。今回は、お客さまを日本企業と仮定しているため、Openwall社が公開している日本語のワードリストを利用してみます。
その結果、ユーザー「test4」はパスワード「onsen」を利用していることが特定できました。
ほかのワードリストやマングリングルールも試しましたが、ユーザー「test5」のパスワードを特定することができなかったので、Incremental modeを利用します。
デフォルトのIncremental modeでは、最大文字数が13文字の総当たりが行われるので、ペネトレーション期間中に終わらない可能性が高いと見積もりました。そこで、最大文字数5文字まで減らし、総当たりすることにしました。
非常に時間のかかる解析のため、その間にパスワードを特定できたユーザーに横展開し、ペネトレーションテストの目的を果たすための活動を行います。
数時間後、パスワードクラッキング端末を確認すると、ユーザー「test5」はパスワード「X#%」を利用していることが特定できました。