#!/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.
';
}
}