John the Ripper
John the Ripperは、有名なパスワードクラッキングのソフトウェアの1つです。Unix(FreeBSD, Linux)やWindowsのパスワードをクラッキングすることができます。
読み方
- John the Ripper
- じょん ざ りっぱー
目次
概要
John the Ripperは、高速なパスワードクラッカーです。多くのUnix系OSやWindows, DOS, BeOS, OpenVMS などで利用可能です。主要な目的な弱いUnixパスワードを検出することです。それにくわえて、Windows のLMハッシュなど、いくつもの crypt パスワードハッシュタイプを理解できます。John the Ripperは、オフラインのパスワードクラッキングツールです。
John the Ripperでは、総当たり攻撃 や 辞書攻撃 が可能です。 辞書ファイルとして password.lst が付属しています。 3000件程度のよくあるパスワードが用意されています。
John the Ripperは、無償のオープンソースソフトウェアです。
John the Ripperは、'GPU をサポートしていて、CUDAや OpenCL と連携可能です。
どのようなシーンで使われるのか?
一体、パスワードクラッカーは、どういったときに使われるのでしょうか?
単純に、自分のパソコンのアカウントのパスワードがわからなくなった、というケースもあるかもしれませんが、それは、稀な話でしょう。
おそらく、悪の攻撃者集団(不正利用を目的とした営利企業、営利グループ)が、不正利用を目的として、john を使っていると考えられます。 たくさんのウェブサービスが存在しており、その脆弱性を日夜探している人達がいます。脆弱性を探している人たちの中には、情報を盗むことを目的としてやっている人たちがいます。 その人達の狙いの1つとして考えられるのが、アカウント情報です。 アカウント情報には、パスワードといった、非常に重要な情報も含まれています。
ウェブサービスによって、パスワードが 平文 で保存されていることもありますし、ハッシュ化されたパスワード であることもあります。それは、ウェブサービス提供者のポリシーだったり、知識やスキルによって、どのような実装にされているかが決まってきます。
平文 でパスワードが保存されている場合には、パスワードクラッキング の出番はありません。なぜなら、答えがはじめから解っているからです。
手に入ったものが ハッシュ化されたパスワード だとすれば、攻撃者の次の仕事は、パスワードクラッキング でしょう。もちろん、パスワードクラッキング にコストを掛けずに、平文 のパスワードが得られそうなサイトを狙っていったほうが効率的かもしれません。
ハッシュ化されたパスワード を解くには、非常に多くの時間がかかるかもしれませんし、すぐに解けるかもしれません。単純なパスワードであれば、すぐに解けますし、辞書に存在しない長いパスワードであれば、計算が終わるのは、天文学的な数字の時間がかかるかもしれません。
大量のパスワードを相手にするのか、狙った単体のパスワードを相手にするのか、でも事情が変わってきます。大量のパスワードをそこそこクラッキングできれば良いのであれば、辞書ファイルを使って、短時間で解けるものだけ解く、といった方針がとれるかもしれません。
おそらく、「攻撃者はパスワードクラッカを使用して、パスワードを入手している」ということが言えるでしょう。 あなたが「攻撃者と戦う側の人間」であるのなら、あなたのユーザを守るために、何ができるのか、考えなければなりません。
サポートしているプラットフォーム
- Windows
- FreeBSD
- Linux
- MacOS
インストール
FreeBSDにインストールする場合
pkgコマンドでインストールする場合
sudo pkg install john
FreeBSD 版は、 jumbo パッチが当たったバージョンの john がインストールされます。
CentOSにインストールする場合
sudo yum -y --enablerepo=rpmforge install john
MacOSにインストールする
$ brew install john
john をビルドする
CentOS では、 openssl-devel をインストールする必要があります。 Ubuntu では openssl-devel が存在しないので、 libssl-dev をインストールします。
centos$ sudo yum install -y openssl-devel ubuntu$ sudo apt install -y openssl-devel
john をビルドするには、以下の手順でビルドできます。
$ tar zxfp john-1.8.0-jumbo-1.tar.gz $ cd john-1.8.0-jumbo-1/src $ ./configure $ make $ ../john --test
FreeBSD では、少しビルドが面倒でした。configure やソースコード をいい加減に書き換えてやってしまいました。
パスワード辞書ファイル/パスワードリストファイル
john に付属している辞書ファイル/パスワードリスト
John the Ripperには、辞書攻撃用のパスワードリストファイルの password.lst が付属しています。 この辞書ファイルは、 openwall.com で公開されている辞書ファイルです。 約3600個程度のパスワードが登録されています。 登録されているパスワードは、よくあるパスワードです。
よくあるパスワードというのは、
- 123456
- password
- qwerty
といったものです。 「よくあるパスワード」というのは、「使用すべきではないパスワード」でもあります。
それ以外の辞書ファイル/パスワードリスト
ncrack には、いくつかのパスワードリストが付属しています。 おそらく、john と同じもの、と、それ以外があります。たとえば、 top50000.pwd や myspace.pwd などです。
並行処理について
John the Ripper では、 --fork オプションを利用して、並行処理が可能になります。 CPUの数/CPUのコア数を指定して、処理すれば良いでしょう。
並列処理について
John the Ripper では、 OpenMP が利用できる場合には、自動的にスレッドがコア数分作成されます。 --fork オプションを利用している場合は、スレッド ではなく、指定された数のプロセス が生成されて処理が実行されます。
分散処理について
John 自体は、単体で動作するものですが、コミュニティ版の jumbo パッチが適応されたものは、分散処理が可能です。 MPI を利用して、分散処理が可能です。MPI が使えて、 NFS を使うといった形での分散処理になるようです。
OpenMPI を使うには、 OpenMPI のライブラリやヘッダファイル、 OpenMPI に対応した Cコンパイラが必要になります。
力技の分散処理について
分散処理したいが、OpenMPI を使えない環境である場合には、力技で分散処理することもできます。
以下のコマンドが使えれば、良いでしょう。
- ssh/scp
- tmux
- split
あとは、欲しいだけの能力(CPUパワー)を備えた、ホスト x 台数 のリソースを用意します。
だいたい以下の手順になります。
- splitコマンドでターゲットになるファイルをホスト数で分割します
- split コマンドは行数で指定(-lオプション)できるので、 行数 ÷ 台数 を四捨五入した数で、分割します。
- scp でターゲットファイルを各ホストに配布します
- ssh で tmux を実行し、tmux のセッションに john の実行命令を実行します
- ssh で john --show で進捗をチェックします
環境構築
$JOHN/dynamic.conf: No such file or directory
$JOHN/dynamic.conf: No such file or directory
Linux で上記のエラーメッセージがでる場合は、下記の対応をします。 /etc/john.conf のファイルの下記の部分をコメントアウトすることで、メッセージがでなくなります
.include <dynamic.conf>
open: $JOHN/john.local.conf: No such file or directory
FreeBSD の john-1.7.9.j.7 で以下のエラーに遭遇しました。
$ john open: $JOHN/john.local.conf: No such file or directory
john.local.conf がない、というので、空のファイルを作れば、問題は解決します。
$ sudo touch /usr/local/share/john/john.local.conf
コマンドラインオプション
% john John the Ripper password cracker, ver: 1.7.9-jumbo-5_omp [freebsd-x86-any] Copyright (c) 1996-2011 by Solar Designer and others Homepage: http://www.openwall.com/john/ Usage: john [OPTIONS] [PASSWORD-FILES] --config=FILE use FILE instead of john.conf or john.ini --single[=SECTION] "single crack" mode --wordlist=FILE --stdin wordlist mode, read words from FILE or stdin --pipe like --stdin, but bulk reads, and allows rules --encoding=NAME the input data is in a 'non-standard' character. encoding. NAME = utf-8, koi8-r, and others. For a full list, use --encoding=LIST --rules[=SECTION] enable word mangling rules for wordlist mode --incremental[=MODE] "incremental" mode [using section MODE] --markov[=LEVEL[:opts]] "Markov" mode (see documentation) --external=MODE external mode or word filter --stdout[=LENGTH] just output candidate passwords [cut at LENGTH] --restore[=NAME] restore an interrupted session [called NAME] --session=NAME give a new session the NAME --status[=NAME] print status of a session [called NAME] --make-charset=FILE make a charset file. It will be overwritten --show[=LEFT] show cracked passwords [if =LEFT, then uncracked] --test[=TIME] run tests and benchmarks for TIME seconds each --users=[-]LOGIN|UID[,..] [do not] load this (these) user(s) only --groups=[-]GID[,..] load users [not] of this (these) group(s) only --shells=[-]SHELL[,..] load users with[out] this (these) shell(s) only --salts=[-]COUNT[:MAX] load salts with[out] COUNT [to MAX] hashes --pot=NAME pot file to use --format=NAME force hash type NAME: des/bsdi/md5/bf/afs/lm/ dynamic_n/bfegg/dmd5/dominosec/epi/hdaa/ipb2/krb4/ krb5/mschapv2/mysql-fast/mysql/netlm/netlmv2/netntlm/ netntlmv2/nethalflm/md5ns/nt/phps/po/xsha/crc32/ hmac-md5/lotus5/md4-gen/mediawiki/mscash/mscash2/ mskrb5/mssql/mssql05/mysql-sha1/nsldap/nt2/oracle11/ oracle/phpass-md5/pix-md5/pkzip/raw-md4/raw-md5thick/ raw-md5/raw-sha1/raw-sha/raw-md5u/salted-sha1/sapb/ sapg/sha1-gen/raw-sha224/raw-sha256/raw-sha384/ raw-sha512/xsha512/hmailserver/sybasease/trip/ssh/pdf/ rar/zip/dummy --subformat=LIST get a listing of all 'dynamic_n' formats --save-memory=LEVEL enable memory saving, at LEVEL 1..3 --mem-file-size=SIZE size threshold for wordlist preload (default 5 MB) --field-separator-char=C use 'C' instead of the ':' in input and pot files --fix-state-delay=N performance tweak, see documentation --nolog disables creation and writing to john.log file --crack-status emit a status line whenever a password is cracked
使い方
FreeBSD
FreeBSDのパスワードをクラッキングするには、以下のコマンドを実行します。
sudo john /etc/master.passwd
Linux
Linuxでは、一度 unshadow を実行する必要があります。
sudo sh -c 'unshadow /etc/passwd /etc/shadow > /root/passwdfile' sudo john /root/passwdfile
Windowsパスワードのクラック
Windowsのパスワードのハッシュのパスワードクラックの例です。
ハッシュは、PwDump などを利用して用意します。 詳しくは、 Windowsアカウントのパスワードをクラッキングする方法 を参考にしてください。 下記のハッシュを含んだファイル hash.txt を用意します。
Administrator:500:01fc5a6be7bc6929aad3b435b51404ee:0cb6948805f797bf2a82807973b89537:::
パスワードクラックします。
john hash.txt
パスワードを表示します。
john --show hash.txt
LMハッシュとNTLMハッシュのどちらのモードで動かすか、指定しないと警告が出て、自動的に選択されます。
NTLMハッシュを指定する場合。
$ john --format=nt hash.txt Loaded 6 password hashes with no different salts (NT MD4 [128/128 X2 SSE2-16]) XXXX (Administrator)
LMハッシュを指定する場合。
$ john --format=nt2 hash.txt Loaded 6 password hashes with no different salts (NT v2 [SSE2i 12x]) Remaining 2 password hashes with no different salts
インクリメンタルにパスワードを生成する
インクリメンタルにパスワードを生成できます。総当たり攻撃
$ john -incremental -stdout
実行例は、以下の通りです。
% john -incremental -stdout | head -10 1952 sammy stark start stack stace steve stevy steen steet
パイプで別のコマンドに喰わせたりして、使うことができます。
パスワードの桁数などのパスワードの定義は、 john.local.conf で設定できます。 -incrementalオプションにモード(下記の例ではfoo)を指定します。
% john -incremental=foo -stdout
FreeBSDでは、 /usr/local/share/john/john.local.conf で設定できます。
パスワードリストファイルを指定して辞書攻撃を行う
パスワードリストファイルを指定して、辞書攻撃のオフラインアタックできます。
john --wordlist=password.lst target.txt
並行処理を行う
John the Ripperで複数プロセスによる並行処理を行う場合には、 --fork オプションを利用します。以下の例では、4プロセスが起動されます。
john --fork=4 target.txt
--forkオプションを使用しない場合に、OpenMP を有効にしてコンパイルされた John the Ripper は、コア数に応じたスレッド数を自動的に起動して、並列に処理を行えます。
ベンチマーク
ベンチマークには、 --test オプションを使用します。
$ john --test
実行例は、以下の通りです。
$ john --test Will run 4 OpenMP threads Benchmarking: descrypt, traditional crypt(3) [DES 128/128 SSE2-16]... (4xOMP) DONE Many salts: 13942K c/s real, 3576K c/s virtual Only one salt: 6193K c/s real, 2624K c/s virtual Benchmarking: bsdicrypt, BSDI crypt(3) ("_J9..", 725 iterations) [DES 128/128 SSE2-16]... (4xOMP) DONE Many salts: 477184 c/s real, 121915 c/s virtual Only one salt: 421888 c/s real, 117907 c/s virtual
メモ
自社サービスのアカウントに弱いパスワードを設定させない
john の話ではありませんが、 自社でウェブサービスを提供していて、アカウントサービスを提供しているのであれば、アカウント乗っ取りの対策が必要になります。ユーザアカウントが乗っ取られるとサポート業務が発生します。はじめから、 john に付属している辞書ファイルにあるパスワードを設定させない、というのは、ユーザのためにも、自社のためにも、双方のメリットがあります。
従業員の弱いパスワードを調べる
john の話ではありませんが、 従業員の弱いパスワードを調べることもできますが、はじめから、 john に付属している辞書ファイルにあるパスワードを設定させない、というほうが効率的でしょう。
関連項目
- passwd
- unshadow
- パスワードクラック
- Windowsアカウントのパスワードをクラッキングする方法
ツイート