John the Ripper v1.4

John the Ripper とは ?

John the Ripper は Unixパスワードクラッカーだ。
現在 UNIX版と DOS版、WinNT/95版がある。
( Linux x86, FreeBSD x86,Solaris 2.x SPARC, OSF/1 Alphaでテストした)
すでにいくつかの Unix Password Cracker を知っているだろう。
そこで John 固有の機能について説明する。

version 1.3 からの変更点

- MD5 パスワードのサポート
- SPARC V8 アッセンブリ バージョン
-  多数のバグ・フィックス

 概 要


John the Ripper は強力であり、速い。いくつかのクラッキングモードを持つ。
特別な要求に対する完全な柔軟性を持つ。
(ビルト・インCコンパイラにより、クラッキングモードのカスタム化もできる)
Johnはまた、異なるプラットフォームでも使える。これで、同じクラッカーをどこでも使える。
例えば別のプラットフォームではじめたセッションを別のプラットフォームで続けることも。

John の crypt()ルーチンは速度向上のため高度に最適化され、他のクラッカーより
Johnははるかに速く走る。これはアッセンブリバージョンと 純粋なCの両方に使った。

John the Ripper は次のクラッキングモードをサポートする。

- 辞書:wordlist rulesの適用(有、無)
- シングルクラック:single login /GECOS 情報を使う
- インクリメンタル:incremental すべての文字のコンビネーションを試す
- 外部モード:external 自分のモードを定義できる
インストール

バイナリーで配布されているものは、すべてのファイルを別のディレクトリにコピー
するだけでよい。それから共通ファイル(common files)をそこに解凍する。
(別のアーカイブで提供される) 場合によっては 'chmod +x john'が必要かもしれない。

ソースをコンパイルするには、解凍したディレクトリで make を実行する。
サポートしているシステムのリストが現れる。その中から選ぶかリストになければ
'make generic'を試す。GCCとGNU makeを使うこと。
( bin/make が既に存在するかのもしれないので make はフルパスで指定すること)
使い方

John のコマンドライン・インターフェースは故意に Cracker Jackに似せてある。
Cracker Jackを使ったことがある人には簡単だろう。John の機能を簡単に説明する。

John the Ripper を使うにはパスワードファイルとクラッキング・モードを指定する。
クラックされたパスワードはスクリーンに表示され ~/john.pot ('~' はhome directory を意味する。例えばjohnの実行ファイルのディレクトリ)に保管される。
このファイルは同じパスワードを再度クラックするときにクラックされたアカウントをロードしないためにも使われる。クラックしたパスワードを表示するには -show オプションを使う。

クラッキング中に Enterを押すと状況(status)表示する。Ctrl+Cでセッションを中止する。セッション情報はデフォルトで restoreに保存される。続けて2回 Ctrl+Cを押すと保存しないで直ちに停止する。セッション情報はクラッシュに備えて10分おきに保存される。

コマンドライン オプション
---------------------------
コマンドラインで次のオプションを指定できる。すべてのオプションは大文字と小文字を区別する。
(case sensitive)また、短縮形も使える。

       -pwfile:<file>[,..]     passwd file(s)を指定 (ワイルドカード可)

このオプションはクラックするパスワードファイルを指定する。
(実際には ダッシュ-で始まっていないコマンドラインは、パスワードファイルとみなされる)

       -wordfile:<file> -stdin 辞書モード <file> あるいは stdinから単語を読む。


       -rules                  辞書に対して rules を適用する

ルール(Alec Muffettによる Crackのような)を適用する。このルールは /john.iniの section [List.Rules:Wordlist]に保存されている。

       -incremental[:<mode>]   インクリメンタル・モード
                               [using john.ini entry <mode>]

~/john.ini で指定されたルールを使う。(section [Incremental:<mode>] )
ここで <mode> はコマンドラインで指定したモード。デフォルトは[Incremental:All]

       -single                 シングルクラック・モード

シングルクラック・モードでは rules [List.Rules:Single] が適用される。

       -external:<mode>        イクスターナル・モード using john.ini entry
<mode>

