[ITPASS2016]パスワード脆弱性調査
[ITPASSサーバ構築・運用ドキュメント へ戻る]
ユーザパスワードの脆弱性を調査するため, パスワードクラックを行う手順を示す. 予めユーザへ知らせた上で実施すること.
ツールには John the Ripper を用いる. ここでは最新版をソースからコンパイルして用いる.
事前作業
shadow ファイルを用いるため, /root の下で行う.
$ sudo -s
作業用ディレクトリを作成する
# mkdir -p /root/passcrack # cd /root/passcrack
gcc, make が入っていない場合は入れておく.
# apt-get install gcc make
John the Ripper の取得とコンパイル
<URL:http://www.openwall.com/john/> から最新版の John のソースを取得, 解凍する.
# wget http://www.openwall.com/john/g/john-1.7.9.tar.gz # tar zxf john-1.7.9.tar.gz # cd john-1.7.9/src
コンパイル指定可能なオプションを調べる.
# make
表示された中からマシンに合ったものを選んで make の引数として実行する. 以下にオプションの例を示す.
# make linux-x86-64 # 64bit 版 OS における無難な場合.
上記より適切なオプションを選べる場合はそれを選んだほうが良い. そのほうが高速に動作する.
コンパイルに成功したら, ひとつ上のディレクトリに戻る.
# cd ..
辞書ファイルの準備
既にある辞書ファイルを用いる場合
予め作ってある辞書ファイルを取得する. これは以下の「自分で辞書ファイルを作成する場合」で作られたものである.
# cp ~itpass/ftp/server/2012/dictionaryfile .
自分で辞書ファイルを作成する場合
john のソースには標準の辞書
- run/password.lst
がある. これは項目数が少ないので他の辞書で補強することにする.
他にあるクラック用の辞書ファイルは例えば <URL:ftp://ftp.ox.ac.uk/pub/wordlists/> から取得する (このサイトはつながりにくいので, 根気よくアクセスすること).
たとえば以下の辞書を取得する.
- random/sports.gz
- american/dic-0294.tar.gz
- computer/common-passwords.txt.Z
- dictionaries/Unix.dict.gz
- japanese/words.japanese.Z
- movieTV/Movies.Z
- places/places.Z
- science/asteroids.Z
- science/tech.gz
上記で合計するとおよそ 100 万語になる.
拡張子 .Z のファイルを解凍するには comprez パッケージを入れ, comprez コマンドの引数にファイル名を指定すればよい.
利便性のため上記を cat で結合する. 重複を削除するため sort と uniq を通しておく.
# cat * | sort | uniq > dictionaryfile
パスワードファイルの準備
以下のコマンドを実行する.
# run/unshadow /etc/passwd /etc/shadow > pass
一部のアカウントしか検査しない場合は, ファイルをエディタで開き, 検査するアカウント以外の行を削除しておく.
他のユーザから見えないように権限を設定する.
# chmod 600 pass
実行
第一段階: 辞書アタック
以下のコマンドを実行する.
# nohup run/john --wordlist=/root/passcrack/john-1.7.9/dictionaryfile pass &
nohup はバックグラウンドで実行するためのコマンド. よって, 実行したまま logout もできる. 結果は nohup.out に記録される.
joho03 (Core i7 860 (2.80GHz)) の場合, 100 万項目の辞書を使って 1 ユーザを処理するのに 1 時間強を要した.
第二段階: しらみつぶし探索
以下は非常に長い時間がかかるので, 1 ヶ月などの期限を切って止めたほうがよい.
# nohup run/john --incremental pass &
結果の確認
# less nohup.out
以下はユーザ test にパスワード test1 を設定した場合の結果を示す.
Loaded 1 password hash (generic crypt(3) [?/64]) test1 (test) # 判明したアカウントとパスワードが並ぶ guesses: 1 time: 0:00:00:00 100% c/s: 290 trying: test - Test0 Use the "--show" option to display all of the cracked passwords reliably
john 側で保存された結果を見るには以下のようにする.
# run/john --show pass test:test1:1011:1011::/home/test:/bin/sh 1 password hash cracked, 0 left
事後作業
作業用ディレクトリを削除する.
# rm -r /root/passcrack
(オプション) テストユーザの作成と削除
クラックテスト用のユーザを作る方法を記す. 下記の場合では質問事項はなく, ホームディレクトリも作られない. gate でアカウント管理されているマシンの場合は gate との不整合を避けるため 40000 以降の uid にすること.
作成
# useradd test # パスワードなしのユーザが作成される # passwd test
削除
# userdel test # 誤ってホームディレクトリを作ってしまった場合は -r オプションをつける
(オプション) クラック速度を調べる
たとえば以下を実行する.
# time run/john --test=1s
以下に joho03 (Core i7 860 (2.80GHz)) の結果を示す. Debian 6.0 (squeeze) で特に設定を変更していない場合は generic crypt(3) の場合を見ること. 単位の c/s は candidates per second と思われる.
Benchmarking: Traditional DES [128/128 BS SSE2-16]... DONE Many salts: 3797K c/s real, 3759K c/s virtual Only one salt: 3602K c/s real, 3639K c/s virtual Benchmarking: BSDI DES (x725) [128/128 BS SSE2-16]... DONE Many salts: 120320 c/s real, 120320 c/s virtual Only one salt: 117760 c/s real, 117760 c/s virtual Benchmarking: FreeBSD MD5 [32/64 X2]... DONE Raw: 15448 c/s real, 15448 c/s virtual Benchmarking: OpenBSD Blowfish (x32) [32/64 X2]... DONE Raw: 900 c/s real, 900 c/s virtual Benchmarking: Kerberos AFS DES [48/64 4K]... DONE Short: 481536 c/s real, 481536 c/s virtual Long: 1460K c/s real, 1460K c/s virtual Benchmarking: LM DES [128/128 BS SSE2-16]... DONE Raw: 50641K c/s real, 51153K c/s virtual Benchmarking: generic crypt(3) [?/64]... DONE Many salts: 363168 c/s real, 366836 c/s virtual Only one salt: 360960 c/s real, 360960 c/s virtual Benchmarking: Tripcode DES [48/64 4K]... DONE Raw: 374016 c/s real, 377793 c/s virtual Benchmarking: dummy [N/A]... DONE Raw: 120404K c/s real, 121620K c/s virtual
Keyword(s):
References: