LinuxやUNIXでは、ユーザのパスワード情報は「/etc/passwd(shadow化している場合は「/etc/shadow」)」というファイルに以下のように設置される。

root@Test-UbuntuOS004:/home/test# cat /etc/shadow
root:!:16222:0:99999:7:::
daemon:*:16177:0:99999:7:::
bin:*:16177:0:99999:7:::
sys:*:16177:0:99999:7:::
sync:*:16177:0:99999:7:::
games:*:16177:0:99999:7:::
man:*:16177:0:99999:7:::
lp:*:16177:0:99999:7:::
mail:*:16177:0:99999:7:::
news:*:16177:0:99999:7:::
uucp:*:16177:0:99999:7:::
proxy:*:16177:0:99999:7:::
www-data:*:16177:0:99999:7:::
backup:*:16177:0:99999:7:::
list:*:16177:0:99999:7:::
irc:*:16177:0:99999:7:::
gnats:*:16177:0:99999:7:::
nobody:*:16177:0:99999:7:::
libuuid:!:16177:0:99999:7:::
syslog:*:16177:0:99999:7:::
messagebus:*:16177:0:99999:7:::
usbmux:*:16177:0:99999:7:::
dnsmasq:*:16177:0:99999:7:::
avahi-autoipd:*:16177:0:99999:7:::
kernoops:*:16177:0:99999:7:::
rtkit:*:16177:0:99999:7:::
saned:*:16177:0:99999:7:::
whoopsie:*:16177:0:99999:7:::
speech-dispatcher:!:16177:0:99999:7:::
avahi:*:16177:0:99999:7:::
lightdm:*:16177:0:99999:7:::
colord:*:16177:0:99999:7:::
hplip:*:16177:0:99999:7:::
pulse:*:16177:0:99999:7:::
test:$6$V8bY.lBA$UcLfVPnDBjqv.c4PDeekOWSzFZgUus2iJU33VtSNl7Y.yt7tPdI15msWD7Zc54vPA9vFuTj6YIfZlKjzwYG6H.:16222:0:99999:7:::
sshd:*:16222:0:99999:7:::
test01:$6$9XX7RC22$WbwnGCGMP9QZ2SnKytjANBngknWX/r3mY7XoomybjYUDyPwrDCGiIGT7m.RbyKsoYx.9Z5K3/C//XVmaIzIed.:16243:0:99999:7:::
test02:$6$u0DQdlHy$fHJS/ciCHO5x6r7MjCOVYy3u0rPeOI.atTCDI20aOwQnk272I4iOTgJP5MRrajXQuFj11oLRYCF4mhfmq.f8U.:16243:0:99999:7:::
test03:$6$t7eY8gyB$pVIjAv72/Uhh7Eu30RyS0uZgsrOCxrVUYDhNPLsaYI6wL4JSO5bURzG96pN4jKIJqxPhcCBt6VLBbcRd9Lj3X.:16243:0:99999:7:::
test04:$6$/p7C6apt$KLKQ7JbMeJE4fpx3IuhBWFHBvnU2VsMc2bKZ1T8uRNMZO/RX0Tw/FgzT0dYubYm8jdcu7hmqKP//ccvpn1N9Q0:16243:0:99999:7:::
test05:$6$x.yULQG9$zdcEnhR2rbMkv/blEl7DJslsVmJCOXi3rHtbVfftd4mMMsmufpRf35IzpJ.zvh8KltYtNAY2AF5Z1/mt4dF3A1:16243:0:99999:7:::
test06:$6$vND9stLZ$B2BhLxmCnCgOhkvIlY6//bSVyQCCn8X7wmSS22wXVZeZbA7JsRmh5HCbaE5ECe1Ky5jiqVDycNWapDTJyqjnY1:16243:0:99999:7:::
test07:$6$1jiLve2N$RQfAR6TPcyhEV.9EFtlf4RH0/SQS5EdRPADJ8R1egYHAqDrX/UC029IoKf2iGr/WNW6wfePBBEcTVvRmTyply1:16243:0:99999:7:::
test08:$6$F6DY6uX8$tI7PsjHcboUN7pHnBjHEPb/e0OBLemgsbUkTPeLSp7UXwACykxVQYJ5abBrPzjnqeXDZkW72pW/aTXj9YXYzi/:16243:0:99999:7:::
test09:$6$WJcMEB2r$rt4W/AaIWynyGGqMygwkdlWy.mBUAMQEGABjloRpCRttZUqZ8sTdvtafAVtOweenRakPWWQzQj5TGy4oTkxTd/:16243:0:99999:7:::
test10:$6$UJ6pDeJV$BZMjRreNj7VcvQzUf9s5BZz/wM5CMoMzZb0TM0geCWJv/QJ6E23yUIBXv/euvakUjaJ7pJy6M9G0vgDL1zhBz1:16243:0:99999:7:::

※UbuntuやCentOSの場合、デフォルトでShadow化されている事が多い。

さて、見てみればわかるようにこのshadowファイルのパスワードは暗号化されているため、このままではパスワードはわからない。

設定されているパスワードは、この検証環境では以下のようにしている。

test:test
test01:testpass01
test02:testpass02
test03:testpass03
test04:testpass04
test05:testpass05
test06:testpass06
test07:testpass07
test08:testpass08
test09:testpass09
test10:testpass10

