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 は次のクラッキングモードをサポートする。

- 辞書:wordlistrulesの適用(有、無)
- シングルクラック:singlelogin /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とは違う。

  • - 配列名はその最初の要素([0])を参照する。配列のアドレスではない。
  • - '++' と '--' 演算子は使われたあとに実行される。これはCでもJohnのコンパイラでも同じだ 。( i = j++ は i = j; j = j + 1 と同じ)しかし演算子が1つの式で1回以上使われると結果は異 なる。( Johnのコンパイラでは i = j++ - j++ は i = j - (j + 1); j = j + 2; と扱われる。しかしCでは i = j-j; j= j + 2 となる。
  • - これ以上違いはないと思うのだが...

    パワフルなCの表現(すべての整数演算)、if/elseとwhileが使える。ほとんどの コーディングにはこれで十分だろう。

    イクスターナル・モードのサンプルはテンプレートとして、 Johnと一緒に供給 されるコンフィグレーションファイルにある。

    使用例

    これらの例は、どのようにjohnの機能を使うかのヒントになる。

    コマンドライン
    ----------------

    1. あなたがパスワードファイル 'passwd.1'を持っているとする。
       シングルクラック・モードから始めるのがよい。
       john -single passwd.1
    
    あるいは短縮したオプションで
       john -si passwd.1
    
    クラックするファイルは複数を指定できる。
       john -single passwd.1 passwd.2
    
    あるいは
       john -single passwd.*
    
    2. パスワードがクラックされたらカレントディレクトリ ~/john.pot にセーブされる。
       これを取り出すには、
       john -show passwd.1
    
    アカウントリストが大きくて、スクリーンに入りきらなければ出力をリダイレクトする。
       john -show passwd.1 | more
    
    多くのアカウントのシェルが無効かもしれない。johnにこれらを無視させることが
    できる。(/etc/expired と呼ばれる)
       john -show -shells:!/etc/expired passwd.1
    
    短縮形を使い、どの path にもマッチさせる
       john -show -shells:!expired passwd.1
    
    他のシェルも無視したいなら、/etc/newuser とすると
       john -show -shells:!expired,!newuser passwd.1
    
    クラックした root(uid 0) アカウントをチェックするには、
       john -show -users:0 passwd.1
    
    すべてのファイルのクラックした rootアカウントをチェックするには、
       john -show -users:0 passwd.*
    
    root(ログインが root)アカウントだけ表示する。
       john -show -users:root passwd.1
    
    3. シングルクラックモードで不足なら、もっとパワフルなモードを使う。
       例えば辞書モード。辞書ファイルが'words.lst'だったとすると、
    
       john -w:words.lst passwd.1
    
    あるいは rules を適用して (遅い。しかしパワフルだ)
    
       john -w:words.lst -rules passwd.1
    
    有効なシェルのみクラックするには、
    ( -shellsと -usersはすべてのクラッキングモードで働く)
    
       john -w:words.lst -rules -shells:sh,csh,tcsh,bash passwd.1
    
    ほかのクラッキングモード同様、一度にすべてのファイルをクラックした方が早い。
    
       john -w:words.lst -rules passwd.*
    
    いくつかのアカウントだけクラックすることができる。これはすべての root(uid 0)
    をトライする。
    
       john -w:words.lst -rules -users:0 passwd.*
    
    私はrootパスワードだけクラックすることは勧めない。
    それは通常、セキュリティホールをついてハックするより時間がかかる。(そして
    合理的な時間内では不可能だろう)自分のパスワードファイルがクラックできない事
    を確かめるなら、よい rootパスワードを選ぶ。そして残りをクラックしてみる。
    
    パスワードファイルを別々にクラックすることも有効だ。
    
       john -w:words.lst -rules -salts:2 passwd.*
       john -w:words.lst -rules -salts:!2 passwd.*
    
    これは2つかそれ以上のソルトで早くアカウントにトライする。
    それから残りをトライする。トータルのクラックタイムはほとんど同じだ。
    しかし、いくつかのアカウントを早くクラックできる。また、すべてのアカウントを
    小さな辞書でクラックしたり、大きな辞書で(-salts:2を使い)早くトライできる。
    -saltsを2より大きくするほうが良いことがある。(時には1000以上)
    値は状況により調整する。
    
    デフォルトの辞書ルールは 最初の行に':'を含んでいる。(これは単語をリストのまま
    トライすることを意味する)もし、すでにルールなしで辞書を走らせて同じ辞書でルール
    を適用しようとするなら、この行はコメントアウトしたほうがよい。
    
    4. もっともパワフルなモードは、インクリメンタルだ。単に走らせればよい。
    
       john -i passwd.1
    
    これはデフォルトのインクリメンタルモードのパラメーターを使う。それは John.ini
    の[Incremental:All]セクションにある。Johnとともに提供されるコンフィグレーション
    ファイルでは、これらのパラメーターは 95文字すべてを使い、可能性のあるすべての文
    字長さ(1〜8)をトライする。この方法が、無理のない時間内に終わる事を期待してはいけ
    ない。(すべてのパスワードが弱く、クラックされなければ)
    
    ほとんどの場合、他のプリ・デファイン インクリメンタルモード・パラメーターを使う
    か、限られた文字セットでシンプルなパスワードだけクラックするほうが速い。
    次のコマンドは'a'から'zzzzzzzz'までの 26の文字セットのみトライする。
    
       john -i:alpha passwd.1
    
    インクリメンタルモードで rootのアカウントのみ Johnの他の機能でクラックすること
    もできる。このコマンドはすべてのパスワードファイルのすべての root(uid 0)とそれ
    らにマッチするアカウントのみクラックする。少なくとも2倍のパフォーマンスがある。
    大量のパスワードファイル(1000くらい)がなければ、ソルトがマッチする rootは無いだろう。
    
       john -i -users:0 -salts:2 *.pwd
    
    5. すでにパスワードファイルの多くのアカウントをクラックしていたら、そのファイル
       から文字セットを作りたいと思うだろう。
    
       john -makechars:custom.chr passwd.1
    
    それから、インクリメンタルモードに新しいファイルを使う。
    
    同じ国のいくつかのパスワードファイルを持っていたら、それを文字セットファイルと
    して使うと有効だろう。その国のパスワードファイルのアカウントをもっとクラックで
    きるだろう。
    
       john -makechars:custom.chr passwd.1 passwd.2
       < ~/john.iniにカスタムモードの定義を追加 >
       john -i:custom passwd.3
    
    上の例では passwd.1 と passwd.2は同じ国のすでに多くのアカウントを持っている
    パスワードファイル、passwd.3 がクラックしたいファイルと仮定している。
    
    文字セットファイルを作る時にあらかじめ定義された、あるいはカスタム化した
    文字フィルターを使う事ができる。
    
       john -makechars:my_alpha.chr -external:filter_alpha passwd.1
    
    ~/john.potが充分大きければ(あるいはぜんぜん文字セットファイルがなければ)、
    新しい文字セットとして使いたいだろう。
    
       john -makechars:all.chr
       john -makechars:alpha.chr -external:filter_alpha
       john -makechars:digits.chr -external:filter_digits
    
    上の例では ~/john.potをベースにした文字セットファイルで(存在していれば)上書き
    される。(パスワードファイルを指定しなければ Johnはすべてのファイルを使う)
    ワードフィルターは Johnと一緒に供給される ~/john.iniで定義されている。
    
    コンフィグレーション ファイル
    -------------------------------

    1. あるパスワードファイルで多くのユーザーがログイン名に ?!を付け加えている ことに気がついたとしよう。そのときには新しいシングルクラックモードのルール を作る。それを最初に置く。
       [List.Rules:Single]
       $?$!
    
    ヒント:すべてのデフォルトルールを一時的にコメントアウトしたいなら、その
            セクションの名前を Johnが使っていない名前にリネームするだけでよい。
            そして前の名前で新しいルールを定義する。名前の list.部分は残す事。
            そうしなければ構文エラーになる。
    
    また辞書のルールにも、同じ事が適用できる。
    2. カスタム文字セット(下記)を生成するときも ~/john.iniのセクションでの定義が 必要になる。もっとも単純なケースは下のようになる。
    ( Custom は好きな名前をつけてよい)
       [Incremental:Custom]
       File = custom.chr
    
    これは文字セットを生成したファイルのみ Johnが使う。
    95文字すべてを使いたいなら、次の行を付け加える。
       CharCount = 95
    
    この行を加えると ファイルを生成中に 95文字(ASCIIコード 32 から 126)が見つから なくても展開するように Johnに伝える。 文字は a-z, A-Z, 1-9, 0,の順で加えられる。

    Johnにトライさせる文字セットを制限するには CharCountを使う。

       CharCount = 25
    
    文字セットファイルを作る時にフィルターを使わないなら、CharCountを低くセット するとまれな文字は使わなくなる。そして Johnに早いうちから複雑な長いパスワード をトライさせることになる。

    John にある長さのパスワードだけトライさせるには、次を使う。

       MinLen = 6
       MaxLen = 8
    
    パスワードを手に入れたマシンで短いパスワードが許可されていないのなら、MinLenを 大きくしたほうが合理的だ。(しかし root はどのユーザーにもどんなパスワードでも セットできる)

    逆にパスワードが短いとおもったら、MaxLenを小さくセットする。

    多くのパスワードが単純だと思ったら、ビルトインフィルタを使いアルファベット の文字セットを使うことも有効だ。

       [Incremental:Wordlike]
       CharCount = 26
       MinLen = 3
       Wordlike = Yeah
       File = alpha.chr
    
    3. 4Mb以下の RAMしかインストールされていないマシンでJohnを使うとき、もっと 小さい文字セットにする必要があるかもしれない。-makecharsは(速く動作させるため) 展開に多くのメモリーを要求する。大量のパスワードファイルをロードさせた時にも 十分なメモリーが残らないため、必要になるだろう。 あるいは少ない(あるいは1つ) ソルトでクラッキングするとき、少し速くJohnを走らせたいときにも。

    これは、少しだけ文字を変更して、できる限り前の単語と似た形で John が利用する からだ。 外部の大きな文字セットファイルを使う時には、~/john.ini内部の小さな文字セット を使う時と違う順序でトライする。また、トライする単語にも違いが大ある。 大きな文字セットは展開に余分な時間がかかる。しかし c/sの値が少しあがっても それは早くパスワードがクラックできるという意味ではない。大きな文字セットを 使う時にはトライする順番のほうが重要だ。小さな文字セットのみ使うことも賢い。 他に方法がなければ、とにかくすべての文字の組み合わせをトライすることになる だろうから。

    私は故意に小さな文字セットを john.iniの中に残した。File = の行をコメントアウト するとこの小さな文字セットが使われる。

    4. もう一つの小さな文字セットの使い方は、特別な場合マニュアルで定義する。 例えば、ユーザーがパスワードに1を加えることを知っていたら、

       [Incremental:Suffix1]
       MinLen = 6
       MaxLen = 6
       Charset61 = abcdefghijklmnopqrstuvwxyz
       Charset62 = abcdefghijklmnopqrstuvwxyz
       Charset63 = abcdefghijklmnopqrstuvwxyz
       Charset64 = abcdefghijklmnopqrstuvwxyz
       Charset65 = abcdefghijklmnopqrstuvwxyz
       Charset66 = 1
    
    もちろん同じ事を違う長さでもできる。文字を頻度によりソートすることは賢い。 もし怠け者でこれをしないなら、単にインクリメンタルモードで定義されている文字 セットを持ってくる。例えば、上の例のようにデフォルトの [Incremental:Alpha]で 定義されている Charset51 から 55を Charset61 から 65に持ってくれば5文字が アルファベットで最後に1を持つ 6文字のパスワードの頻度を計算したものと ほとんど同じものが完成する。

    5. 同じ事をイクスターナル・ワード・フィルタをコーディングしてもできる

       [List.External:Filter1]
       void filter() {
         int i;
    
         i = 0;
         while (word[i] && word[i] >= 'a' && word[i] <= 'z') i++;
         if (word[i] != '1' || word[i + 1]) word = 0;
       }
    
    このフィルタはいくつかのアルファベットと最後の1を取り去る。 これを他のクラッキングモードでも使える。しかし、多くの単語がフィルターアウト されるので遅くなる。これを文字セットの生成に使う方が良い。

    何らかの理由で頻度テーブルを使わないなら、新しいイクスターナルモードを コーディングして、同じ事ができる。

       [List.External:Suffix1]
       int len, current[9];
    
       void init() {
         int i;
    
         current[len = 6] = 0; current[i = len - 1] = '1';
         while (i--) current[i] = 'a';
       }
    
       void generate() {
         int i;
    
         i = len + 1;
         while (i--) word[i] = current[i];
    
         i = len - 2;
         while (++current[i] > 'z')
         if (i) current[i--] = 'a'; else current = -1;
       }
    
       void restore() {
         int i;
    
         i = len + 1;
         while (i--) current[i] = word[i];
       }
    
    

    F.A.Q.

    Q: なぜ "John"?
    A: 別にいいじゃない( Why not? )

    Q: なぜ "the Ripper"?
    A: これは Lost Soul のアイデアだ。彼に聞いてくれ( Ask him.)

    Q: John the Ripper は Cracker Jackより優れているか ?
    A: 私はそう思う。johnは Cracker Jackのすべての機能をサポートしている。
    また、john はjackより Pentiumではかなり、486では少し速い。

    Q: John the Ripper は Crack より優れているか ?
    A: それは自分で決めることだ。Johnは速く、さらにいくつかの機能がついている。
    しかし Crackも確かに良い。

    Q: なぜ John は古い386 では速く走らないか ?
    A: Johnは486以降で最適化(optimize)している。別の386バージョンをコーディング
    するのは、おそらく時間の無駄だろう。もし、386マシンしか持っていなかったら
    インターネット上のどこかの速いマシンでJohnを走らせた方がよい。

    Q: Pentium の最適化バージョンは ?
    A: John はすでにペンティアムでも最適化されている。

    Q: John の crypt() ルーチンが正しいか確かめる方法は ?
    A: John は実行中、常に自分自身でテストしている。エラーが起これば通知する。

    Q: John の "single crack" モードの使い方は ? 辞書を使っていないようだが。
    A: そのとうり。Cracker Jackのシングルモードとは違う。RTFM.

        (訳注:Read The Fucking Manual:マニュアルを読め!)
    Q: なぜ シングルモードを Jackのように改良しないのか ?
    A: Jackのシングルクラックモードはよくない。なぜこんな質問があるのだろう。
    たぶんJackのモードのほうが、もっと複雑に見えるのだろう。

    Q: Windows 95 で走る Jack の JPP.EXE の替わりはあるか ?
    A: それは必要ない。"カスタム化"のセクションをもう一度読め。辞書のルールを。
    私はまた、確信を持って Windows95を使わないことを奨める。

    Q: クラックしたパスワードの見かたは ? Cracker Jackには Jackpot.exeがあった。
    A: Johnのコマンドラインで -showオプションを使う。

    Q: なぜ Johnは私のパスワードファイルをロードしないのか ?
    'Loaded 0 passwords'と表示されるだけだが。
    A: そのパスワードファイルはたぶんシャドウ化されている。パスワードとシャドウ
    ファイル両方が必要だ。それからそれらを結合する。もし、そのパスワードファイル
    のフォーマットを Johnがサポートしていなければ、同じメッセージがでる。

    Q: どうやって unshadowするか ?
    A: これはおそらく root権限なしにshadowファイルが手に入るかという意味だろう。
    普通は rootでなければだめだ。いろいろなトリックや rootハックの方法を書くわ
    けにはいかない。それはこの FAQの目的と違う。

    Q: なぜ Johnはインクリメンタルモードで進行状況を表示しないか ?
    A: いつも 0% の表示を本当に見たいか ? もう一度インクリメンタルモードを記述した
    部分を読む必要がある

    Q: なぜ Johnは本当の crypt() /秒 を表わしていない無意味な c/sを表示するのか ?
    A: Johnではこの値は コンビネーション(ログインとパスワード) /秒を表わしている。
    crypt()/秒ではない。暗号のベンチマークを行いたいなら、-testオプションを使う。
    クラッキング中の c/sは意味がないわけではない。特定のパスワードファイルに対
    する実際のクラッキングスピードを表わしている。-saltsオプションを使うときには
    値を調整するのに役立つ。

    Q: インクリメンタルモードでは他のモードより c/sが小さい事に気がついた。
    John v1.0よりも少ない。なぜ ?
    A: たぶん、数分 Johnを走らせただけだろう。新しいインクリメンタルモードの実行
    には大きな文字セットを使う。これは Johnが違う長さのパスワードにスイッチす
    るたびに文字セットを展開させる必要がある。長さのスイッチには時間がかかる。
    それで c/sが下がる。幸いな事にこれは Johnがスタートしたときに顕著だ。
    すでに何時間もクラックを続けていれば新しいパスワードの長さにスイッチするこ
    とはめったにない。これはより良い順番でトライするためには無駄ではないと思う。
    とにかくこの新しい方法が嫌いなら、大きな文字セットを無効にできる。
    ( john.iniの File = がある行をコメントアウトする)

    Q: John は並列処理をサポートしているか ?
    A: 私はその目的のためにネットワーク管理のインクリメンタルモードだけのクラッカ ーを
    分けた。Johnは真の並行処理はサポートしていない。
    しかし、最初のマシンで'a'から始まるパスワードだけクラックするよう文字セットを
    カスタマイズすることもできる。
    また、インクリメンタルモード以外で外部ワードフィルタを使い、似たようなことができる。
    (もし2台のマシンがあれば、すべての単語をフィルターするようなことで、グローバルワードカ ウンタを使い達成できる)

    Q: Johnで供給されているデフォルトの文字セット(~/john.ini と*.chr files)は
    何をベースにしているのか ?
    A: 私は世界中の異なるマシンの 65,000以上の実際のパスワードリストを使った。
    これらのパスワードをセットしてくれたユーザーに感謝している。

    Q: どこで辞書が手に入るか ?
    A: ftp://sable.ox.ac.uk/pub/wordlists で見つかるだろう。

    Q: どうやって作者とコンタクトするか ?
    A: このドキュメントの最後にある。

    参 照
    John の開発で他のパスワードクラッカーからいくつかのアイデアをもらった。

    - Crack by Alec Muffett --
        辞書のルールの構文
    - Cracker Jack by Jackal --
        ユーザーインターフェース
    - Star Cracker by The SOrCErEr --
        有効なたくさんの文字セットを与えてくれた
    
    crypt()ルーチンは Alec Muffettによる Crack v4.1を基本にした。いくつかの イニシャライズ・ルーチンは変更せずに使っているが、残りは私のアイデアや他 の crypt()でコーディングしなおした。(実際には #ifdefでいくつかの違うアル ゴリズムをサポートしている)

    x86 assembly バージョンの基本は Roman Rusakov の crypt()による。
    彼の最適化のヒントは、有効だった。

    DOS バージョンは DJGPP v2 by DJ Delorie with GCC 2.7.2 でコンパイルした。 (http://www.delorie.com) Charles W Sandmann の DPMI サーバーは、 (sandmann@clio.rice.edu; 1206 Braelinn, Sugar Land, TX 77479) ソースコードは、
    ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2misc/csdpmi3s.zip.
    Win32バージョンのコンパイルに Cygnus Developer's Kit (http://www.cygnus.com/gnu-win32) を使った。

    作者への連絡 ?
    メール solar@ideal.ru あるいは 2:5020/398.9,
    EFnet IRC で nick は Solar_Diz

    このファイルを全部読むまで(もしクラックをよく知らなければ、一般的なパスワード クラックのFAQを読むまで)私に質問しないでほしい。また、私にパスワードファイル を送らないでほしい。私は「クラックサービス屋」ではない。

    署名
    Solar Designer


    MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
    //日本語訳: 1997/06/21 by TamTam passwd-Project : Copyleft 1997 MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM