Archivi tag: port scan

Avast! free e lo scan che non ti aspetti

Ieri, spulciando gli allarmi di Nagios relativi alla mia rete domestica, ho notato la presenza di una sequela di eventi di questo tipo:

***** Nagios HOME *****

 Notification Type: PROBLEM

 Service: HTTP Not Found
 Host: localhost
 Address: 127.0.0.1
 State: WARNING

 Date/Time: Sat Dec 26 09:04:58 CET 2015

 Additional Info:

 192.168.1.8 - - [26/Dec/2015:09:04:57 +0100] GET /HNAP1/ HTTP/1.1 404 204

ovvero il mio PC client (192.168.1.8) ha provato, in modo automatico, ad accedere a determinate URI HTTP, puntando all’indirizzo IP del suo default gateway (192.168.1.1). In particolare, il file /var/log/httpd/error_log di quest’ultimo riportava le seguenti hit:

[Sat Dec 26 09:04:57 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/HNAP1
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/rom-0
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] scrip not found or unable to stat: /var/www/cgi-bin/webproc
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/a2
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/ajaxmail
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/arr
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/at3
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/atc
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/atx
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/auth
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/bbs
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/bbs
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/bp_revision.cgi
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/br5.cgi
[Sat Dec 26 09:05:03 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/click.cgi
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/clicks.cgi
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/crtr
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/fg.cgi
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/findweather
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/findweather
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/frame_html
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/getattach
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/hotspotlogin.cgi
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/hslogin.cgi
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/ib
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/index.cgi
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/index
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/krcgi
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/krcgistart
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/link
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/login.cgi
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/login
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/logout
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/logout
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/mainmenu.cgi
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/mainsrch
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/msglist
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/navega
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/openwebmail
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/out.cgi
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/passremind
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/rbaccess
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/rbaccess
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/readmsg
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/rshop.pl
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/search.cgi
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/spcnweb
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/sse.dll
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/start
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/te
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/tjcgi1
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/top
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/traffic
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/verify.cgi
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/webproc
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/webscr
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/wingame.pl
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/das
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/fcgi-bin
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/fcgi-bin
[Sat Dec 26 09:05:04 2015] [error] [client 192.168.1.8] File does not exist: /var/www/html/redir

Alla luce di ciò mi sono allarmato, e, credendo che si trattasse di un malware, ho trascorso circa 2 ore tra scansioni antivirus (Avast! Free per l’appunto), Malwarebytes e SuperAntiSpyware, senza ottenere grandi risultati. Infine, giusto per scrupolo, sono andato a controllare il file /var/log/httpd/access_log che riportava lo UA (User Agent) utilizzato per accedere alle suddette URI. Di seguito ne riporto il contenuto:

192.168.1.8 - - [26/Dec/2015:09:04:57 +0100] "GET / HTTP/1.1" 200 - "-" "avast! Antivirus"
192.168.1.8 - - [26/Dec/2015:09:04:57 +0100] "GET /HNAP1/ HTTP/1.1" 404 204 "-" "avast! Antivirus"
192.168.1.8 - - [26/Dec/2015:09:05:03 +0100] "GET /rom-0 HTTP/1.1" 404 203 "-" "avast! Antivirus"
192.168.1.8 - - [26/Dec/2015:09:05:03 +0100] "GET /cgi-bin/webproc?getpage=/../../etc/passwd&var:language=en_us&var:page=* HTTP/1.1" 404 213 "-" "avast! Antivirus"

ovvero l’origine del presunto “attacco” era, molto semplicemente, Avast! free. Infatti, andando a spulciare tra le funzionalità del suddetto antivirus, ho notato la presenza della cosiddetta Protezione rete domestica, la quale non fa altro che scansionare il range di IP della LAN su cui è attestato il client, identificando i vari dispositivi connessi ed i servizi attivi su ciascuno di essi. avast In più, credendo che il mio default gateway fosse uno dei tanti home router dozzinali che si trovano ai discount, ha iniziato a ricercare le suddette URI palesemente vulnerabili (per maggiori info basta cercare home router vulnerabilities su Google).

Tutto è bene quel che finisce bene.

Alla prossima.

Gli IP Plan non aggiornati

In un ambiente enterprise mantenere un IP plan aggiornato è un’operazione alquanto ardua (soprattutto se coloro che devono gestire l’infrastruttura IT sono dislocati su sedi diverse).

 

networking.jpg

Quello che mi è capitato di recente mi ha fatto capire quanto un IP plan attendibile possa essere importante. Nello specifico, dopo aver installato e configurato un nuovo server, ho richiesto un indirizzo IP privato da poter assegnare alla suddetta macchina, senza creare eventuali conflitti con gli altri apparati già in produzione.

La prima cosa che ho fatto è stata quella di consultare l’IP Plan, scegliendo un indirizzo libero. Successivamente ho comunicato l’indirizzo in questione al sistemista network, il quale mi ha confermato la disponibilità dello stesso.

Per scrupolo ho effettuato un ping, il quale non ha fornito alcuna risposta, ergo tutti gli indizi mi lasciavano pensare che l’indirizzo scelto fosse effettivamente disponibile.

Fast forward di 30 minuti: una volta patchata la porta del server ed attestata sulla porta dello switch appartenente alla VLAN di riferimento, ho iniziato a ricevere degli ICMP echo reply a singhiozzo.

Tentando di connettermi via RDP alla suddetta macchina, con mio enorme stupore, ho notato che l’hostname del server su cui ero atterrato era differente da quello da me configurato, ergo vi era già una macchina che utilizzava l’indirizzo IP che credevo libero.

Nuovo giro di telefonate, altri check al volo e finalmente sono riuscito ad individuare un indirizzo IP effettivamente disponibile.

Contromisure

Per non incappare in una simile problematica è necessario aggiungere altri check al semplice ping ed alla consultazione dell’IP plan. Infatti, alcuni SO, quali Windows Server 2008 R2, hanno il firewall embedded configurato in modo da droppare le richieste ICMP. Quindi, per sincerarsi dell’effettiva disponibilità di un indirizzo, occorre dapprima consultare l’arp table dello switch su cui sono attestati i server della farm (generalmente trattasi di un core switch). Tale check va fatto a server disconnesso e partendo dal presupposto che non vi siano degli switch intermedi.

Per i Cisco, il comando da lanciare è il seguente:

Switch# sh arp | i <indirizzo IP>

Se l’arp table non restituisce alcun risultato significa che l’indirizzo IP scelto è libero. Ovviamente, se il server è stato disconnesso immediatamente prima di effettuare il suddetto controllo, è necessario aspettare che scada il cosiddetto aging time delle entry relative alla arp table (che varia in base alla tipologia ed al vendor dello switch, sempre che i valori impostati siano quelli di default).

Successivamente, a server connesso, si potrebbe individuare il MAC address della sua scheda di rete e controllare se l’associazione IP-MAC presente nella tabella ARP contiene il suddetto indirizzo fisico.

Infine, controllando le entry della CAM, ci si può sincerare che il MAC individuato sia stato letto sulla porta dello switch sul quale il server è effettivamente attestato.

Per i Cisco il comando da utilizzare è questo:

Switch# sh mac-address-table | i <indirizzo MAC>

Da notare che il MAC dovrà essere digitato nella forma aaaa.bbbb.cccc

In alternativa a tale procedura (che richiede comunque una certa familiarità con il networking), si potrebbe utilizzare un port scanner, ad esempio nmap.

Esiste anche una versione per Windows, scaricabile da qui, ed il comando da lanciare è il seguente:

nmap -P0 <indirizzo IP>

In particolare, con la flag -P0 sto imponendo al software di non lanciare dei ping preliminari per testare l’effettiva raggiungibilità dell’IP (evitando quindi i falsi negativi), procedendo immediatamente con la scansione delle porte.

State tranquilli, il port scan non è reato se non è seguito da dei tentativi di accesso non autorizzati (verificate comunque le policy aziendali prima di lanciarlo).

E’ tutto. Alla prossima.

Script bash per i port scan su range di IP

Problema

Mancato aggiornamento dell’associazione IP/FQDN (record A DNS) mediante ddclient, che si traduce nell’impossibilità di conoscere il vero indirizzo IP pubblico del server (essendo dinamico).

Possibile soluzione

Conoscendo l’ISP e partendo dal fatto che almeno una porta non standard ( > 1023) è pubblicata all’esterno (ad esempio la TCP 4338) si può procedere con la scansione automatizzata dei netblock appartenenti al nostro Internet Service Provider. Nella fattispecie, l’ISP è Telecom Italia ed alcuni dei netblock ad esso associati sono i seguenti:

79.46.0.0/15
79.56.0.0/16
62.77.32.0/19
62.211.0.0/16
77.238.3.3/19
79.140.80.0/20
80.104.0.0/15
80.116.0.0/15
80.180.0.0/15
80.204.0.0/15
80.241.224.0/20
81.72.0.0/22
81.112.0.0/20
82.48.0.0/20
82.88.0.0/22
82.104.0.0/22
83.175.0.0/18
83.221.96.0/18
89.221.32.0/18
93.186.128.0/20
95.74.0.0/15
95.224.0.0/11
188.8.0.0/13
195.14.96.0/19
195.22.192.0/19
212.171.0.0/16
212.216.0.0/16
213.45.0.0/16
213.144.160.0/19
213.230.128.0/19
217.27.64.0/19
217.169.96.0/20
217.169.112.0/20
217.172.192.0/19
217.200.0.0/14
217.222.0.0/15

E’ possibile inserire la suddetta lista all’interno di un apposito file testuale, chiamandolo semplicemente netblock. Inoltre, i netblock sono oggetto di continui aggiornamenti, ergo prima di procedere sinceratevi che appartengano ancora all’ISP di riferimento (attraverso un semplice whois <netblock>).

Una volta fatto ciò, mediante l’uso di nmap, possiamo realizzare uno script bash che si occupi di scansionare i suddetti range di IP pubblici. Lo script è il seguente:

nightfly@nightbox:~$ cat autoscanner.sh
#!/bin/bash

sourcefile=/home/nightfly/netblock

resfile=/home/nightfly/results

targetfile=/home/nightfly/openports

while read line
do

        nmap -P0 $line -p 4338 >> $resfile

done < $sourcefile

cat $resfile | grep -B2 open >> $targetfile

exit 0;

La logica dello script è questa:

1) viene lanciato uno scan verso ogni singolo range specificato nel file netblock, prendendo in considerazione esclusivamente la porta di destinazione TCP 4338;

2) una volta terminata la scansione vengono cercate tutte le occorrenze del termine open, considerando anche le due righe precedenti ad esso, in modo da ottenere l’IP pubblico degli host su cui la porta in questione risulta in ascolto;

3) a questo punto, supponendo che dietro la porta TCP 4338 vi sia in ascolto un demone SSH, è possibile lanciare delle sessioni Secure SHell verso ciascun IP specificato nel file /home/nightfly/openports. Se a tali tentativi di connessione seguirà una richiesta di login, è molto probabile che il nostro server sia stato effettivamente identificato. Ovviamente, se il login non andrà a buon fine, la macchina che stiamo cercando è un’altra.

Buona scansione.

PS: il port scan, di per se, non è reato, ma potrebbe diventarlo se lo associerete a più tentativi di login non autorizzati. Inoltre, essendo i netblock in questione piuttosto ampi, la scansione richiederà molto tempo.