~/john.ini の [List.External:<mode>]で指定された外部機能を使う。

       -restore[:<file>]       restore session [from <file>]

中断されたセッションを指定したファイル(デフォルトは~/restore )で再開する。

       -makechars:<file>       文字セットを作る <file> は上書きされる

~/john.potに現れる頻度により、文字セットファイルを作る。インクリメンタルモードで使われる。指定がなければ John.potは文字セットファイルとして使われる。このオプションと一緒にイクスターナル filter() ルーチンを使う事もできる。

       -show                   クラックした passwords の表示

クラックしたパスワードを分かりやすいかたちで表示する。パスワードファイルを指定しなければいけない。

       -test                   ベンチマーク テスト

クリティカルルーチンのパフォーマンスをテストし、異なるアカウントとソルトのクラッキングスピードの計算表を表示する。

パスワードクラッカーの内部をよく知らない人のために:

xform1()とxform2()は実際の暗号ルーチンだ。
各 key/saltのペアに対して呼ばれる。setkey()
はそれぞれの単語に対して呼ばれる。xform1() や
xform2() (クラッキングモードによる)は十分な
ソルトがロードされていれば、クラッキングスピードに
影響するルーチンであることを意味する。
ところで、setkey()は xform2()を使うときは、単語の
長さが1つ違う、1文字以上置き換わるとき、
xform1()を使う時はパスワードが8文字で全部違う
(ぜんぜんマッチしない)としている。
MD5ベースのパスワードファイルでは、md5crypt() が
すべての他のルーチンの代わりに使われる。
       -users:<login|uid>[,..]   指定したユーザー(複数可能)のみクラックする

クラックや -show(表示)ではフィルターをかけることができる。

       -shells:[!][,..]   この shell(s) のアカウントのみクラックする

このオプションは必要なshellのみクラックしたり表示するのに有効だ。また、不要シェルアカウントをクラックしなかったり、表示しないときにも使う。 (シェルの前の!は否定を意味する)シェル名のパスを省略する事ができる。 -shells:cshは /bin/cshと /user/bin/cshの両方にマッチする。
-shells:/bin/cshは/bin/cshにのみマッチする。

       -salts:[!]<count>       少なくともとも<count>アカウントのみソルトをクラ
ック

この機能はパフォーマンスを向上させる事がある。例えば、-salts:2を使い早くクラックし、その後 -salts:!2でクラックするとする。トータル時間はほぼ同じだが、いくつかのアカウントを早くクラックできる。残りは必要ないかもしれない。

       -lamesalts              ソルトがクリアテキストパスワードとみなす

この働きを理解していなければ、このオプションを使ってはいけない。

       -timeout:<time>         <time> 分後にセッションを中止する。

これは決められた時間が経過するとjohnを終了する。

       -list                   単語をリストする

クラック中の単語をstdoutに表示する。これはクラッキングモードをカスタム化したときに、正確に動いているか確認する時に有効だ。

       -beep -quiet            パスワードが見つかったときに 
                               beep を鳴らす、鳴らさない

デフォルトは ~/john.iniで決まる。

       -noname -nohash     ログインネームとハッシュテーブルにメモリを使わない

十分なRAMがなければ必要になる。-nonameはシングルクラックモードでは働かない。
シングルクラックモードではログインネームがクラック中に使われる。

       -des -md5               DES あるいは MD5 モード

この2つのオプションは検出された暗号方法をオーバーライドする。
Johnは同時に異なる暗号方法でパスワードをクラックすることはできない。

付属 ユーティリティ
----------------------
これらは johnに似合った便利なものだ。

       xtract [source] [> <target>]

テキストファイルから(あるいは stdin)単語を抜き出す。辞書として使える。重複は取り除かれない。
'sotr -u'(in UNIX)を使う必要がある。

       unshadow <passwd> <shadow> [> <target>]

passwdファイルとshadowファイルを結合する。(すでに両方とも持っていれば) もしshadowファイルだけなら、シングルクラックモードで使うGECOSが無いし、 -shellオプションも使えない。

クラッキング・モード


