1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| #!/usr/bin/perl -wT
use CGI;
use File::Temp 'tempfile';
use Text::CSV;
use strict;
$ENV{'PATH'} =~ /(.*)/; $ENV{'PATH'} = $1; # pour pouvoir faire un appel système en mode "protégé" (taint)
# initialise les requètes CGI
my $q = CGI->new();
print $q->header(-type => 'text/html');
print $q->start_html( -title => 'SSH port status on the network');
# crée les fichiers temporaires
my ($text_file, $text_filename) = tempfile('temp_XXXX', DIR => '/tmp', SUFFIX => '.txt', UNLINK => 0);
my ($csv_file, $csv_filename) = tempfile('temp_XXXX', DIR => '/tmp', SUFFIX => '.csv', UNLINK => 0);
my $csv = Text::CSV->new;
$csv->print($csv_file, ['ip', 'status']);
# scanne les machines de mon réseau avec nmap (parsing brutal !)
my %status = map { $1, $2 if m/((?:\d+\.){3}\d+).*?((open|closed|filtered))/s }
split /\n\nInteresting/, `/usr/local/bin/nmap -p 22 192.168.2.*`;
# affiche les données dans le navigateur et écrit les fichiers texte et CSV
print $q->h1("Report");
for my $ip (keys %status) {
print $q->p("SSH port is $status{$ip} on host $ip");
print $text_file "SSH port is $status{$ip} on host $ip\n";
$csv->print($csv_file, [$ip, $status{$ip}]);
}
# affiche les liens de téléchargement dans le navigateur
print $q->h1("Download");
print $q->a( {-href => "/cgi-bin/download.pl?filename=$csv_filename"}, 'CSV file' );
print $q->br;
print $q->a( {-href => "/cgi-bin/download.pl?filename=$text_filename"}, 'Text file' );
print $q->end_html;
__END__ |
Partager