logo Homepage
Pages: [1]
  Imprimer  
Auteur Fil de discussion: phpBB <= 2.0.17 "signature_bbcode_uid" Remote Command Execution Exp  (Lu 5386 fois)
sophoah
Profil challenge

Classement : 1749/54277

Néophyte
*
Hors ligne Hors ligne
Messages: 48


Voir le profil
« le: 13 Janvier 2006 à 22:52:04 »

Bonjour à tous,

Suite à l'epreuve 1 de hacking du forum phpBB j'ai voulu tester en local un autre hack. Et pour cela, je me suis basé sur l'exploit : http://www.frsirt.com/exploits/20051224.r57phpbb2017.pl.php

Apparement il marche, car il me cree bien le user, mais je comprends pas comment il m'affiche la commande d'un ls passé en paramètre du script et tout simplement voir le résultat du ls.

De plus, je n'ai pas compris comment le script fonctionne .. je sais qu'il y a un rapport avec la variable signature_bbcode_uid qui est initialisé en faisant un post sur la bonne page :
Code:
$path.'profile.php?GLOBALS[signature_bbcode_uid]=(.%2B)/e%00'
Dans le code phpbb on a un moment cette ligne :
Code:
$signature = ($signature_bbcode_uid != '') ? preg_replace("/:(([a-z0-9]+:)?)$signature_bbcode_uid(=|\])/si", '\\3', $userdata['user_sig']) : $userdata['user_sig'];
Donc j'imagine que '(.%2B)/e%00'' doit faire quelque chose mais quand on convertir l'hexa en ascii ca me donne quelque chose comme "(.+)/e" et c'est la que je bloque ...

De plus, d'après le site frsirt, on doit pouvoir faire de l'injection sql et la je bloque aussi ... je pense qu'il faut ajouter des choses dans l'initialisation de la variable mais vu que je ne sais comment ca marche ...
j'ai vu que preg_replace avec l'option e permet d'executer du code php mais je vois pas du tout comment l'intégrer au script ..


Merci d'avance pour vos lumières
Journalisée
Invit
Invité
« #1 le: 14 Janvier 2006 à 02:30:23 »

Il est tard et je découvre ton post un peu fatigué là, donc pas eu le temps de me pencher dessus, mais c'est interressant
Je pense pas qu'il s'agisse de convertir l'hexa en ascii, (.%2b)/e%00 à mon avis c'est une séquence d'échappement, le %00 c'est un octet NULL, en général ça augure rien de bon

Le mieux ce serait de trouver les lignes de codes incriminées directement et de faire la substitution, sans doute que l'explication apparaitrait plus clairement...
Journalisée
Nms

Profil challenge

Classement : 76/54277

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 794


Voir le profil
« #2 le: 14 Janvier 2006 à 14:16:50 »

héhéhé un bien bel exploit que celui-là... pour avoir pas mal bossé dessus et m'être fait mon propre exploit (différent de celui-ci mais je ne rentrerai pas dans les détails), je peux t'aider à le comprendre si tu veux.

Je t'explique le fonctionnement global du script, si tu veux plus de détails viens me voir sur le chan IRC: le 1er point à savoir c que la variable incriminée $signature_bbcode_uid n'est pas initialisée dans certains cas, autrement dit si tu te débrouilles bien, tu peux lui injecter la valeur que tu veux.
C'est là que ça se complique : si les variables globales sont autorisées sur le serveur où tu test cet exploit, alors tu vas pouvoir appliquer une technique très connue qui est l'overwrite du tableau des globales. Je ne me lancerai pas dans une explication à la BufferBob (lol) donc je te renvoie à un très bon article réalisée sur cette vulnérabilité de php à l'adresse suivante : http://www.hardened-php.net/globals-problem
Lis le bien et essaye de comprendre le principe. C'est grâce à cette vulnérabilité de PHP que tu vas arriver à donner la valeur adéquate à $signature_bbcode_uid . Il faut aussi savoir que ça ne marche pas sur toutes les versions de PHP (ce script ne marche que sur PHP < 5.0.5 il me semble).
Je ne m'attarde pas là dessus car c'est relativement compliqué et que tu apprendras bcp mieux en te documentant toi-même  Donc à ce moment là du script tu donnes la valeur que tu veux à $signature_bbcode_uid : très bien mais dans la plupart des cas ça ne donnerait pas grand chose... sauf ici! Parce que cette variable passe par un preg_replace et que la variable n'est pas du tout sécurisée. Comme tu l'as trouvé, preg_replace permet d'exécuter du code php dans le second argument, si le premier contient le "/e " modifier. Mais ce modifier doit être placé à la fin de ton 1er argument, juste avant le délimiteur. Or $signature_bbcode_uid n'est pas à la fin du 1er argument, il va donc falloir que tu fasses en sorte que ce qu'il y a après $signature_bbcode_uid dans le 1er argument du preg_replace soit ignoré : c'est là que tu utilises le fameux %00 qui est le code url pour le caractère NULL. Ce caractère a le très bon côté d'être considéré par PHP comme un signe de fin de chaine de caractères : si tu le places au milieu d'une chaine de carac, PHP ne regardera pas ce qu'il y a après, et considérera que ta chaine de carac s'arrête au dernier carac avant le carac NULL. C'est comme ça ici que tu t'en sors. Petite parenthèse : le %00 n'est interprété comme le carac NULL par PHP que si magic_quotes est sur off (à part dans une version spécifique de PHP 4, la 4.4.1 je crois), sinon il est transformé en \0 qui ne fait rien du tout lui. Il y a donc une ptite arnaque dans ce code....
Pour finir, si tu arrives à faire tout ce que j'ai dit avant, alors tu n'as plus qu'à mettre du code PHP dans le second argument du preg_replace et c'est gagné. Comme ce second argument, c'est ta signature dans ton profil, tu peux mettre ce que tu veux... Une fois que tu as tout fait proprement, il te suffit d'aller voir ton profil et normalement tu devrais voir apparaitre le résultat de ton code php (il faut bien sûr que ça affiche qqchose sinon tu exécuteras du code en aveugle).
Cet exploit est très joli mais il ne marchera que sur un nombre réduit de serveurs : il te faut PHP5 (en PHP4 **No Sms** la même méthode), register_globals sur ON, et magic_quotes sur OFF. Autant dire que ça ne marchera pas souvent... Perso j'ai fait un code bcp plus propre qui marche partout, sur toutes les configurations, mais qui a la gros désavantage d'exiger l'accès au panel d'admin Mais si t'es bon, tu sais qu'il y a des ptites CSS qui trainent dans PHPBB <= 2.0.19 et donc si t'as fait l'épreuve 13 de hack, tu sais comment les exploiter :p

