Urmia CTF y SNAKE CTF quals 2024-solución de algunos retos

1v0t
7 min readSep 9, 2024

--

Este fin de semana con el equipo jugamos 3 CTFs al tiempo, si .. 3.

Jugamos:

urmia CTF

snake CTF quals

y CSAW 24 quals, sin embargo los organizadores de CSAW prohibieron una vez finalizado el CTF hacer writeup hasta después de 24 hrs, entonces, por esa razón el writeup de este se hará mas adelante y en un post aparte.

Empecemos por los retos de urmia CTF

Lost Voyage

Este fue fácil, descubrimos que había una comunicación RTP. Solo fue cuestión de analizar el flujo de audio, descargarlo y escucharlo detenidamente.

Lo que pude entender del mensaje fue: iran underscore lut underscore desert. uctf{iran_lut_desert}

Catch me if you Can!

Para este reto estuvimos revisando las peticiones, filtramos el protocolo HTTP, aquí encontré un tipo de caracteres Raw.

Copiamos este texto en cyberchef para mirar que era y efectivamente es un imagen

Abajo de la imagen estaba un mensaje cifrado.

Probamos con varios tipos de cifrados hasta que usamos el cifrado cesar, solo fue usar decode para encontrar la flag:

UCTF{Tabriz_Grand_Bazaar}

Modal 2–200 puntos

Descripción: El reto me proporcionaba una serie de números grandes y mencionaba que el secreto estaba “enredado en números”. El archivo challenge.py sugería que los números habían sido generados utilizando un proceso de cifrado modular con una constante p = 4066351909. Además, la clave secreta (la flag) se ocultaba dentro de estos números cifrados.

Enfoque:

Después de revisar el código, noté que la fórmula usada para cifrar los caracteres de la flag era la siguiente:

valor cifrado=(ord(f)×2022684581−127389238)mod p\text{valor cifrado} = ( \text{ord}(f) \times 2022684581–127389238 ) \mod pvalor cifrado=(ord(f)×2022684581−127389238)modp

Donde f es un carácter de la flag.

Para revertir este proceso, necesitaba:

  1. Calcular el inverso modular de 2022684581 respecto a p.
  2. Aplicar este inverso a cada número cifrado, sumando previamente 127389238.

Solución:

Escribí un script en Python para calcular el inverso modular y luego revertí la ecuación para recuperar los valores originales de los caracteres cifrados. Una vez que obtuve los valores ASCII originales, los convertí a caracteres para formar la flag.

El código que utilicé fue el siguiente:

from sympy import mod_inverse

p = 4066351909
multiplier = 2022684581
subtractor = 127389238

encrypted_values = [
678296017, 867140740, 2721963345, 2868842574, 615347776, 1035002716, 2847859827, 1391709415,
2784911586, 636330523, 909106234, 2763928839, 1223847439, 699278764, 1223847439, 2742946092,
825175246, 3393411249, 2889825321, 3393411249, 1370726668, 594365029
]

inverse_multiplier = mod_inverse(multiplier, p)

def decrypt_value(value):
original = (value + subtractor) * inverse_multiplier % p
return original

decrypted_values = [decrypt_value(value) for value in encrypted_values]
flag = ‘’.join(chr(int(value)) for value in decrypted_values)

print(flag)

finalmente al ejecutar el script, obtuve la flag:
uctf{Sh1ny_pAsArg4d43}

El siguiente reto que resolvimos también era cripto.

Sergio — 250 puntos

Descripción del reto:

En este reto, nos encontramos con un sistema de RSA vulnerable utilizado por una organización de espías en Teherán. Nos proporcionaron un mensaje cifrado y una clave pública. Nuestra tarea era descifrar el mensaje, aprovechando la implementación defectuosa de RSA.

nos entregaron los siguientes archivos:

  • encrypted_message.txt: Contenía el mensaje cifrado.
  • public_key.txt: Contenía los valores de NNN y eee utilizados en RSA.

Despues de analizar los archivos entendimos que el objetivo era aprovechar esta debilidad y descifrar el mensaje. La clave pública proporcionada tenía una vulnerabilidad clásica: NNN, el módulo utilizado en el cifrado RSA, era lo suficientemente pequeño para ser factorizado.

