#!/usr/bin/perl
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use Net::IP;
use Net::Scan::Ftp::Anonymous;
use Net::Scan::Fork;
use Time::HiRes qw(usleep ualarm gettimeofday tv_interval);
$|=1;
my $q = new CGI;
print $q->header();
print_top($q);
if ($q->param()){
display_results($q);
} else {
print_form($q);
}
print_end($q);
exit(0);
sub print_top{
print $q->start_html(
-title => 'test',
);
print "
title
";
}
sub print_end {
print "
bla bla";
print $q->end_html;
}
sub print_form {
my ($q) = @_;
print $q->start_form( -name => 'main', -method => 'POST',);
print 'Insert IP Address (dotted decimal notation. Es. 192.168.0.1 or 192.168.0.1-192.168.0.10 or 192.168.0.0/24)';
print '
';
print $q->textfield(-name => "host", -size => 30);
print '
';
print $q->submit(-value => 'Submit');
print $q->end_form;
}
sub display_results {
my ($q) = @_;
my @hosts;
my $ip = $q->param('host');
my $newip = new Net::IP ("$ip");
do { push @hosts,$newip->ip(); } while (++$newip);
my $thosts = $#hosts; $thosts++;
print "$thosts hosts to scan. Let's go...
";
my $start_time = [gettimeofday];
Net::Scan::Fork::settings(20,4,3,60);
foreach (@hosts){
Net::Scan::Fork::scan(\&scan,50,$_);
}
Net::Scan::Fork::wait_child;
my $end_time = [gettimeofday];
my $elapsed = tv_interval($start_time,$end_time);
print "
Completed in $elapsed seconds!
";
}
sub scan {
my $ip = shift;
chomp $ip;
$ip =~ s/^\s+|\s+$|\s+//g;
if ($ip =~ /^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$/ or $ip =~ /^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])-([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$/){
my $scan = Net::Scan::Ftp::Anonymous->new({
host => $ip,
timeout => 3,
verbose => 1,
debug => 0
});
my $results = $scan->scan;
print "$ip $results
" if $results;
}else{
print '
Error: no valid request.
';
}
}