ここでは基本的なことを簡単に説明する。詳しくは下の"Customizing"を参照。

辞書モード
---------------
これは Johnがサポートしているもっとも単純なクラッキングモードだ。辞書とパスワードファイルを指定するだけでよい。(辞書はテキストファイルで1行に1つの単語)これにルール(単語を変化させる)を適用することもできる。ルールはリストのすべての単語に適用される。

辞書にある単語は重複してはいけない。Johnは多くのRAMを使わないように単語をソートしない。それにはメモリーに全部の単語をロードしなくてはならない。クラッキング中にディスクから読み込む。単語の順序は気にしなくてよい。頻度の高い単語を最初に置いてよい。しかし合理的な順序に並べないなら、アルファベット順にソートしたほうがよい。(トライする単語が、前の単語と少し違うだけなら Johnは少し速くなる。特に少しのアカウントを一度にクラックするときには顕著になる)

しかし、単語が8文字以上でも気にしなくてよい。最初の8文字が同じで実際には同じパスワードだとしても。Johnはこの状況をうまく処理する。(一度だけトライする)そのような単語は即座に次に移る。辞書を8文字に切りつめないほうがよい。なぜなら、ルールを適用する時に残りの部分が必要かもしれない。

シングルクラック・モード
--------------------------
まず最初にクラックを始めるモードだ。パスワードとして login/GECOS情報を使う。この情報はそのアカウントに対してのみ使う。(そして同じsaltのアカウントにも。ほとんど余分な時間はかからない)そのためシングルクラックモードは辞書モードよりはるかに速い。そしてたくさんのルール(rules)を適用する。

同時にたくさんのパスワードファイルをこのモードで走らせると、ファイルを分けて走らせるより多くのアカウントをクラックすることがある。

すべてのルールを適用しないで走らせるのも良いアイデアだ。タイムアウトを設定し、他のモードへ移る。この場合ルールは成功率の高い順にソートしておくべきだ。

Cracker Jackのユーザーは、johnのシングルクラックモードがJackとまったく違うことに注意しなければならない。johnはビルトインされたルールをサポートしているので、特別な辞書は必要ない。

インクリメンタル モード
--------------------------
これは最もパワフルなモードだ。パスワードとして全ての可能性を試す。しかし、このモードをクラックに使うとその組み合わせの多さにより、終了しない。 (実際には、パスワードの文字数を制限したり、小さな文字セットを使うと終わるだろう) 限られた時間でできるだけ多くのパスワードをゲットするために、このモードは文字頻度テーブルを処理する。このモードを使うにはモードのパラメーターを定義しなければならない。(パスワードの長さ制限と文字セット) このパラメーターは John.iniの [Incremental:<mode>]セクションで定義する。ここで <mode>はモードの識別子だ。 (モードは Johnのコマンドラインで指定する)インクリメンタルモードでは、あらかじめ決められた定義を使う事も、カスタム定義を使う事もできる。

一度定義すれば、インクリメンタルモードとモードの識別子、パスワードファイルをコマンドラインで指定すればよい。

イクスターナル モード
--------------------------
Johnでは外部クラッキングモードを設定できる。これは ~/john.iniの [List.External:<mode>]と呼ばれるセクションで定義できる。 <mode>は識別子を割り当てる。このセクションには John がトライする単語を作り出す機能がある。これらの機能はCのサブセットでコーディングされる。 John のスタートアップ時にコンパイルされる。(コマンドラインで指定していれば)
カスタマイズ


John the Ripper はコンフィグレーション・ファイル(john.ini)を編集して動作をカスタマイズできる。コマンドラインのデフォルトオプション、コマンドラインでは指定できない、いくつかのオプションを指定できる。インクリメンタルモードのパラメーター、辞書とシングルクラックモードに適用するルール、それに新しいクラッキングモードの定義。

コンフィグレーションファイルはいくつかのセクションを含む。それぞれのセクションは、かぎ括弧内に名前を含む行から始まる。セクションは変数の割り当て( 形式は 'variable = value')あるいは特別のセクションタイプ(そのようなセクション名は 'list.'で始まる)の定義からなる。セクションと変数名は大文字と小文字を区別しない。(not case sensitive) '#'や';'で始まる行と空行は無視される。これはコメントや完全に消したくない行をコメントアウトするのに使われる。

