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