[Tokyo.pm] Network check (Re: reikai no gidai) LONG
OKABE, Keiichi
okabe @ isl.ntt.co.jp
2000年 3月 7日 (火) 00:04:08 CST
岡部です。
----- Original Message -----
From: Yasuo Matsumoto <yasuo.matsumoto @ jalinfotec.co.jp>
To: <tokyo-pm-list @ happyfunball.pm.org>
Sent: Tuesday, March 07, 2000 12:05 PM
Subject: [Tokyo.pm] reikai no gidai
> > # パケットキャプチャーをPerlで書けるのはおもしろいっす。
> > # 結果として見つけた問題はしゃれにもならないんですけどね。 (^^;
> えっと、どうやるんですか? Win32でもできればありがたいです。
> しゃれにならない話は例会で。
パケットキャプチャーとしてはtcpdumpとNet::RawIP (Perl Module)を使いました。
監査に使ったのはこの他にnmapとSAINTがあります。
tcpdumpはみなさんご存知でしょうから置いといて、
Net::RawIPは libpcapのPerlインタフェースです。libpcapは、
http://www.securityfocus.com/templates/tools_search.html?query=libpcap&index=tools
ftp://ftp.ee.lbl.gov/からダウンロードできて、対応しているプラットフォームは
AIX, BSDI, DG-UX, FreeBSD, HP-UX, IRIX, Linux, NetBSD, OpenBSD, SCO,
Solaris, SunOS, True64 UNIX, UNIX and Ultrix
です。今回はLinuxをこれ用に作って動かしました。
Net::RawIPはtcpdumpと同様のフィルタ設定をしておいて、ヒットしたら設定しておいた
サブルーチンをコールバックするってのと、任意のIPパケットを作って送出
できるという特徴があります。サンプルスクリプトを最後に付けます。
nmapも皆さんご存知でしょうか?
http://www.insecure.org/nmap/index.html
port scannerですが、いろいろなOSのIPプロトコルスタックのくせを利用して、パケットを
流すだけでOS種別を推測できるという特徴を持っています。
SAINTは昔SATANと呼ばれていたツールの後継です。
http://wwdsilx.wwdsi.com/saint/
このツールはPerlで動いていてnmapのインタフェースを提供していると考えれば
よいです。SAINT以外にもSATANの跡継ぎがあるはずなんですが、名前を忘れました。 (^^;
んでもってパケットキャプチャーに関してですが、最近Win32でも使えるようになっています。
WinDump: TCPdump for Windows
http://netgroup-serv.polito.it/windump/
libpcapの移植もここで行われています。ソースコードも公開されているので、それを利用すれば
Net::RawIPの移植ができるかもしれないですが、試していません。
# win2000に対応してないから…
# しゃれにならなかった話はまたいずれ。 (^^)
# 今月は出れないです。来月はスケジュール次第です。月末でないと開いてないんです。
-------- sample.pl -----------
# opt_sからopt_dのport opt_pにudpパケットをひとつ投げます。
# udp opt_pがオープンしていないとicmp パケットが帰ってくるからそれをひろう
use Net::RawIP;
require 'getopts.pl';
Getopts('s:d:p:');
die "Usage $0 -d dest -s source -p port"
unless($opt_d && $opt_s && $opt_p);
$udp = new Net::RawIP({udp=>{}});
$icmp = new Net::RawIP({icmp=>{}});
$udp->set({ip => {saddr => $opt_s,
daddr => $opt_d},
udp => {dest => $opt_p}
});
$device = 'eth0';
$filt = "ip proto \\icmp and dst host $opt_s";
$size = 1500;
$tout = 30; # このスクリプトにはバグがあって、タイムアウトしません
$pcap = $udp->pcapinit($device,$filt,$size,$tout);
if(fork){
loop $pcap,1,\&dmp,\@a; # $filtにあう条件のパケットがきたらsub dmpへ
# loop でなくdispatchを使えばtimeoutするはずだがうまくいかない
}else{
sleep 1;
$udp->set({udp => {data => timem()}});
$udp->send(1,1); # udpパケットを一個送出
}
sub dmp
{
$icmp->bset(substr($_[2],14)); # ether部分の情報をカット
($saddr,$type,$code) = $icmp->get({ip => [qw(saddr)],icmp=>[qw(type code)]});
printf("%u.%u.%u.%u\t%d\t%d\n",unpack "C4",pack "N1",$saddr,$type,$code);
}
-------- sample.pl -----------
---
okabe @ isl.ntt.co.jp 岡部 恵一 NTT PF研
成功出於衆者、先知也、先知者、必取於人、知敵之情者也
孫子 用間篇 第十三
Tokyo-pm メーリングリストの案内