Analizzare con bash lunghe liste di siti via terminale

Tempo di lettura: 6 minuti

Quando si ha a che fare con lunghe liste di domini e sottodomini, è utile trovare il modo per velocizzare la procedura di verifica dell’esistenza del sito e dei servizi che offre lo stesso. Ciò che, da sempre, cercano di fare gli informatici d’altronde è l’automatizzare, tramite linguaggi di scripting (bash, python, perl), qualsiasi azione noiosa e ripetitiva.

Verifica esistenza dominio

Una volta ottenuta una lista di sottodomini (alcuni metodi in questo articolo), è possibile che lo stesso utilizzi wildcard, o abbia centinaia di sottodomini esistenti, rendendo un footprinting infinito e, di fatto, noioso.

Esempio di file con domini multipli
Esempio di file con domini multipli

Quindi la prima azione da eseguire è verificare se il dominio esista, e nel caso, se sia online o meno (è anche probabile che sia stato utilizzato anni prima e ora non più). Io utilizzo due metodi:

  1. Comando curl, il quale verifica con una semplice connessione se è online ed esistente;
  2. Script in python, preso da github.

Per quanto riguarda il comando curl, la stringa è

xargs -n1 -P 20 curl -o /dev/null --silent --head --user-agent "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0" --write-out '%{url_effective} ; %{http_code} ; %{redirect_url} ; %{remote_ip}\n' < subdomainTMP.txt | tee up-$site

Dove:

  • xargs permette di eseguire curl e la lista di input subdomainTMP.txt;
  • –user-agent identifica, chiaramente, l’User Agent;
  • –write-out salva la variabili tra le parentesi graffe (nel manuale di curl ce ne sono altre, nel caso vi servissero maggiori informazioni).

Mettiamo caso che il file contenente la lista dei sottodomini si chiami subdomainTMP.txt, un possibile script bash per unire i due tools potrebbe essere

#!/bin/bash

site="$1"

if [ -e subdomainUP$site.txt ];
then
    echo "File subdomainUP$site.txt già presente"
else
    python online.py subdomainTMP.txt subdomainUP$site.txt
fi

if [ -e up$site.txt ];
then 
    echo "File up$site.txt già presente"
else
    xargs -n1 -P 20 curl -o /dev/null --silent --head --user-agent "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0" --write-out '%{url_effective} ; %{http_code} ; %{redirect_url} ; %{remote_ip}\n' < subdomainTMP.txt | tee up-$site #verifica se up o down awk '$3 > 000' up-$site > up$site.txt
    rm up-$site  
fi
    cat up$site.txt | awk {'print $1'} > subdomainUP.txt

sed 's/http:[//][//]//;s/[//]//' subdomainUP.txt > subdomainTMP.txt
cat subdomainTMP.txt > subdomainUP.txt
cat subdomainUP.txt > temp.txt
cat subdomainUP$site.txt >> temp.txt
sort -u temp.txt > subdomainUP.txt

In questo modo abbiamo ora il file subdomainUP contenente la lista dei domini online e in esecuzione.

Screenshot via terminale

L’idea di aprire ogni sito e analizzarlo uno ad uno è quanto mai irrealizzabile, perciò utilizzeremo un software che lo farà per noi, webscreenshot. Possiamo aggiungere il comando al file di prima, automatizzando nuovamente il processo

if [ -d screenline ];
then
    echo "! Screen gia presi, passo oltre !"
else
    python webscreenshot.py -i subdomainUP.txt -o screenline
fi

Una volta avviato e completata l’esecuzione, ci troveremo comodamente gli screenshot di tutti i siti presenti nella lista

Alcuni screenshot effettuati
Alcuni screenshot effettuati

Nel caso siano ancora tanti, si può sempre ordinare per dimensione, andando ad eliminare quelli uguali o quelli con errori.

Conclusioni

Una volta decisi i domini da analizzare possiamo passare la lista a nmap, whatweb o ad altri sofware che, sempre in maniera automatica, eseguono un footprinting dei servizi. del sistema operativo.  Alcune righe di esempio:

while read line; do
  nmap -sC -T4 $line --top-ports 1000 --script default,discovery,safe 
  whatweb -a 3 $line
done < subdomainUP.txt

Come avete visto, sta solo alla vostra immaginazione cos’altro aggiungere. Basta fare un giro su Github, trovare script o software che potrebbero fare al caso vostro, ed inserirli in un comodo file bash!