#!/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); ----- $| = 1; my (@load,@pids); my ($load,$pid,$npids); my ($max_processes,$smax_processes,$nload,$sload,$sleep); sub settings{ ($smax_processes,$nload,$sload,$sleep) = @_; } sub scan{ my ($job,$max_processes,$host) = @_; my $oldmax_processes = $max_processes; @load = Sys::CpuLoad::load(); $load = $load[0]; if ($load > $nload){ $max_processes = $smax_processes; sleep $sleep; } else{ $max_processes = $oldmax_processes; } $pid = fork(); if ($pid>0){ $npids++; if ($npids >= $max_processes){ for (1..($max_processes)){ my $wait_ret=wait(); if ($wait_ret>0){ $npids--; } } } } elsif (undef $pid){ print " Fork error!\n"; exit(0); } else{ alarm 0; $job->($host); exit(0); } } sub wait_child{ for (1..$npids){ my $wt = wait(); } } 1; ----- foreach (@hosts){ Net::Scan::Fork::scan(\&scan,50,$_); } Net::Scan::Fork::wait_child; ------- $| = 1; my (@load,@pids); my ($load,$pid,$npids); my ($max_processes,$smax_processes,$nload,$sload,$sleep); sub settings{ ($smax_processes,$nload,$sload,$sleep) = @_; } sub scan{ my ($job,$max_processes,$host) = @_; my $oldmax_processes = $max_processes; @load = Sys::CpuLoad::load(); $load = $load[0]; if ($load > $nload){ $max_processes = $smax_processes; sleep $sleep; } else{ $max_processes = $oldmax_processes; } $pid = fork(); if ($pid>0){ $npids++; if ($npids >= $max_processes){ for (1..($max_processes)){ my $wait_ret=wait(); if ($wait_ret>0){ $npids--; } } } } elsif (undef $pid){ print " Fork error!\n"; exit(0); } else{ alarm 0; $job->($host); exit(0); } } sub wait_child{ for (1..$npids){ my $wt = wait(); } } 1; ------ 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])$/){ ------ $| = 1; sub scan { my $self = shift; my $host = $self->host; my $port = $self->port || 21; my $timeout = $self->timeout || 8; my $directory = $self->directory || 'test007'; my $user = $self->user || 'anonymous'; my $password = $self->password || 'postmaster@127.0.0.1'; my $verbose = $self->verbose || 0; my $debug = $self->debug || 0; my $ftp = Net::FTP->new( $host, Timeout => $timeout); my $results; if ($ftp){ if ($ftp->login($user,$password)){ if ($ftp->mkdir($directory)){ if ($verbose eq 0){ $results = "w"; } elsif ($verbose eq 1){ $results = "write access"; } $ftp->rmdir($directory); } else { if ($verbose eq 0){ $results = "r"; } elsif ($verbose eq 1){ $results = "read access"; } } } $ftp->quit; } else { $results = "ftp connection refused" if $debug; } return $results; } 1; ----- 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.

'; } }