このパスワードを、「/etc/passwd」から復号化するのが『John The Ripper』だ。 このプログラムは別途インストールする必要がある。

1.John The Ripperのインストール

以下のコマンドでインストールを行う。

Debian系の場合

apt-get install john

Redhat系の場合

yum install john

早速インストールしてみよう。

root@Test-UbuntuOS004:/home/test# apt-get install john
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
john-data
以下のパッケージが新たにインストールされます:
john john-data
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 261 個。
5,405 kB のアーカイブを取得する必要があります。
この操作後に追加で 7,891 kB のディスク容量が消費されます。
続行しますか? [Y/n]
取得:1 http://jp.archive.ubuntu.com/ubuntu/ trusty/main john-data all 1.8.0-1 [5,196 kB]
取得:2 http://jp.archive.ubuntu.com/ubuntu/ trusty/main john amd64 1.8.0-1 [209 kB]
5,405 kB を 2秒 で取得しました (1,948 kB/s)
以前に未選択のパッケージ john-data を選択しています。
(データベースを読み込んでいます ... 現在 170961 個のファイルとディレクトリがインストールされています。)
Preparing to unpack .../john-data_1.8.0-1_all.deb ...
Unpacking john-data (1.8.0-1) ...
以前に未選択のパッケージ john を選択しています。
Preparing to unpack .../john_1.8.0-1_amd64.deb ...
Unpacking john (1.8.0-1) ...
Processing triggers for man-db (2.6.7.1-1) ...
john-data (1.8.0-1) を設定しています ...
john (1.8.0-1) を設定しています ...

これでインストールができた。

2.shadowファイルからpasswdファイルへの変換

このJohn The Ripper、直接はShadowファイルを扱えない。 そのため、以下のコマンドを実行しJohn The Ripperが扱えるファイル形式のものを作成する。

root@Test-UbuntuOS004:/home/test# unshadow /etc/passwd /etc/shadow > johnpasswd
root@Test-UbuntuOS004:/home/test# chmod 400 johnpasswd

※実験が終わったらこのファイルは削除すること!

3.John The Ripperを実行する

さて、それではJohn The Ripperを使ってみよう。 パスワードファイルの解析には、「john」というコマンドを用いる。

root@Test-UbuntuOS004:/home/test# john
Created directory: /root/.john
John the Ripper password cracker, version 1.8.0
Copyright (c) 1996-2013 by Solar Designer
Homepage: http://www.openwall.com/john/

Usage: john [OPTIONS] [PASSWORD-FILES]
--single "single crack" mode
--wordlist=FILE --stdin wordlist mode, read words from FILE or stdin
--rules enable word mangling rules for wordlist mode
--incremental[=MODE] "incremental" mode [using section MODE]
--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 will be overwritten
--show show cracked passwords
--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=[-]N load salts with[out] at least N passwords only
--save-memory=LEVEL enable memory saving, at LEVEL 1..3
--node=MIN[-MAX]/TOTAL this node's number range out of TOTAL count
--fork=N fork N processes
--format=NAME force hash type NAME: descrypt/bsdicrypt/md5crypt/
bcrypt/LM/AFS/tripcode/dummy/crypt

このjohnコマンドでは、以下の3つのモードを指定できる。

  • --single … ユーザ名を元にパスワードを推測するモード。
  • --wordlist … 別途パスワードリストを用いてディクショナリアタックを行うモード。
  • --incremental … 多くの組み合わせを行う、ブルートフォースアタックを行うモード。

一番簡単な実行方法は以下。

john パスワードファイル

ただ、これだと全ユーザに対し、 上記3つのモードを全て試すような処理が行われる。 非常に時間がかかるため、実際に使用する際はユーザやモードを別途指定して実行する。

例えば、ユーザを「test01」に限定する場合

john --users=test01 johnpasswd

とする。

クラックモードを指定する場合は以下のようにする。 例えば、シングルモードの場合。

john --single johnpasswd

ワードリストモードの場合。

john --wordlist=パスワードファイル --stdin johnpasswd

実際にやってみた結果がこちら。 ユーザ「test」のパスワードを確認する。パスワードは「test」なので、簡単に解析できそうだけど…

root@Test-UbuntuOS004:/home/test# john --users=test --single johnpasswd
Loaded 1 password hash (crypt, generic crypt(3) [?/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
test             (test)
1g 0:00:00:00 100% 2.173g/s 208.6p/s 208.6c/s 208.6C/s test..Test0
Use the "--show" option to display all of the cracked passwords reliably
Session completed
root@Test-UbuntuOS004:/home/test#
root@Test-UbuntuOS004:/home/test#
root@Test-UbuntuOS004:/home/test# john --user=test --show johnpasswd
test:test:1000:1000:test,,,:/home/test:/bin/bash

1 password hash cracked, 0 left

singleモードで実行した結果。 11行目でパスワードの解析ができている事が確認出来た。

よくセキュリティの設定で『/etc/passwd』のshadow化を行うが、それを行わなければいけないと再認識させられるツールだ。 悪用厳禁なので、あくまでもこういったツールが存在すること、こういったツールを考慮してセキュリティ設計を行う必要がある事を理解しよう。