para hacer mas claro la resolucion de este tipo de retos (personalmente no son mis favoritos), lo dividimos en 3 pasos:

Factorización de NNN: RSA se basa en la dificultad de factorizar NNN, pero en este caso era lo suficientemente pequeño. Utilicé sympy para factorizarlo y obtener ppp y qqq.

Cálculo de ddd: Con ppp y qqq, calculé ϕ(N)\phi(N)ϕ(N) y usé el inverso modular de eee para obtener la clave privada ddd.

Descifrar el mensaje: Con ddd, descifré el mensaje cifrado CCC utilizando la fórmula de RSA estándar, obteniendo el texto en claro.

Para lo anterior nos apoyamos del siguiente script escrito en python:

from sympy.ntheory import factorint
from Crypto.Util.number import inverse

N = 139551725550533062709001988886045836849
e = 65537
C = 70886407371304490355797613974913658205

factors = factorint(N)
p, q = factors.keys()

phi_N = (p — 1) * (q — 1)
d = inverse(e, phi_N)

M = pow(C, d, N)
flag = bytearray.fromhex(hex(M)[2:]).decode()

print(f”Flag: UCTF{{{flag}}}”)

Algunos retos de SNAKE CTF quals 2024

lamentablemente para este CTF el evento solo duro 1 dia, y fue algo interesante estar jugando en 3 en paralelo, sin embargo hicimos un par de retos.

El primero que resolvimos fue de OSINT

Unlucky Cactus

Puntos: 50
Descripción:
From KLGA to KSEA, via KCLT, encountering some unpleasant birds.
“Houston, we have a problem!”
What is the name of the superhero?

Formato de flag: snakeCTF{Name.Nickname.Surname}

La pista menciona varios códigos de aeropuertos:

  • KLGA: Aeropuerto LaGuardia (Nueva York).
  • KSEA: Aeropuerto Internacional Seattle-Tacoma.
  • KCLT: Aeropuerto Internacional Charlotte Douglas.

También menciona “unpleasant birds” (aves desagradables), lo que nos llevó a pensar en incidentes aéreos relacionados con colisiones con aves.

y La frase “Houston, we have a problem” es una referencia famosa a la misión espacial Apolo 13, lo cual nos hizo pensar en una conexión con una emergencia o héroe de la aviación o el espacio.

En este punto lo primero que hice fue buscar incidentes famosos por accidentes con aves y el primer resultado me llamo la atención (milagro en el hudson”

al final la flag que se espera es el nombre del super heroe , entonces realice la siguiente busqueda:

aqui nos dan un nombre , de hecho recorde haber visto la pelicula sully.

con lo anterior arme la siguiente flag la cual resulto ser valida:

snakeCTF{Chesley.Sully.Sullenberger}

el siguiente fue Remote storage

Nos dieron un archivo .pcap de una conexión empleando el protocolo ISCSI (el cual es para transferencia de archivos en la red), se filtra por el protocolo en wireshark y se le da tcp follow

Allí se puede ver la información movida, luego se encuentra una linea en base64 que al decodear nos permite obtener la flag

snakeCTF{st0rag3_0ver_tcp_b10c644d00734bcd}

El siguiente reto fue Cloudflared

Cloudflared

En este reto se nos proporciono un diagrama de red que muestra la implementación de un sistema. El objetivo es identificar cuál es el sitio accesible dentro de esta infraestructura.

Para comenzar, se analizan las peticiones de configuración realizadas a Cloudflare, lo que nos permite identificar dos dominios y dos puertos asociados.

Luego, se procede a revisar las configuraciones del router de borde, específicamente las reglas NAT. Aquí se descubre que solo una de las reglas NAT coincide con uno de los puertos configurados en Cloudflare, revelando así el puerto del servidor web local.

A continuación, se examina el tráfico de red por ese puerto utilizando la opción “TCP Follow”. El flujo capturado se exporta a un archivo .html que, al abrirse en el navegador, revela la flag esperada.

snakeCTF{s3lf_h0st1ng_i5_4wes0m3e_e1b6171928b5584a}

--

--

1v0t
1v0t

Written by 1v0t

OSINT, threat hunting, CTF, forensic analysis, hunting down bad guys to complete the puzzle.

No responses yet