Linux Security: 第2章 - 攻撃と侵入

| ← |

2.9 演習

演習では、直接 passwd(4) を vi(1) で編集しているが、二重更新を回避するためにも vipw(8) を使うべき。
vipw は直接 /etc/passwd を編集せずに、一旦 /tmp/ptmp にコピーしそれを編集する。 すでに /etc/ptmp があれば、作業中と判断し編集を中止する。
同様に vigr(8) は /etc/group を /tmp/gtmp へコピーし同様の処理を行う。

# vipw
+----------------------------
| /etc/passwd の編集
+----------------------------
	↓ 終了すると続けて、 shadow の編集ができる。
+----------------------------
| /etc/shadow の編集
+----------------------------

またパスワードなしのアカウントを作ることで、より手軽にバックドアでの 作業を行う事ができる。
パスワードなしのユーザは、パスワード領域を空欄にする事で可能。

# vipw
(/etc/passwd)
+----------------------------
|student:x:500:500::/home/student:/bin/bash
+----------------------------
		↓
+----------------------------
|student::500:500::/home/student:/bin/bash
+----------------------------

(/etc/shadow)
+----------------------------
|student:$1$Ejj/0WPx$4arcMbEpj2CyyIJ1Hx4NZ2:15505:0:9999:7:::
+----------------------------
		↓
+----------------------------
|student::15505:0:9999:7:::
+----------------------------

$ ssh  student@localhost
Last login : Thu  Aug   2  04:17: ...  	# パスワード確認なし

$ ssh student@localhost who
 04:23:12 up  5:26,  1 user,  load average: 0.46, 0.47, 0.46
USER	 TTY	  FROM		    LOGIN@   IDLE   JCPU   PCPU WHAT
student	 tty1	  -		   04:17    0.00s  0.17s  0.01s ssh student@localhost

使ってはいけないパスワード

ワーストパスワード例
パスワードガイドライン
・単純な単語(辞書に載っているようなもの)
	password, himitsu
・上記の逆順、途中に数字・特殊文字を差し込んだもの
	passw0rd, un1ver$e
・ユーザ名、自身や家族(ペット)の名前のアレンジ
	user, tama123
・生年月日、電話番号、自動車のナンバーなど連想される数値
	090123123, 1212
・(大文字、小文字、数字、特殊文字)のうち3つ以上を組み合わせる

パスフレーズガイドライン
・16文字以上、過去24回使用履歴がない
・異なる単語が4つ以上、文字の連続は5回未満
・知られたフレーズは使わない
	this is a pen, I'll be back
・キーボードの並び順はだめ
	qwertyuiop, mnbvcxz

パスワード同定ツール

力ずく(Brute force - 総当たり) の解析ツールサンプル。
/etc/shadow には暗号化されたパスワードが記録されています。以前の UNIX では、この内容が /etc/passwd 第3項目に記載されており、だれても見ることができました。
この情報をもとに、暗号化機能(crypt)を使えば例えば aaaaaaaa, aaaaaaab, aaaaaaac ... aaaaaaba, aaaaaabb ... zzzzzzzy, zzzzzzzz と言うように思いつく全ての文字列組み合わせで試せば、最終的に「ビンゴ」になります。
#include <stdio.h>
#include <unistd.h>
#include <crypt.h>
main( int argc, char **argv )
{
	printf("plain:%s salt:%s\n", argv[2], argv[1] );
	printf("\t%s\n", crypt(argv[2], argv[1]) );
}
実験方法
  1. crypt.c の作成
    上記内容を crypt.c として保存
  2. コンパイル
    以下の操作により、コマンド crypt を作成します。(パッケージ gcc が必要)
     $ cc  crypt.c  -o  crypt  -lcrypt
  3. テストデータの取得
    /etc/shadow の student を確認します。
    # grep student: /etc/shadow
    student:$6$LtOjaIEm83ONbfQ4$peEN1yujv46JGfqe14BPWgthQDWTaWZWt.K7BuWc4BPDVvcqIRBxsKB.7RTvGd/5hJYXgFO53Bf0EZBrqjYLv0::0:99999:7:::
    
    内容は「$暗号化アルゴリズム番号(id)$ソルト(乱数初期化値)$暗号化されたパスワード::0:99999:7:::」となります。
    (詳しくは man crypt 参照)
  4. 実験
    /etc/shadow のソルトと、 パスワード(平文)を crypt の引数として実行します。
    $ ./crypt '$6$LtOjaIEm83ONbfQ4$' himitu
    plain:himitu salt:$6$LtOjaIEm83ONbfQ4$
    	$6$LtOjaIEm83ONbfQ4$peEN1yujv46JGfqe14BPWgthQDWTaWZWt.K7BuWc4BPDVvcqIRBxsKB.7RTvGd/5hJYXgFO53Bf0EZBrqjYLv0
    
    実行結果が /etc/shadow の内容と同じと言うことは、パスワードは himitu だと同定できた事になります。