一般的な オプション
--------------------------
コマンドライン・オプションのデフォルトは[Defaults]で定義される。次の変数を定義できる。

Wordfile   辞書ファイルをセット。これは 辞書モードをデフォルトにする。
           このデフォルトをオーバーライドしないなら、コマンドラインで
           -wordfileを使う必要はない。

Timeout    値は分でセットする。デフォルトですべてのモードのタイムアウトを
           有効にする。

Beep       'Y'と'N'でパスワードが見つかったとき、あるいは見つからなかったと
           きにビープを鳴らすかセットする。コマンドラインのオプション -beep
           -quiet でデフォルトはオーバーライドされる。この変数を省略すると
           デフォルトは鳴らさないとなる。

ほかのオプションは[Options]セクションで定義される。

Realtime   'Y'にセットすると経過時間を「秒」(Jackのような)のかわりに
            D:HH:MM:SS で表示する。

Percent    'Y'にセットすると、進行状況を表示する。

インクリメンタル モード のパラメーター
----------------------------------------
インクリメンタルモードのパラメーターを定義するには [Incremental:<mode>]と呼ばれるセクションを作る。<mode>はモードを割り当てる識別子だ。デフォルトのコンフィグレーションファイルでは、すでに定義されている。これをテンプレートとして使える。次のパラメーターをサポートしている。

CharCount  John に早い時期に長いパスワードにトライさせるために、文字セットを
           制限する。
           CharCountより少ない外部文字セットを使う時、指定したサイズに拡張
           するためにも使える。デフォルトではすべての指定された文字セットを
           使う。(パラメーターが指定されていないとき)

MinLen     パスワードの長さ(ミニマム)    デフォルトは1

MaxLen     パスワードの長さ(マキシマム)  デフォルトは8

Wordlike   'Y'にセットするとシンプルなビルトイン・ワードフィルターを使う。
           (1列に1つ以上の母音、2つ以上母音以外の単語はフィルターアウト)

File       外部の文字セットファイル名。(フルパスで指定しなければ ~ からロードする)
           このパラメーターをセットすると、コンフィグレーションファイルの定義は
           無効になる。

CharsetNM  NとM は数字 1 <= N <= 8, 1 <= M <= N  パスワード長 N,文字位置 M
の
           文字セットを定義。文字セットの順序は重要だ。頻度の高い文字を最初に
           置く。文字セットは同じサイズでなくてよい。

辞書のルール
----------------
辞書とシングルクラック・モードのルールはそれぞれ [List.Rules:Wordlist] と [List.Rules:Single]と呼ばれるセクションで別々に定義される。
私は Alec Muffettによる拡張クラック構文(extended Crack syntax)を採用した。多くの人はすでに慣れているだろう。私はさらに、いくつかのルールとプリプロセッサ(重要)を加えた。それは1行のソースから複数のルールを作り出す。ルールを定義する時は1つのルールを1行に書く。(プリプロセッサのコマンドでもよい) それぞれのルールは1つ以上のコマンドからなる。次のコマンドをサポートしている。

(ほとんどの記述は Crackの dicts.rulesのコピーだ。
しかし、コードは自分で書いた。それは Crackより速い)
Ordinary commands:
:        no-op - 入力に何もしない
<n      文字数が < n なら拒否する。n = 0-9
>n      文字数が > n なら拒否する。n = 0-9
^x      'x' を前に置く
$y      文字 'y' を付け加える
l       小文字に変換
u       大文字に変換
c       キャピタライズ(captarize:訳注:fred→Fred)
r       リバース : "Fred" -> "derF"
d       繰り返し : "Fred" -> "FredFred"
f       折り返し : "Fred" -> "FredderF"
p       小文字の複数形を作る
onx     n番目( 0から始まる)の文字を 'x' に変える
inx     文字 'x' を n 番目( 0から始まる ) に挿入する
        もし、 n > strlen(input)なら、文字 'x' を加える
