Després d'una llarga aturada estiuenca, tornem amb una altra entrada, va haver una temporada que m'anava malament la meva connexió a internet, i tenia la sospita de que s'hi colava algun intrús a través de la wifi. Com que tinc una raspberry connectada a la xarxa, se'm va acudir de fer un scriptillo en perl que anés comprovant periòdicament els equips connectats i m'enviés un mail si n'hi havia algun de desconegut. Fa servir l'nmap per a escanejar, i cal tenir instal·lat sendmail, perl i el modul Mail::SendMail. L'script es el següent:
#!/usr/bin/perl use Mail::Sendmail; $usuari = `whoami`; if(!($usuari=~/^root/)){ print "No ets root!\n"; exit 1; } print "$retorn\n"; ####################################################################################################### #Canviar 192.168.1.0 pel rang d'IPs de la xarxa a escanejar i 192.168.1.200 per la IP de la raspberry # ####################################################################################################### my @result = `nmap -v -sn 192.168.1.0/24 | grep -v down | grep -v Parallel | grep -v 192.168.1.200`; my @ipmac; my $i = 0; #Buidar capçaleres del resultat nmap while(1){ if ($result[0] =~ /^Nmap scan report for /) {last;} shift @result; } #omplir array de ip+mac foreach $linia(@result){ if ($linia =~ /^Nmap scan report for /){ chomp($linia); $linia =~ s/Nmap scan report for //; push @ipmac, $linia; print "IP: ".$linia."\n"; }elsif ($linia =~ /^MAC Address: /){ chomp($linia); $linia =~ s/MAC Address: //; $linia = substr $linia,0,17; push @ipmac,$linia; print "MAC: ".$linia."\n"; } } #comptar IPs my $count=0; foreach $line(@ipmac){ if ($line=~/^\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3}$/){ $count++; } }
#comparar MACs conegudes amb llistat i comptar conegudes
print "---------------\n";
\$i=0;
\$trobades=0;
###################################################
# Ruta on hi ha el fitxer d'adreces MAC conegudes #
###################################################
open FILE,'/home/pi/scripts/maclist.txt' or die \$!;
my \@known=
close FILE;
my \$string="";
my \@resultat;
while(\$i\<\@ipmac){
\$trobada=0;
chomp \$ipmac[\$i];
if (\$i%2==0){
\$string=\$ipmac[\$i]." - ";
}else{
foreach \$linia(\@known){
\$mac = substr(\$linia,0,17);
if(\$mac=\~/\^\$ipmac[\$i]/){
\$ipmac[\$i] = \$ipmac[\$i]." - ".substr(\$linia,18,length(\$linia));
chomp \$ipmac[\$i];
\$trobades++;
\$trobada=1;
}
}
\$string=\$string.\$ipmac[\$i];
push(\@resultat,\$string);
\$string="";
}
\$i++;
}
print "Count: ". \$count ."\n";
print "Length: ".\$trobades."\n";
my \$message="";
\$num=\$count-\$trobades;
foreach \$linia (\@resultat){
\$message=\$message.\$linia."\n";
}
print "\n************************\n\n".\$message."\n************************\n\n";
if(\$num>0){
\$message=\$message."\nS'han trobat \$num desconegut(s) connectat(s), si el(s) coneixes, edita el fitxer maclist.txt per a afegir-lo(s)";
print "Alerta\n enviar mail!\n";
%mail = (
##########################
# Posar adreça de correu #
##########################
To => 'mail\@mail.com',
From => 'admin\@xarxa.loc',
Subject => "Acces wifi: \$num intrusos",
Message => \$message
);
sendmail(%mail) or die \$Mail::Sendmail::error;
print "OK. Mail enviat:\n",\$Mail::Sendmail::log;
}
Hi ha un fitxer d'adreces conegudes on d'entrada hi hauria d'haver com a mínim les adreces MAC del router i del propi ordinador que executa l'script (en el meu cas una raspberry) que té el següent format:
00:00:00:00:00:00 Router 00:00:00:00:00:00 Raspberry
A cada línia hi ha una adreça MAC, seguida d'un espai i una descripció per a la màquina.
Un cop tenim això ubicat, i canviades les línies de l'script amb les IPs de la nostra xarxa, la ruta del fitxer de MACs conegudes i l'adreça de mail on s'ha d'enviar l'alerta, només cal programar-ho al cron de l'usuari root, per a això, obrim una consola com a root, fem crontab -e, i editem el fitxer, jo tinc posat que s'executi cada 5 minuts:
*/5 * * * * perl /home/pi/scripts/scannet.pl > /dev/null 2>&1
I ja està, cada cop que s'executi i trobi una adreça MAC que no estigui a la llista de fitxers, ens enviarà un mail com el següent: