Blog : PERL

Scansione e Analisi vulnerabilità Sito Web: XAttacker Tool Software

Scansione e Analisi vulnerabilità Sito Web: XAttacker Tool Software

XAttacker è uno strumento scritto in perl capace di effettuare analisi di vulnerabilità di un sito web.  Dando come input l’indirizzo di un sito web, l’applicativo rileva in automatico il CMS utilizzato. Attualmente è in grado di rilevare vulnerabilità su WordPress, Joomla, Drupal, PrestaShop e LokoMedia.

Come installare XAttacker?

 

XAttacker può essere installato  direttamente dal  repository Github usando il seguente comando.

git clone https://github.com/Moham3dRiahi/XAttacker.git

Il processo di clonazione potrebbe richiedere un nome utente e una password per procedere. Un’altra opzione per ottenere lo strumento è scaricare il file ZIP dal repository github ed estrarre i file. I file decompressi possono essere visualizzati seguendo il percorso della cartella scaricata da XAttacker e elencando gli elementi della cartella utilizzando il seguente comando. La cartella deve contenere il file XAttacker.pl.

cd XAttacker-master
ls 

 

Scansione e exploit con XAttacker

Usare XAttacker è piuttosto semplice. Prima di tutto, salva il / i sito / i di destinazione in un file di testo. Nel passaggio successivo, esegui Xattacker utilizzando il seguente comando.

perl XAttacker.pl

Il comando chiede di selezionare una delle due opzioni relative all’elenco dei siti web di destinazione. Selezionare l’opzione appropriata e fornire il percorso del file contenente i siti Web di destinazione creati in precedenza. 

 

Se il sito Web di destinazione contiene il CMS supportato, lo strumento inizia a esplorare le vulnerabilità possibili. Ad esempio, in un sito WordPress, lo strumento cerca vulnerabilità in risorse come plug-in, moduli, codice php e temi specifici. Allo stesso modo, in Drupal, lo strumento cerca le vulnerabilità del pannello di amministrazione. Se non è stata trovata alcuna vulnerabilità nel sito Web di destinazione, lo strumento torna al passaggio iniziale.

 

Tuttavia, se XAttacker rileva una vulnerabilità, la sfrutta automaticamente se l’utente malintenzionato sceglie di farlo. 

Perl Random String Generator

Perl Random String Generator

Non si sa mai a qualcuno al volo può servire 🙂 Vi copio una funzione per la generazione casuale di stringhe in PERL o Perl Random String Generator. La funzione consente di passare una variabile numerica per specificare la lunghezza della stringa.

sub random_string_generator_perl
{
#lunghezza della stringa da generare
 my $length_of_random_string=shift;
# the random string to generate
my @chars=('a'..'z','A'..'Z','0'..'9');
 my $random_string;
 foreach (1..$length_of_random_string) 
 {
 $random_string_perl.=$chars[rand @chars];
 }
 return $random_string_perl;
}
my $randomID= &random_string_generator_perl(11);
Estrarre indirizzi email da Pagine Gialle

Estrarre indirizzi email da Pagine Gialle

Qualche annetto fa, ho avuto la necessità di (far finta 😉 ) di ottenere svariati indirizzi email dal portale Pagine Gialle per contattare qualche azienda di una determinata categoria merceologia. In quel periodo studiavo PERL quindi perché non provarci 🙂 Ora, a distanza di anni, ritrovo lo script e da bravo Opensourcer pubblico qui l’estrattore.

 

Non ho verificato se sia ancora possibile estrarre indirizzi email da Pagine Gialle poiché probabilmente il portale avrà cambiato qualche parametro. Sono sicuro però che con qualche semplice modifica può tornare funzionante 😉 .

 

NB: inviare e-mail ad indirizzi che non hanno prestato il consenso è reato. Lo script è rilasciato a scopo di ricerca, si diffida ogni uso illecito.

 

#! usr/bin/perl
$queryString='http://www.paginegialle.it/pgol/p-1/4-';
$keywords = $ARGV[0];
$location = $ARGV[1];
$raggio = $ARGV[2];
unless(open DATI, '>' . 'export.txt') {
die "\nNon è stato possibile creare il file di esportazione\n";
}
##########################################################################################################
######################## Creo il finto Browser ###########################################################
##########################################################################################################
#use strict; 
#use warnings; 
 
use LWP::UserAgent;
use HTTP::Cookies;
$ua = LWP::UserAgent->new();
print "Fake browser creato.\n";
$cookies = HTTP::Cookies->new(
file => "cookies.txt",
autosave => 1,
);
print "Ricezione cookies abilitata.\n";
$ua->cookie_jar($cookies);
print "Codifica cookies effettuata.\n";
$ua->agent("Windows IE 7");
print "Dichiarazione di essere il browser più scadente in circolazione comunicata ;)\n";
##########################################################################################################
######################## Rendo GET friendly la keyword della categoria da ricercare ######################
##########################################################################################################
$keywords =~ s/\s/%20/g;
$queryString=$queryString.$keywords;
##########################################################################################################
######################## Rendo GET friendly la location da ricercare #####################################
##########################################################################################################
if($location){
 $location =~ s/\s/%20/g;
 $queryString = $queryString."/3-".$location; 
}
##########################################################################################################
######################## Porto al massimo il numero di risultati per una pagina ##########################
##########################################################################################################
$queryString = $queryString."?mr=50";
##########################################################################################################
######################## Rendo GET friendly il raggio entro il quale devo cercare ########################
##########################################################################################################
if($raggio){
 if($raggio == '25'){
 $queryString = $queryString."?&enl=7";
 }elsif($raggio == '50'){
 $queryString = $queryString."?&enl=8";
 }elsif($raggio == '100'){
 $queryString = $queryString."?&enl=9";
 }else{
 die "Formato raggio non corretto. Inserire '25' '50' o '100'";
 }
}
print "Query string pronta.\n";
$pageNumber = 1;
##########################################################################################################
######################## Calcolo il numero di pagina da visualizzare #####################################
##########################################################################################################
for($i=1;$i<=$pageNumber;$i++){
$response = $ua->get($queryString);
 print "Scaricata la pagina $queryString di dimensione ".length($response->decoded_content)." bytes\n";
unless($response->is_success) {
 print "\nErrore nello scaricamento file HTML: " . $response->status_line."\n";
 }
$fileOut = "result-$i.html";
unless(open OUT, '>' . $fileOut) {
 die "\nNon è stato possibile creare il file '$fileOut'\n";
 }
print "Creato il file $fileOut\n";
# Setto la codifica
binmode(OUT, ":utf8");
print OUT $response->decoded_content;
close OUT;
$fileIn = "result-$i.html";
open(IN,$fileIn);
@contenuto=<IN>;
##########################################################################################################
######################## Verifico il numero di risultati trovati e lo memorizzo ##########################
##########################################################################################################
if($i==1){
 foreach (@contenuto){
 if ($_ =~/<span class="h-bold">(\d+)<\/span>/){
 $resultNumber= $1;
 print "Trovati $resultNumber risultati.\n";
 break; 
 }
 }
}
$pageNumber = $resultNumber/50;
$quote = $pageNumber/int($pageNumber);
if($quote!=1){
 $pageNumber = sprintf("%d", $pageNumber)+1;
}
foreach (@contenuto)
{
chomp ($_);
 if($_=~/<a title=\"Scheda Azienda (.+)\" class="_lms _noc"/)
 {
 $ragione_sociale = $1;
 $ragione_sociale =~ s/\&amp\;/\&/g;
 }
 elsif($_=~/\<span class\=\"street-address\"\>(.+)\, ([\w|\.|\s]+).+ class="locality">(\d\d\d\d\d) ([\w|\.|\s]+) \((\w\w)\)<\/span>/)
 {
 $civico = $1;
 $indirizzo = $2;
 $cap = $3;
 $citta = $4;
 $provincia = $5;
 }
 elsif($_=~/<div class="address">/){
 $inizio = 1;
 }
 elsif($inizio==1 && $_=~/<span class\=\"type\"> tel\:<\/span>/){
 $tel = 1;
 }
 elsif($inizio==1 && $_=~/^<span class=\"type\"> fax\:<\/span>/){
 $fax = 1;
 }
 elsif($tel==1 && (($_=~/^<span class="value">([\d|\s]+), ([\d|\s]+)<\/span>/) || ($_=~/<span class="value">([\d|\s]+)<\/span>/)) ){
 $tel1 = $1;
 $tel2 = $2;
 $tel = 0;
 }
 elsif($fax==1 && $_=~/^<span class="value">([\d|\s]+)<\/span>/ ){
 $fax1 = $1;
 $fax = 0;
 }
 elsif($inizio==1 && $_=~/<\/div>/ ){
 $inizio = 0;
 print DATI "$ragione_sociale,$indirizzo,$cap,$citta,$provincia,$tel1,$tel2,$fax1\n";
 }
}
close(IN);
#Ogni pagina visitata, setto la nuova pagina da visitare
$queryString =~ s/p-(\d*)/p-$i/;
}
close (DATI);
Dividere un file

Dividere un file

In alcuni casi, può succedere che si abbia bisogno di dividere un file in sottoparti. Un esempio può essere parsing su file con dimensioni molto grandi. In questo caso uno script non riuscirebbe ad effettuare l’analisi sul testo in quanto non basterebbe la memoria allocata dal Sistema Operativo. Per ovviare al problema, si potrebbe andare a modificare le dimensioni di memoria allocate ad esempio utilizzando il comando ulimit su Linux per modificare l’allocazione delle diverse sezioni. Un’altra strada, è rappresentata dalla divisione del file in multi parti utilizzando linux. Ammettendo di avere un file contenente numerosi indirizzi e-mail, di dimensioni 1,2 Gb e denominato e-mail.txt, potremo ricorrere su una shell al comando

split -b Xm nome_file prefisso

quindi nel nostro esempio

split -b 200m e-mail.txt multi-

otterremo una serie di file ogni 200Mb con nome multi-a, multi-b, multi-c ecc…