xnm     n番目( 0から始まる)から文字 m まで引き抜く


キャラクタークラスに使われるコマンド
Commands which may use character classes:

sxy     文字 'x' を 'y'に置き換える
s?cy    'c'クラス(訳注:下記)の文字を 'y'に置き換える
@x      単語から 'x' を取り去る
@?c     単語から 'c'クラスを取り去る
!y      'y'を含む単語を拒否する
!?c     文字クラス 'c'を含む単語を拒否する
/x      文字 'x'が含まれていなければ拒否する
/?c     文字クラス 'c'が含まれていなければ拒否する
=nx     n番目の文字が 'x'でなければ拒否する
=n?c    n番目の文字クラスが 'c'でなければ拒否する
        nb: 単語は position 0から始まる

上記コマンドに使うキャラクター クラス

??      '?' にマッチ
?v      母音( vowels : "aeiouAEIOU" )にマッチ
?c      子音( consonants:"bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ")にマッチ
?w      ホワイトスペース(whitespace: " \t")にマッチ
?p      句読点( punctuation: ".,:;'\"?!`" )にマッチ
?s      シンボル( symbols "$%^&*()-_+=|\\<>[]{}#@/~" )にマッチ
?l      小文字 ('a' to 'z')にマッチ
?u      大文字 ('A' to 'Z')にマッチ
?d      数字 digits ('0' to '9')にマッチ
?a      文字 ('a' to 'z' and 'A' to 'Z')にマッチ
?x      文字と数字 ('a' to 'z', 'A' to 'Z' and '0' to '9')にマッチ

大文字はそのクラスの否定(complement)をあらわす。
例えば   ?d == 数字( DIGITS )   ?D == 数字ではない( NON-DIGITS ) など。

上記のコマンドは Crack v4.1 と同じだ。次は、johnで追加された。
(有効でないかもしれない。必要なほとんどの事はすでに Crack v4.1で実現している)

{       文字を左シフト: "jsmith" -> "smithj", etc
}       文字を右シフト: "smithj" -> "jsmith", etc
Dn      n 文字目をデリートし残りを左にシフト(0 から start)
P       "crack" -> "cracked", etc (小文字のみ)
G       "crack" -> "cracking", etc (小文字のみ)
~i      キーボードの大文字小文字(Case)を変換: "Crack96" -> "cRACK(^", etc 
        (訳注:siftキーの on/off)
~I      大文字小文字の変換: "Crack96" -> "cRACK96", etc
~v      母音のみ小文字に変換: "Crack96" -> "CRaCK96", etc
~>      文字をキーボードの右に変換: "Crack96" -> "Vtsvl07", etc
~<      文字をキーボードの左に変換: "Crack96" -> "Xeaxj85", etc

単語のペアをサポートする特別なシングルクラックモードをサポートした。
コマンドを最初に、次に、そして両方の単語に適用するようコントロールする。

1       最初の単語のみ
2       次の単語のみ
+       両方を結合する( '1' か '2'のあとに使われる)

上記のコマンドをルールで使うと、単語のペアを作るだけだ。(GECOSからのフルネーム) そして1つの単語は拒否する。

マニュアルで指定しなければ '+'はルールの終わりと見なされる。例えば 1l2uは最初を小文字に次を大文字に変換し、両方を結合する。+ は他のコマンドにも適用できる。 1i2u+r はコマンドを適用したあとに両方を結合し反転(reverse)する。

Crack v5.0 は私が Johnがサポートするルールをコーディングしたときには発表されていなかった。そこで独自の拡張をおこなった。

