1#!/usr/bin/perl
2
3
4use strict;
5use Nmap::Parser;
6use File::Spec;
7use Cwd;
8use Test::More tests => 141;
9
10use constant HOST1 => '127.0.0.1';
11use constant HOST2 => '127.0.0.2';
12use constant HOST3 => '127.0.0.3';
13use constant HOST4 => '127.0.0.4';
14my @UP_HOSTS = (HOST1, HOST3, HOST4);
15my @DOWN_HOSTS = (HOST2);
16use constant TOTAL_HOSTS => 4;
17
18use constant TEST_FILE =>'nmap_results.xml';
19use vars qw($host $np $session $svc $os $FH);
20
21$FH = File::Spec->catfile(cwd(),'t',TEST_FILE);
22$FH = File::Spec->catfile(cwd(),    TEST_FILE)  unless(-e $FH);
23
24my $np = new Nmap::Parser;
25
26parser_test();
27session_test();
28host_1();
29host_2();
30host_3();
31host_4();
32
33sub parser_test {
34    ok($np->parsefile($FH),"Parsing nmap data: $FH");
35
36    #TESTING GET_IPS()
37    is_deeply([$np->get_ips()],[HOST1, HOST2, HOST3, HOST4], 'Testing get_ips for correct number of hosts');
38    is_deeply([$np->get_ips('up')],[HOST1,HOST3, HOST4], 'Testing get_ips for correct hosts with status = up');
39    is_deeply([$np->get_ips('down')],[HOST2], 'Testing get_ips for correct hosts for with status = down');
40
41    #TESTING IPV4_SORT
42    my @hosts = (HOST3, HOST1, HOST4, HOST2);
43    is_deeply([$np->ipv4_sort(@hosts)],[HOST1, HOST2, HOST3, HOST4], 'Testing ipv4_sort');
44
45
46    #TESTING ALL_HOSTS()
47    my $total_hosts = 0;
48    for my $h ($np->all_hosts()){
49     isa_ok($h, 'Nmap::Parser::Host');
50     isnt($h->status,undef,'Testing host object '.$h->addr.' in all_hosts()');
51     $total_hosts++;
52    }
53
54    is($total_hosts, TOTAL_HOSTS, "Testing correct number of hosts with all_hosts()");
55
56    #TESTING ALL_HOSTS(UP)
57    my $total_uphosts = 0;
58    for my $h ($np->all_hosts('up')){
59     isnt($h->addr,HOST2,'Testing host '.$h->addr.' in all_hosts(up)');
60     $total_uphosts++;
61    }
62
63   is($total_uphosts, scalar(@UP_HOSTS), "Testing correct number of UP hosts with all_hosts(up)");
64
65    #TESTING ALL_HOSTS(DOWN)
66    my $total_downhosts = 0;
67    for my $h ($np->all_hosts('down')){
68     is($h->addr,HOST2,'Testing host '.$h->addr.' in all_hosts(up)');
69     $total_downhosts++;
70    }
71
72   is($total_downhosts, scalar(@DOWN_HOSTS), "Testing correct number of DOWN hosts with all_hosts(down)");
73
74}
75
76
77
78sub session_test {
79
80    isa_ok($session = $np->get_session(), 'Nmap::Parser::Session');
81    is($session->numservices(),1023+1023,'Session: total number of services');
82    is($session->numservices('connect'),1023,'Session: numservices type = connect');
83    is($session->numservices('udp'),1023,'Session: numservices type = udp');
84    is($session->start_time(),1057088883,'Session: start_time');
85    is($session->start_str(),'Tue Jul  1 14:48:03 2003','Session: start_str');
86    is($session->finish_time(),1057088900,'Session: finish_time');
87    is($session->time_str(),'Tue Jul  1 14:48:20 2003','Session: time_str');
88    is($session->nmap_version(),'3.80','Session: nmap_version');
89    is($session->xml_version(),'1.01','Session: xml_version');
90    is($session->scan_args(),'nmap -v -v -v -oX test.xml -O -sTUR -p 1-1023 127.0.0.[1-4]','Session: scan_args');
91    is($session->scan_type_proto(),undef,'Session: scan_type_proto()');
92    is($session->scan_type_proto('connect'),'tcp','Session: scan_type_proto(connect)');
93    is($session->scan_type_proto('udp'),'udp','Session: scan_type_proto(udp)');
94
95    }
96
97
98sub host_1 {
99
100    isa_ok($host = $np->get_host(HOST1), 'Nmap::Parser::Host','GET '.HOST1);
101    is($host->status,'up','Host1: status');
102    is($host->addr,HOST1,'Host1: addr');
103    is($host->addrtype,'ipv4','Host1: addrtype');
104    is($host->ipv4_addr,HOST1,'Host1: ipv4_addr');
105    is($host->mac_addr,'00:09:5B:3F:7D:5E','Host1: mac_addr');
106    is($host->mac_vendor, 'Netgear','Host1: mac_vendor');
107    is($host->hostname,'host1','Host1: hostname()');
108    is($host->hostname(0),$host->hostname, 'Host1: hostname(0)');
109    is($host->hostname(1),'host1_2', 'Host1: hostname(1)');
110    is_deeply([$host->all_hostnames()],['host1','host1_2'],'Host1: all_hostnames');
111    is($host->extraports_state(),'closed','Host1: extraports_state');
112    is($host->extraports_count(),2038,'Host1: extraports_count');
113
114
115    is($host->tcp_port_count(),8,'Host1: tcp_port_count');
116    is($host->udp_port_count(),2,'Host1: udp_port_count');
117
118    is_deeply([$host->tcp_ports()],[qw(22 25 80 111 443 555 631 4903)],'Host1: tcp_ports()');
119    is_deeply([$host->tcp_ports('open')],[qw(80 111 443 555 631)],'Host1: tcp_ports(open)');
120    is_deeply([$host->tcp_ports('closed')],  [qw(4903)],'Host1: tcp_ports(closed)');
121    is_deeply([$host->tcp_ports('filtered')], [qw(22 25 555)],'Host1: tcp_ports(filtered)');
122    is_deeply([$host->tcp_ports('open|filtered')],[qw(555)],'Host1: tcp_ports(open|filtered)');
123    is_deeply([$host->udp_ports()], [qw(111 937)],'Host1: udp_ports()');
124    is_deeply([$host->udp_ports('open')], [qw(111)],'Host1: udp_ports(open)');
125    is_deeply([$host->udp_ports('filtered')], [qw(937)],'Host1: udp_ports(filtered)');
126    is_deeply([$host->udp_ports('closed')],  [qw()],'Host1: udp_ports(closed)');
127
128    is($host->tcp_ports('open'),    $host->tcp_open_ports(),    'Host1: tcp_open_ports');
129    is($host->tcp_ports('filtered'),$host->tcp_filtered_ports(),'Host1: tcp_filtered_ports');
130    is($host->tcp_ports('closed'),  $host->tcp_closed_ports(),  'Host1: tcp_closed_ports');
131
132    is($host->udp_ports('open'),    $host->udp_open_ports(),    'Host1: udp_open_ports');
133    is($host->udp_ports('filtered'),$host->udp_filtered_ports(),'Host1: udp_filtered_ports');
134    is($host->udp_ports('closed'),  $host->udp_closed_ports(),  'Host1: udp_closed_ports');
135
136    is($host->uptime_seconds(),   '1973',    'Host1: uptime_seconds');
137    is($host->uptime_lastboot(),'Tue Jul  1 14:15:27 2003','Host1: uptime_lastboot');
138
139    is($host->tcpsequence_index(),   4336320,    'Host1: tcpsequence_index');
140    is($host->tcpsequence_class(),'random positive increments','Host1: tcpsequence_class');
141    is($host->tcpsequence_values(), 'B742FEAF,B673A3F0,B6B42D41,B6C710A1,B6F23FC4,B72FA3A8',  'Host1: tcpsequence_values');
142
143    is($host->ipidsequence_class(),'All zeros','Host1: ipidsequence_class');
144    is($host->ipidsequence_values(), '0,0,0,0,0,0',  'Host1: ipidsequence_values');
145
146    is($host->tcptssequence_class(),'100HZ','Host1: tcptssequence_class');
147    is($host->tcptssequence_values(), '30299,302A5,302B1,302BD,302C9,302D5',  'Host1: tcptssequence_values');
148
149    isa_ok($np->del_host(HOST1), 'Nmap::Parser::Host','DEL '.HOST1);
150    is($np->get_host(HOST1),undef, 'Testing deletion of '.HOST1);
151
152
153    #TESTING SERVICE OBJECT FOR HOST 1
154    my $svc;
155    isa_ok($svc = $host->tcp_service(22),'Nmap::Parser::Host::Service','TCP port 22');
156    is($svc->name, 'ssh','Service: name');
157    is($svc->method, 'table','Service: method');
158    is($svc->confidence, 3, 'Service: confidence');
159
160    isa_ok($svc = $host->udp_service(111),'Nmap::Parser::Host::Service','UDP port 111');
161    is($svc->name, 'rpcbind','Service: name');
162    is($svc->proto, 'rpc','Service: proto');
163    is($svc->rpcnum, '100000','Service: rpcnum');
164
165
166    #TESTING OS OBJECT FOR HOST 1
167    my $os;
168    isa_ok($os = $host->os_sig(),'Nmap::Parser::Host::OS','os_sig()');
169
170    }
171
172sub host_2 {
173    isa_ok($host = $np->get_host(HOST2), 'Nmap::Parser::Host','GET '.HOST2);
174    is($host->addr,HOST2, 'Host2: addr');
175    is($host->status,'down', 'Host2: status = down');
176    isa_ok($np->del_host(HOST2), 'Nmap::Parser::Host','DEL '.HOST2);
177    is($np->get_host(HOST2),undef, 'Testing deletion of '.HOST2);
178
179}
180
181
182sub host_3 {
183    isa_ok($host = $np->get_host(HOST3), 'Nmap::Parser::Host','GET '.HOST3);
184
185    #TESTING SERVICE OBJECTS
186    my $svc;
187
188    isa_ok($svc = $host->tcp_service(22),'Nmap::Parser::Host::Service','tcp_service(22) for '.HOST3);
189    is($svc->owner,'root', 'TCP Service: owner');
190    is($svc->name, 'ssh', 'TCP Service: name');
191    is($svc->product,'OpenSSH','TCP Service: product');
192    is($svc->version,'3.4p1','TCP Service: version');
193    is($svc->extrainfo,'protocol 1.99', 'TCP Service: extrainfo');
194
195    isa_ok($svc = $host->udp_service(80),'Nmap::Parser::Host::Service','udp_service(780) for '.HOST3);
196    is($svc->owner,'www-data', 'UDP Service: owner');
197    is($svc->name, 'http', 'UDP Service: name');
198    is($svc->product,'Apache httpd','UDP Service: product');
199    is($svc->version,'1.3.26','UDP Service: version');
200    is($svc->extrainfo,'(Unix) Debian GNU/Linux', 'UDP Service: extrainfo');
201
202
203    isa_ok($svc = $host->tcp_service(500),'Nmap::Parser::Host::Service','TCP port 500');
204
205    isa_ok($np->del_host(HOST3), 'Nmap::Parser::Host','DEL '.HOST3);
206    is($np->get_host(HOST3),undef, 'Testing deletion of '.HOST3);
207
208}
209
210
211sub host_4 {
212    isa_ok($host = $np->get_host(HOST4), 'Nmap::Parser::Host','GET '.HOST4);
213    my $os;
214      #TESTING OS OBJECTS
215    isa_ok($os = $host->os_sig, 'Nmap::Parser::Host::OS','os_sig for '.HOST4);
216    is($os->portused_open,22,'OS: portused open');
217    is($os->portused_closed,1,'OS: portused closed');
218    is($os->name_count,2,'OS: name count');
219
220    is($os->name,'Linux Kernel 2.4.0 - 2.5.20','OS: name()');
221    is($os->name(0),$os->name,'OS: name(0)');
222    is($os->name(1),'Solaris 9','OS: name(1)');
223    is_deeply([$os->all_names],['Linux Kernel 2.4.0 - 2.5.20','Solaris 9'],'OS: all_names');
224    is($os->name_accuracy(),100,'OS: name_accuracy()');
225    is($os->name_accuracy(0),$os->name_accuracy(),'OS: name_accuracy(0)');
226    is($os->name_accuracy(1),99,'OS: name_accuracy(1)');
227
228    my $count = 11;
229    is($os->class_count(),$count,'OS: class_count MAX = '.$count);
230
231    is($os->osfamily(),'AOS','OS: osfamily()');
232    is($os->osfamily(0),$os->osfamily(),'OS: osfamily(0)');
233    is($os->osfamily($count),'Linux','OS: osfamily(MAX)');
234    is($os->osfamily(15),$os->osfamily($count),'OS: osfamily(15) = osfamily(MAX)');
235
236    is($os->vendor(),'Redback','OS: vendor()');
237    is($os->vendor(0),$os->vendor(),'OS: vendor(0)');
238    is($os->vendor($count),'Linux','OS: vendor(MAX)');
239    is($os->vendor(15),$os->vendor($count),'OS: vendor(15) = vendor(MAX)');
240
241    is($os->osgen(),undef,'OS: osgen()');
242    is($os->osgen(0),$os->osgen(),'OS: osgen(0)');
243    is($os->osgen($count),'2.4.x','OS: osgen(MAX)');
244    is($os->osgen(15),$os->osgen($count),'OS: osgen(15) = osgen(MAX)');
245
246    is($os->type(),'router','OS: type()');
247    is($os->type(0),$os->type(),'OS: type(0)');
248    is($os->type($count),'general purpose','OS: type(MAX)');
249    is($os->type(15),$os->type($count),'OS: type(15) = type(MAX)');
250
251    is($os->class_accuracy(),97,'OS: class_accuracy()');
252    is($os->class_accuracy(0),$os->class_accuracy(),'OS: class_accuracy(0)');
253    is($os->class_accuracy($count),50,'OS: class_accuracy(MAX)');
254    is($os->class_accuracy(15),$os->class_accuracy($count),'OS: class_accuracy(15) = type(MAX)');
255
256    is($host->tcptssequence_values,undef,'HOST4: tcptssequence_values = undef');
257    isa_ok($np->del_host(HOST4), 'Nmap::Parser::Host','DEL '.HOST4);
258    is($np->get_host(HOST4),undef, 'Testing deletion of '.HOST4);
259
260
261}
262