Net::ARP

/ Perl / Comment[0]
指定した範囲内のホストのMACアドレスを取得するperlを書いてみた
#!/usr/bin/perl
use Net::ARP;
use IO::Interface::Simple;
use Time::HiRes qw(sleep);

$iface = IO::Interface::Simple->new("$ARGV[2]");
$saddr = $iface->address;
$smac = Net::ARP::get_mac("$ARGV[2]");

($s1, $s2, $s3, $s4) = split(/\./,$ARGV[0],4);
($e1, $e2, $e3, $e4) = split(/\./,$ARGV[1],4);
print "Range : $s1.$s2.$s3.$s4 - $e1.$e2.$e3.$e4\n";
for($oct1 = $s1; $oct1 <= $e1 && $oct1 <= 255; $oct1++) {
for($oct2 = $s2; $oct2 <= $e2 && $oct2 <= 255; $oct2++) {
for($oct3 = $s3; $oct3 <= $e3 && $oct3 <= 255; $oct3++) {
for($oct4 = $s4; $oct4 <= $e4 && $oct4 <= 255; $oct4++) {
Net::ARP::send_packet( "$ARGV[2]",
"$saddr",
"$oct1.$oct2.$oct3.$oct4",
"$smac",
"ff:ff:ff:ff:ff:ff",
'request' );
$mac = Net::ARP::arp_lookup("$ARGV[2]","$oct1.$oct2.$oct3.$oct4");
next if($mac eq 'unknown');
print "$oct1.$oct2.$oct3.$oct4 $mac","\n";
sleep(0.2);
}
}
}
}

arp_lookup()でARPリクエストを送信してくれるのかと思ったら、こいつはただARPテーブルからMACアドレスを読み込むだけらしい。未知のホストのMACを取得する場合はsend_packet()でリクエストを送ってからarp_lookup()する必要がある

# ./arpmap.pl 10.0.0.1 10.25.25.25 eth0
Range :	10.0.0.1 - 10.25.25.25
10.0.1.1 00:27:0e:**:**:**
10.10.0.3 c6:52:42:**:**:**
10.25.0.1 00:22:cf:**:**:**
関連記事

コメント

:
:
:
:
:
管理人のみ表示を許可