新しい Crack v5.0のルールは余計であるように思える。あるいは私がすでに John に加えたものと似ている。( [ == D0, ] == rD0r,C == c~I, t == ~I, (x == =0x, ) x == r=0xr, 'n == x0n )残されたルールは %nx や %n?c だ。(少なくとも nインスタンスの文字 'x' あるいはクラス'c'のメンバーが含まれていなければ 、その単語を拒否する)とにかく私はコンパチビリティを理由に Johnに加えた。プレフィックス [ と ] は \を使うことに注意。これらはプリプロセッサのコントロール文字だ。

ルールが単語を変化させないなら、ルール全体が ':'でなければその単語は拒否される。

プリプロセッサは一つのソースラインにルールを結合するためにも使われる。例えば、Johnに小文字で数字がついた単語をトライさせたいとき、数字ごとに10種類のルールを書くこともできる。2桁の数字だとしたら--コンフィグレーションファイルは巨大に、そして醜くなる。

プリプロセッサでこれらのことを簡単にできる。これらのルールの共通部分を含むソースラインを書けばよい。そしてかぎ括弧の中に別のルールを使う文字セットのリストを書く。(正規表現が使える)
プリプロセッサが Johnのスタートアップ時にルールを作り出す。例えば上の例では、ソースラインが 'l$[0-9]' (小文字に数字を加える) と 'l$[0-9]$[0-9]'(小文字に2桁の数字を加える)となる。これらのソースラインはそれぞれ 10と100のルールに展開される。ところでプリプロセッサのコマンドは、右から左に処理される。文字は左から右に処理される。2桁の数字を加える上の例ではこうして数字が普通の順序で処理される。例では文字の範囲しか使わなかったが、文字リストも使える。 '[aeiou]'は母音(vowels)を使う。'[aeiou0-9]'は母音と数字を使う。

ルールにはいくつかのコントロール文字がある。( [ はプリプロセッサの文字リストを始める。- はリスト内で範囲をマークする、など )文字に特別な意味を持たせたくないときは文字の前に \ を置く。もちろん \ 自身にも使う。もしプリプロセッサの文字リストを行の先頭から始めたいなら、':'を置く。そうすると新しいセクションの始まりと見なされる。

イクスターナル モードの定義
------------------------------
イクスターナル・クラッキングモードを定義するには、[List.External:<mode>]と呼ばれるセクションを作る。<mode>はモードの識別子に使う。
セッションはC言語のサブセットで書かれた関数を含む。Johnはコマンドラインでこのモードを有効にすると、これをコンパイルして使う。コンパイラーはインタープリタコードか実行コードに変換される仮想マシンコード(Vertual machine code) を生成する。(これは現在 x86ハードウェアのみで行われる)

次の関数は現在 Johnで使っている。

init()       startup で呼ばれる。グローバル変数を初期化する。
filter()    トライするワードごとに呼ばれる。ワードをフィルターアウトする。
generate()  単語のジェネレートで呼ばれる。
restore()   中断されたセッションのリストアで呼ばれる。

これらは引数なし(no argument)で void 型だ。init() 以外はグローバル変数 'word' を使う。(これは int word[16] と定義されている) init()は word を初期化する前に呼ばれる。word には現在トライしている単語が ASCIIZで格納される。 filter()は変更できる。あるいは word[0]を0にするとするとスキップする。 generate()は呼ばれた時にトライする次の単語を置く。クラッキングが終わると word[0]が0になる。restore()は与えられた word からグローバル変数をセットする。

イクスターナルモードは他のクラッキングモードと一緒に使うことができる。そのとき、init()とfilter()のみが使われる。(filter() は要求があれば ) イクスターナルフィルタは他のモードのコマンドライン・オプション -makechars とコンパチブルだ。

generate()と一緒にイクスターナルモードで、filter()を使ったり、多くの単語を filterにかけないことを勧める。generate()をフィルターアウトされる単語を生成しないように変更したほうがよい。

すでに述べたように、このコンパイラはCのサブセットをサポートしている。 Johnは Crackerでコンパイラではない。私はこれで十分だと思っている。次は Johnのコンパイラの概要だ。

- 基本的な関数のみサポートした。独自の拡張はできない。
- 'while' ループのみサポートしている
- 'int' と 'void' 型のみサポートしている
- 一次元配列のみサポートしている
- 構造体と共用体(structs/unions) はサポートしていない
- ポインタはサポートしていない (right, more about arrays below);
- 多分、ほかにも...

いくつかの機能はCとは違う。