John the Ripper

提供: セキュリティ
2016年10月23日 (日) 18:38時点におけるDaemon (トーク | 投稿記録)による版

移動: 案内検索
スポンサーリンク

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にインストールする場合

CentOSyum コマンドでインストールする場合。

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 自体は、単体で動作するものですが、コミュニティ版の jumbo パッチが適応されたものは、分散処理が可能です。 MPI を利用して、分散処理が可能です。MPI が使えて、 NFS を使うといった形での分散処理になるようです。

OpenMPI を使うには、 OpenMPI のライブラリやヘッダファイル、 OpenMPI に対応した Cコンパイラが必要になります。

力技の分散処理について

分散処理したいが、OpenMPI を使えない環境である場合には、力技で分散処理することもできます。

以下のコマンドが使えれば、良いでしょう。

  • ssh/scp
  • tmux
  • split

あとは、欲しいだけの能力(CPUパワー)を備えた、ホスト x 台数 のリソースを用意します。

だいたい以下の手順になります。

  1. splitコマンドでターゲットになるファイルをホスト数で分割します
    split コマンドは行数で指定(-lオプション)できるので、 行数 ÷ 台数 を四捨五入した数で、分割します。
  2. scp でターゲットファイルを各ホストに配布します
  3. ssh で tmux を実行し、tmux のセッションに john の実行命令を実行します
  4. 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 --fork=4 target.txt

ベンチマーク

ベンチマークには、 --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 に付属している辞書ファイルにあるパスワードを設定させない、というほうが効率的でしょう。

関連項目




スポンサーリンク