[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 メーリングリストの案内