john the ripper メモ

## 動機&注意
いつもなんとなく使っている節があったので調べた。
間違っている部分があるかもしれないです。
マジでメモ書きなのでわかりにくい部分があるかも。

## john the ripper
bruteforcerの一種。実行するとbruteforceが行われる。
実行にはいくつかのモードがあり、オプションで指定することで攻撃方法を変えることができる。
最も単純な実行方法は以下の通り

```
$ john {mypassword}
```

このようにして実行した場合は、Single cracking -> Wordlist -> Incrementalの順で実行されることになる。
Wordlistに関しては```/etc/john/john.conf```内の```Wordlist=...```で指定されているのでデフォルトで使用されるwordlistを変更したい場合はそこを変える。
関連URL:https://www.openwall.com/wordlists/

### 結果の参照
攻撃の結果は```~/.john/john.pot```に保存され、以下のコマンドで結果を参照できる。

```
$ john -show {mypassword} 
```

### 絞り込み
-shells、-users、-groupsを使うことで表示/処理対象の絞り込みを行える

```
$ john (-show) -shells=(-){shell} {mypassword,...}
$ john (-show) -users=(-){uid or username,...} {mypassword}
$ john (-show) -groups=(-){gid or groupname,...} {mypassword}
```
引数の前にマイナスを付与することで否定条件による絞り込みも可能。


### セッションの管理
bruteforceは長時間に及ぶ処理がなされることがあるため基本的にはバックグラウンドで実行されるのが望ましい。

#### 複数のインスタンス
johnを複数管理したい場合、それぞれのセッションに対して名前をつけることが可能。
そうすることで複数のインスタンスを立ち上げて競合するということを防ぐことができる。

```
$ john -session={sessionname} ....&  # インスタンスの立ち上げ
$ john -status={sessionname}         # セッションのステータスの確認
$ john -restore={sessionname}        # 中断したセッションの再開
```

#### 中断および再開
実行中にセッションを中断することもでき、中断した場合は中間の結果が```~/.john/john.rec```に保存される。
中断を行わなくても、10分ごとに中間結果を保存しているためクラッシュした場合でもセッションの再開が可能。
```john.conf```で保存間隔を設定することも可能。
以下のコマンドで再開できる。

```
$ john -restore
```

### リストの生成
パフォーマンスが出ない代わりに容量があるマシンで攻撃を行う場合、ルールの適用を先にやってユニーク化した後に生成されたリストを使って攻撃するのもあり。

```
$ john -wordlist:{wordlist} -rules -stdout:{length} | unique mangle.lst
$ john -wordlist:mangle.lst {mypasswd}
```
-stdoutを使うことでルールの適応で生成された候補を標準出力に表示する。
またlengthを指定してやることでパスワードの候補の最大長を指定することも可能。

### charsetの作成
すでにあるパスワードファイルが解析されていて、なおかつ使われている文字が普通では無い場合、文字の頻度に基づいて他のパスワードファイルの解析に使用するcharsetを作ることができる。パスワードプロファイリング？に使えそう。
特定の国、特定の組織のパスワードからcharsetを作ると良い。

```
$ john -make-charset:custom.chr {mypasswd}
```
potファイルが十分大きくなったら```makechr```を使用してcharsetを作ることも可能。

### mode
#### Wordlist
一行一パスワードのwordlistファイルを使ったモード。

* それぞれの行に対してruleが適用され、一行のパスワードに対して複数の候補が試される

* 実行時にワードリストのソートは行われない。
    * ソートは多くのリソースを消費する
    * 定義した順で攻撃が行われない
    * 理になかった順番で定義されていない限りは基本的にはアルファベット順で定義されるべき
        * なぜなら、ハッシュタイプによっては速度が上がることがあるため
        * また、文字列の最大長が決まっているようなハッシュタイプを攻撃する場合は先頭から最大長までの文字列をハッシュ化するためアルファベット順に並んでいる場合無駄な実行がされなくなる（ただしruleによって異なる候補が生成される可能性があるため前のパスワードと先頭から最大長までの文字が一致しているパスワードがあったとしても削除しないほうが良い）

##### Single crack
ログインネーム、GECOS（パスワードファイルのコメント部分。慣習的に名前、オフィスの電話番号などが記録される）のフルネーム、ユーザのホームディレクトリ名に対してルールを適用し攻撃するモード。

* パスワードに対応した情報のみをルールの適用対象として使用するので高速。
    * 高速に動作するため、Wordlistモードよりも多くのルールの適用が可能。
* ユーザが同じパスワードを持っている場合を想定しており、攻撃に成功したパスワードはロードされた全てのパスワードハッシュに対する攻撃材料として利用される。
    * そのため、それぞれ個別にパスワードファイルを解析にかけるより複数同時に解析にかけたほうが攻撃の成功確率が上がる
 
```実行例
$ john -single {passwd1} {passwd2}
$ john -single *.pwd
```

#### Incremental
全ての可能な文字の組み合わせを試行するモード。

* パスワードの最大長、使用されているcharsetの指定が必要。
* Incrementalモードはpre-definedのものとカスタムしたものがある。
    * 設定ファイルの[Incremental:{MODE}]というセクションに設定が記載され、コマンドラインで実行時にMODEを指定すると該当のモードでIncrementalモードが実行される。

#### External
外部関数を利用するモード。```init```, ```filter```, ```generate```, ```restore```が使用・定義可能で解析を行うにあたってオプション+引数(定義名)でカスタムした動作をさせることが可能。
関連URL: https://www.openwall.com/john/doc/EXTERNAL.shtml

参考URL
https://www.openwall.com/john/doc/EXAMPLES.shtml
https://www.openwall.com/john/doc/MODES.shtml