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:
- Calcular el inverso modular de
2022684581
respecto ap
. - 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 inverseN = 139551725550533062709001988886045836849
e = 65537
C = 70886407371304490355797613974913658205factors = 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}