Skip to content

John the Ripper

基本の使い方

Terminal window
$ john <FILENAME> --format=<FORMAT> --wordlist=<DICIONARY>

unshadow

/etc/passwd/etc/shadowのどちらも入手できる場合はunshadowで2つのファイルを結合したものに対してJohnを実行できる。

Terminal window
$ unshadow passwd.txt shadow.txt > unshadow.txt
$ john unshadow.txt --wordlist=<DICIONARY>

Rule Based Attack

Intro

TryHackMeのCrack The Hash Level 2でJohnのRule Based Attackを使う機会があったのでまとめる。

基本的にJohn the RipperやHashcatなどパスワードクラッキングに使用されるツールでは、パスワードに使用されることが多い単語がリスト化されたもの(いわゆる「辞書」)を利用するが、たいていは辞書にそのまま載っているパスワードは当たらない。なので次にどんな単語を用意しようと考えたときに、辞書に記載されている単語に数字を足してみたり、大文字・小文字変換をしてみたり、Leet表記を使用してみたりと、辞書の単語に一定のルールをもって変換を加える。

しかしながらディスクスペースを圧迫してしまうことや汎用性の観点から、辞書内の単語をルールで変換して生成した大量の単語を静的なファイルとして用意するのはよろしくない。そこで辞書内の単語を一定の規則で変化させるルールを、JohnやHashcat実行時に与えることができる。

JohnでRule Based Attackを使用する際には、以下のように--rulesオプションを与える。

Terminal window
$ john <FILENAME> --format=<FORMAT> --wordlist=<DICIONARY> --rules=<RULENAME>

ここに登場するRULENAMEは自身でJohnの設定ファイルに定義したルールの名称。

ルールを作成する

Johnの設定ファイルを編集して、外部の設定ファイルをIncludeすることができる。

Terminal window
$ vim /etc/john/john.conf
...
.include '/path/to/your/conf'
...

ルールの本体を書く。以下でルールの例を記載しているが、cは先頭だけ大文字にするコマンド、uはすべて大文字にするコマンド、lはすべて小文字にするコマンド。コマンドの一覧はこのあとの「ルールに使用できるコマンド一覧」を参照すること。

Terminal window
$ vim /path/to/your/conf
...
[List.Rules:RULENAME1] <- ここのルール名をコマンドの--rulesオプションに指定する
c
[List.Rules:RULENAME2]
u
[List.Rules:RULENAME3]
l
...

ひとつのルールの中に複数のコマンドを使用することができるが、改行を入れたパターンと入れないパターンでは生成される単語のリストが異なる点に注意。

Terminal window
$ vim /path/to/your/conf
...
[List.Rules:command_for_eachline]
# 各行に分けて書く
c
l
u
[List.Rules:command_in_oneline]
# 1行で書く
clu
...
$ cat example.dict
example
$ john --wordlist=example.dict --rules=command_for_eachline --stdout
Using default input encoding: UTF-8
Example
EXAMPLE
example
3p 0:00:00:00 100.00% (2022-07-26 09:46) 75.00p/s example
$ john --wordlist=example.dict --rules=command_in_oneline --stdout
Using default input encoding: UTF-8
EXAMPLE
1p 0:00:00:00 100.00% (2022-07-26 09:47) 33.33p/s EXAMPLE

ルールに使用できるコマンド一覧

文字を変換するコマンド

コマンド効果入力ルールの例生成される単語
:何もしないexample:example
c最初を大文字にする(capitalize)examplecExample
C最初を小文字に、他は大文字にするexampleCeXAMPLE
V母音は小文字に、子音は大文字にexampleVeXaMPLe
Rキーボードの右隣のキーに変換するexampl3Rrcs,[;4
Lキーボードの左隣のキーに変換するexampl3Lwzanok2
lすべて小文字にする(lowercase)EXAMPLElexample
uすべて大文字にする(uppercase)exampleuEXAMPLE
tすべての小文字は大文字に、大文字は小文字にする(toggle)ExAmPlEteXaMpLe
TNN番目の文字について、小文字は大文字に、大文字は小文字にする(toggle N)ExAmPlET3ExAMPlE
WNN番目の文字について、Shiftを押しながら入力したときの文字に変換するexampl3W6exampl#
Sすべての文字について、Shiftを押しながら入力したときの文字に変換するexampl3SEXAMPL#
r文字列を逆にする(reverse)exampleW6elpmaxe
{文字列を左にローテートするexample{xamplee
}文字列を右にローテートするexample{eexampl

文字列に追加/削除するコマンド

コマンド効果入力ルールの例生成される単語
d文字列を複製する(duplicate)exampledexampleexample
pN文字列をN回複製する(duplicate N)examplep3exampleexampleexampleexample
zN最初の文字をN回複製するexamplez3eeeexample
qすべての文字を複製するexampleqeexxaammppllee
f逆にした文字列を追加する(reflect)examplefexampleelpmaxe
$文字を末尾に追加するexample$1example1
^文字を先頭に追加するexample^11example
[最初の文字を削除するexample[xample
]最後の文字を削除するexample]exampl
'NN番目以降の文字を削除するexample'3exa
DNN番目の文字を削除する(Delete)exampleD3exaple
xNMN番目から始まるM文字を抽出する(Extract)examplex14xamp
ONMN番目から始まるM文字を削除する(Omit)examplex14ele
iNXN番目に文字Xを挿入する(insert)examplei2@ex@ample
oNXN番目を文字Xで置換する(overwrite)exampleo2@ex@mple
sXYすべての文字Xを文字Yで置換するexamplese$3xampl3
@Xすべての文字Xを削除するexample@exampl

英単語の操作をするコマンド

コマンド効果入力ルールの例生成される単語
p単語に複数形のsをつける(pluralize)crackpcracks
P単語に過去形のd/edをつけるcrackPcracked
I単語を名詞化するingをつけるcrackIcracking

ルールを適用する条件を設定するコマンド - 文字列の長さ編

コマンド効果入力ルールの例生成される単語
<L長さLより短い文字列にルールを適用するexamplec<9EXAMPLE
>L長さLより長い文字列にルールを適用するexamplec>3EXAMPLE
_L長さLの文字列にルールを適用するexamplec_7EXAMPLE

単語を保存したり、保存した単語を活用するコマンド

コマンド効果入力ルールの例生成される単語
M左からコマンドを適用していったその時点での単語を保存するexampleMexample
4Mで保存した単語を末尾に追加するexampleuM4exampleEXAMPLE
6Mで保存した単語を先頭に追加するexampleuM6EXAMPLEexample
XNLI保存した単語のN番目から長さLを取り出しI番目に挿入するexampleMuX253EXAampleMPLE

作成したルールからどんな単語が生成されるのかを確認する

Terminal window
$ john --wordlist=<DICIONARY> --rules=NameOfRule --stdout

References