forked from royhills/arp-scan
-
Notifications
You must be signed in to change notification settings - Fork 4
/
get-iab
executable file
·168 lines (167 loc) · 5.09 KB
/
get-iab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
#!/usr/bin/env perl
#
# Copyright 2006-2013 Roy Hills
#
# This file is part of arp-scan.
#
# arp-scan is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# arp-scan is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with arp-scan. If not, see <http://www.gnu.org/licenses/>.
#
# get-iab -- Fetch the IAB file from the IEEE website
#
# Author: Roy Hills
# Date: 16 March 2006
#
# This script downloads the Ethernet IAB file from the IEEE website, and
# converts it to the format needed by arp-scan.
#
# This script assumes that all the IAB entries start with 00-50-C2. This
# is currently the case, and will probably be so for the foreseeable
# future.
#
use warnings;
use strict;
use Getopt::Std;
use LWP::UserAgent;
#
my $default_url = 'http://standards.ieee.org/develop/regauth/iab/iab.txt';
my $default_filename='ieee-iab.txt';
#
my $usage =
qq/Usage: get-iab [options]
Fetch the Ethernet IAB file from the IEEE website, and save it in the format
used by arp-scan.
'options' is one or more of:
-h Display this usage message.
-f FILE Specify the output IAB file. Default=$default_filename
-u URL Specify the URL to fetch the IAB data from.
Default=$default_url
-v Give verbose progress messages.
/;
my %opts;
my $verbose;
my $filename;
my $url;
my @lines;
my $line;
my $lineno = 0;
my $oui;
my $iab_var;
my $vendor;
#
# Process options
#
die "$usage\n" unless getopts('hf:u:v',\%opts);
if ($opts{h}) {
print "$usage\n";
exit(0);
}
if (defined $opts{f}) {
$filename=$opts{f};
} else {
$filename=$default_filename;
}
if (defined $opts{u}) {
$url=$opts{u};
} else {
$url=$default_url;
}
$verbose=$opts{v} ? 1 : 0;
#
# If the output filename already exists, rename it to filename.bak before
# we create the new output file.
#
if (-f $filename) {
print "Renaming $filename to $filename.bak\n" if $verbose;
rename $filename, "$filename.bak" || die "Could not rename $filename to $filename.bak\n";
}
#
# Fetch the content from the URL
#
print "Fetching IAB data from $url\n" if $verbose;
my $ua = LWP::UserAgent->new;
my $res = $ua->get($url);
die "Could not get IAB data from $url\n" unless $res->is_success;
my $content = $res->content;
my $content_length = length($content);
die "Zero-sized response from from $url\n" unless ($content_length > 0);
print "Fetched $content_length bytes\n" if $verbose;
#
# Open the output file for writing.
#
print "Opening output file $filename\n" if $verbose;
open OUTPUT, ">$filename" || die "Could not open $filename for writing";
#
# Write the header comments to the output file.
#
my ($sec,$min,$hour,$mday,$mon,$year,undef,undef,undef) = localtime();
$year += 1900;
$mon++;
my $date_string = sprintf("%04d-%02d-%02d %02d:%02d:%02d", $year, $mon, $mday,
$hour, $min, $sec);
my $header_comments =
qq/# ieee-iab.txt -- Ethernet vendor IAB file for arp-scan
#
# This file contains the Ethernet vendor IABs for arp-scan. These are used
# to determine the vendor for a give Ethernet interface given the MAC address.
#
# Each line of this file contains an IAB-vendor mapping in the form:
#
# <IAB><TAB><Vendor>
#
# Where <IAB> is the first 36 bits of the MAC address in hex, and <Vendor>
# is the name of the vendor.
#
# Blank lines and lines beginning with "#" are ignored.
#
# This file was automatically generated by get-iab at $date_string
# using data from $url
#
# Do not edit this file. If you want to add additional MAC-Vendor mappings,
# edit the file mac-vendor.txt instead.
#
/;
print OUTPUT $header_comments;
#
# Parse the content received from the URL, and write the IAB entries to the
# output file. Match lines that look like this:
# 00-50-C2 (hex) T.L.S. Corp.
# 000000-000FFF (base 16) T.L.S. Corp.
# and write them to the output file looking like this:
# 0050C2000 T.L.S. Corp.
#
# We take the first 24 bits (six hex digits) from the first line containing
# "(hex)" and the next 12 bits (three hex digits) from the second line
# containing "(base 16)". These are then concatenated together to form the
# 36-bit IAB.
#
@lines = split /\n/, $content;
while (defined($line = shift @lines)) {
if ($line =~ m/^\s*(\w+)-(\w+)-(\w+)\s+\(hex\)\s+(.*)$/) { # 1st line
$oui = "$1$2$3";
$vendor = $4;
$line = shift @lines; # Read next line
if ($line =~ m/^\s*(\w+)-\w+\s+\(base 16\)/) { # 2nd line
$iab_var = substr($1,0,3);
print OUTPUT "$oui$iab_var\t$vendor\n";
$lineno++;
} else {
die "ERROR: Unexpected input line in IEEE IAB data. Got: $line";
}
}
}
#
# All done. Close the output file and print IAB entry count
#
close OUTPUT || die "Error closing output file\n";
print "$lineno IAB entries written to file $filename\n" if $verbose;