Bon je m'arrête là c'est un aperçu très global et vulgarisé du fonctionnement du script. Si tu veux plus de détails, demande le ici ou sur le chan!
Journalisée

Ex Newbie Contest Staff :
Nms
Status :
Concepteur d'épreuves
Citation :
Je ne sais qu'une chose : que je ne sais rien. (Socrate)
Romano

Profil challenge

Classement : 1890/54277

Néophyte
*
Hors ligne Hors ligne
Messages: 48


Voir le profil WWW
« #3 le: 14 Janvier 2006 à 14:23:20 »

Salut, j'ai regardé un peu cette faille, je vais vous expliquez (pour ceux qui ne comprenne pas).

Enfaite le (.%2b)/e%00 est injecté dans le premier argument de preg_replace() de façon a evaluer (/e) le second argument de preg_replace (ce qui en faite executera le code comme du code php). Le %00 est un null byte qui permet d'annuler ce qui est après ((\])/si). le (.%2b) c'est pour satistfaire la condition $3 (ou \\3).

Ensuite tu peux injecter du code php via $userdata['user_sig'] en le placant après : pour que preg_replace() fasse son boulot
Journalisée
Nebelmann

Profil challenge

Classement : 462/54277

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1357


Voir le profil
« #4 le: 14 Janvier 2006 à 14:29:10 »

c'est marrant, parce qu'en gros vous avez dit la même chose tous les deux
Journalisée

-- Nebelmann -- Registered linux user #429186
«Si les lecteurs étaient des compilateurs, les posteurs feraient peut-être davantage attention à ce qu'ils écrivent...»
Nms

Profil challenge

Classement : 76/54277

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 794


Voir le profil
« #5 le: 14 Janvier 2006 à 14:58:53 »

Romano a donné une explication exacte et précise, mais plus technique comme ça y en a pour tous les gouts
Journalisée

Ex Newbie Contest Staff :
Nms
Status :
Concepteur d'épreuves
Citation :
Je ne sais qu'une chose : que je ne sais rien. (Socrate)
Invit
Invité
« #6 le: 14 Janvier 2006 à 18:16:33 »

Citation de: Nms
Je ne me lancerai pas dans une explication à la BufferBob (lol)
Mais...

Ceci dit tu t'en est pas mal tiré non plus (en tout cas merci, nickel le post )
Journalisée
sophoah
Profil challenge

Classement : 1749/54277

Néophyte
*
Hors ligne Hors ligne
Messages: 48


Voir le profil
« #7 le: 14 Janvier 2006 à 18:38:18 »

Ok merci beaucoup à tous pour vos explications !

Mais j'aurais une autre question pourquoi la chaine doit elle est codée en hexa ? (je vois l'interet qu'il y a pour le %00 qui le caractère qui termine la chaine et qu'on ne peut pas représenter en ascii) mais pour le reste ?

Sophoah
Journalisée
Nms

Profil challenge

Classement : 76/54277

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 794


Voir le profil
« #8 le: 14 Janvier 2006 à 19:00:45 »

Tout simplement parce que ça passe par l'url! Parce que si tu essayes de faire passer un "+" via l'url php va interpréter ça comme un espace, tandis que là en le faisant passer en hexa avec %2B, le pb ne se pose plus.
Journalisée

Ex Newbie Contest Staff :
Nms
Status :
Concepteur d'épreuves
Citation :
Je ne sais qu'une chose : que je ne sais rien. (Socrate)
sophoah
Profil challenge

Classement : 1749/54277

Néophyte
*
Hors ligne Hors ligne
Messages: 48


Voir le profil
« #9 le: 14 Janvier 2006 à 20:50:37 »

Ah oue, j'y avais pas pensé !! Merci pour tout !! Vais voir ce que je peux faire maintenant !!
Journalisée
Pages: [1]
  Imprimer  
 
Aller à: