use IO::Socket; use threads; use threads::shared; use warnings; $0 =~ s/.*\\//; die "usage: $0 <-p/-web/-ban> \n" unless ($ARGV[4]); $choice = $ARGV[0]; $port = $ARGV[1]; $first = $ARGV[2]; $second = $ARGV[3]; $maxthreads = $ARGV[4]; unless ($choice =~ /^-p$|^-web$|^-ban$/) { die "usage: $0 <-p/-web/-ban> \n"; } my $threads : shared = 0; my $found : shared = 0; my $count : shared = 0; open(OUTPUT,">>pscan.txt"); OUTPUT->autoflush(1); STDOUT->autoflush(1); $f = inet_aton($first); $s = inet_aton($second); $f_ip = unpack('N', $f); $s_ip = unpack('N', $s); for ($o = $f_ip; $o < $s_ip; $o++) { $o = pack('N', $o); $ip = inet_ntoa($o); push @range, $ip; $o = unpack( 'N', $o ); } $size = @range-1; for ($i = 1; $i <= $maxthreads; $i++) { $thr = threads->create(\&scan); $thr->detach(); } while ($threads > 0) { $percent = ($count/$size)*100; $percent = sprintf("%.1f", $percent); print "THREADS: $threads || STATUS: $percent% || FOUND: $found\t\r"; } close(OUTPUT); print "THREADS: $threads || STATUS: $percent% || FOUND: $found\t\r"; exit; sub scan() { {lock($threads);$threads++;} while($count <= $size) { unless (defined($range[$count])) { {lock($count);$count++;} next; } $sock = new IO::Socket::INET (PeerAddr => $range[$count],PeerPort => $port, Proto => "tcp", Timeout => 2); if ($sock) { if ($choice =~ /^-p$/) { {lock($found);$found++;} print OUTPUT $range[$count].":".$port."\n"; } elsif ($choice =~ /^-web$/) { print $sock "HEAD / HTTP/1.0\012\012"; while (<$sock>) { chomp($_); if ($_ =~ /^Server: (.*)$/) { {lock($found);$found++;} $ban = $1; chomp($ban); $ban =~ s/\n|\r//g; print OUTPUT $range[$count].":".$port." [".$ban."]\n"; last; } } } elsif ($choice =~ /^-ban$/) { {lock($found);$found++;} print $sock "GET / HTTP/1.0\n\n"; while (<$sock>) { chomp($_); $_ =~ s/\n|\r//g; print OUTPUT $range[$count].":".$port." [".$_."]\n"; last; } } close $sock; } {lock($count);$count++;} } {lock($threads);$threads--;} }