[ITPASS2017]パスワード脆弱性調査

[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

参考文献

Last modified:2017/09/26 09:49:48
Keyword(s):
References: