diff --git a/2025/MilaConPapasFritas/CTF1-Ancient Mistery /readme.md b/2025/MilaConPapasFritas/CTF1-Ancient Mistery /readme.md new file mode 100644 index 0000000..c4eb8a4 --- /dev/null +++ b/2025/MilaConPapasFritas/CTF1-Ancient Mistery /readme.md @@ -0,0 +1,35 @@ +# CTF Ancient Mystery +Url del ctf: https://kashictf.iitbhucybersec.in/challenges#Ancient%20Mystery-4 + +Date 03 April, 12:00 UTC — 04 April 2026, 12:00 UTC + +Es un desafio de Cryptography +Screenshot_294 +## Entendiendo el reto +El enunciado dice: + +* Un mensaje secreto desde la epoca del Mahabharata(3136 a.C) +* Cada 64 años se recodifica el mensaje +* Han pasado 3136 años hasta la era comun +* 3136 / 64 = 49 ciclos de recodificacion +* El formato de la flag debe ser kashiCTF{...} +* Un archivo de texto “secret_message.txt” +## Analisis del archivo descargado +El archivo secret_message.txt contiene una cadena muy larga que comienza con: +Vm0wd2QyUXlVWGxWV0d4V1YwZDRWMVl3WkRSV01WbDNXa1JTVjAxV2JETlhhMUp… + +* Solo contiene letras mayusculas y minusculas +* Estructura típica de Base64 +* Al decodificar una vez, se obtiene otra cadena similar, lo que indica multiples capas +## Proceso de decodificacion +Si cada 64 años se aplicaba una codificación Base64, tras 49 ciclos tendriamos 49 capas de Base 64 + +Solución implementada en Python: +Screenshot_292 +## Resultado +Al ejecutar el script, despues de varias decodificaciones (49 veces), se obtiene un texto que comienza con flag{..} +Screenshot_293 + +La flag aparece como flag{th3…} se tiene que cambiar el prefijo por kashiCTF{..} ya que lo dice el enunciado por lo que queda +**kashiCTF{th3_s3cr3t_0f_mah4bh4r4t4_fr0m_3136_BCE}** + diff --git a/2025/MilaConPapasFritas/CTF1-Ancient Mistery /solve.py b/2025/MilaConPapasFritas/CTF1-Ancient Mistery /solve.py new file mode 100644 index 0000000..5bb4470 --- /dev/null +++ b/2025/MilaConPapasFritas/CTF1-Ancient Mistery /solve.py @@ -0,0 +1,24 @@ +import base64 + +# Leer el contenido del archivo +with open("secret_message.txt", "r") as f: + data = f.read().strip() + +# Decodificar hasta 50 veces +for i in range(50): + try: + # Decodificar + data = base64.b64decode(data).decode('utf-8') + + # Mostrar progreso + print(f"Capa {i+1}: {data[:50]}...") + + # Si encontramos la flag en formato kashiCTF, terminamos + if data.startswith("kashiCTF{") or data.startswith("flag{"): + print(f"\nFLAG encontrada en capa {i+1}:") + print(data) + break + + except Exception as e: + print(f"Error en capa {i+1}: {e}") + break diff --git a/2025/MilaConPapasFritas/CTF2-Browser Boss Fight/readme.md b/2025/MilaConPapasFritas/CTF2-Browser Boss Fight/readme.md new file mode 100644 index 0000000..605c403 --- /dev/null +++ b/2025/MilaConPapasFritas/CTF2-Browser Boss Fight/readme.md @@ -0,0 +1,42 @@ + +# Browser Boss Fight-WriteUp +## Categoría: Web + +### Descripción del desafío: + +### El desafío nos presenta una página con solo un input para ingresar una “key”. + +image1-bbf + + + + + +### Si inspeccionamos el código, observamos que no importa cual sea el input ingresado, el valor del input se cambia a “WEAK_NON_KOOPA_KNOCK”. + +image2-bbf + + + +### Si probamos cualquier input obtenemos el siguiente mensaje en pantalla. Ademas podemos visualizar la cabecera “server” que contiene una pista : “In case you forget the key, check under_the_mat” +image3-bbf + + +### Ahora haciendo uso de burp suite y de la pista, interceptamos la peticion para cambiar el valor constante de key por “under_the_mat”. +image4-bbf + +### Y asi logramos el acceso a la siguiente pagina: +image5-bbf + +### Como vemos el texto dice “i removed the axe”, si inspeccionamos encontramos que tiene hasAxe=false: +image6-bff + +### Si interceptamos nuevamente la petición get y modificamos el valor por true: +image7-bbf + + +### Finalmente obtenemos la flag: +image8-bbf + +## Flag obtenida : UMASS{br0k3n_1n_2_b0wz3r5_c4st13} + diff --git a/2025/MilaConPapasFritas/CTF3-Cripto Visor/CryptoVisor.txt b/2025/MilaConPapasFritas/CTF3-Cripto Visor/CryptoVisor.txt new file mode 100644 index 0000000..5d6411a --- /dev/null +++ b/2025/MilaConPapasFritas/CTF3-Cripto Visor/CryptoVisor.txt @@ -0,0 +1,4 @@ +CryptoVisor +----------- + +*@F 92G6 7@F?5 :E] ~FC DFCG6:==2?46 E62> :?E6C46AE65 2 EC2?D>:DD:@? 7C@> :?D:56 E96 %C256':D@C ?6EH@C<] %96 286?E FD65 2 4:A96C E@ AC@E64E E96 >6DD286] qFE 42? J@F 564CJAE E96 D64@?5 >6DD286n |2J36 ECJ FD:?8 D@>6 D@CE @7 #~% 564CJAE:@? 2D H6==] {39 F?:C @63IC2 G283 8FC v6?BCxG736 2C8;36I ?2B F?:C 6CACG:CB 8FC DJ?E] vFC DJ?E G7 HA8DLcA@BA!_"Al$#@B_(0$N diff --git a/2025/MilaConPapasFritas/CTF3-Cripto Visor/readme.md b/2025/MilaConPapasFritas/CTF3-Cripto Visor/readme.md new file mode 100644 index 0000000..2f35b19 --- /dev/null +++ b/2025/MilaConPapasFritas/CTF3-Cripto Visor/readme.md @@ -0,0 +1,16 @@ +# X-Ray Vision +## Categoría: Web +### Tenemos el siguiente enunciado: +criptoenun + +### La traducción es : “Nuestro equipo de vigilancia interceptó una transmisión desde el interior de la red TradeVisor. El agente utilizó un cifrado para proteger el mensaje. Decodificalo, recupera la clave de acceso y envíala para desbloquear la bóveda.” +### Además nos proporciona un archivo .txt con el mensaje. +### Observando el texto que aparece en el archivo, sospechamos de que podría estar cifrado con algún tipo de rot, probando obtenemos con rot47 el siguiente texto: +rot47 + +### Como vemos todavía no obtenemos la flag , pero si otra pista: el segundo mensaje también está cifrado en algún tipo de rot. +### Si aplicamos rot13 sobre el texto anterior +rot13 + +### Finalmente obtenemos la flag : jctf{4cbdcC0Dc=FEbd0J_F} +### Ejecutando el script solve.py se obtiene la flag de manera automatica. diff --git a/2025/MilaConPapasFritas/CTF3-Cripto Visor/solve.py b/2025/MilaConPapasFritas/CTF3-Cripto Visor/solve.py new file mode 100644 index 0000000..9a241af --- /dev/null +++ b/2025/MilaConPapasFritas/CTF3-Cripto Visor/solve.py @@ -0,0 +1,65 @@ +import codecs +import re + +def rot47_decodificar(texto): + resultado = [] + for char in texto: + codigo = ord(char) + if 33 <= codigo <= 126: # Rango de caracteres imprimibles + # Aplica ROT47 (desplazamiento de 47) + nuevo_codigo = 33 + ((codigo - 33 + 47) % 94) + resultado.append(chr(nuevo_codigo)) + else: + resultado.append(char) # Mantiene caracteres especiales como saltos de línea + return ''.join(resultado) + +def rot13_decodificar(texto): + return codecs.decode(texto, 'rot_13') + + +def extraer_flag(texto): + # Busca el patrón jctf{...} de la flag + patron = r'jctf\{[^}]*\}' + coincidencias = re.findall(patron, texto) + + if coincidencias: + return coincidencias[0] + + return None + +def decodificar_doble(archivo_entrada): + + with open(archivo_entrada, 'r', encoding='utf-8') as f: + contenido = f.read() + # Aplica ROT47 + rot47_resultado = [] + for char in contenido: + codigo = ord(char) + if 33 <= codigo <= 126: + nuevo_codigo = 33 + ((codigo - 33 + 47) % 94) + rot47_resultado.append(chr(nuevo_codigo)) + else: + rot47_resultado.append(char) + + # Aplica ROT13 al resultado de ROT47 + resultado_intermedio = ''.join(rot47_resultado) + final = codecs.decode(resultado_intermedio, 'rot_13') + + return final + +if __name__ == "__main__": + archivo = "CryptoVisor.txt" + try: + texto_final = decodificar_doble(archivo) + flag = extraer_flag(texto_final) + + if flag: + print(f" FLAG ENCONTRADA: {flag}") + else: + print("\n No se encontró flag con formato jctf{}") + print("\nTexto completo decodificado:") + print(texto_final) + except FileNotFoundError: + print(f"Error: No se encontró el archivo '{archivo}'") + except Exception as e: + print(f"Error durante la decodificación: {e}") \ No newline at end of file diff --git a/2025/MilaConPapasFritas/CTF4-X-Ray Vision/readme.md b/2025/MilaConPapasFritas/CTF4-X-Ray Vision/readme.md new file mode 100644 index 0000000..c5de8be --- /dev/null +++ b/2025/MilaConPapasFritas/CTF4-X-Ray Vision/readme.md @@ -0,0 +1,38 @@ +# X-Ray Vision +## Categoría: Web + +### Tenemos el siguiente enunciado: +enun + +En el enunciado nos da la pista que hay una credencial olvidada en alguna parte de la página web, y que no está en texto plano. + +La página web nos muestra: +web + +Lo único interactivo es el boton de “query api”, si hacemos click obtenemos: +hint0 + +Nos aparece el mensaje: “status: unathorized missing token”. Con esta pista lo que hacemos es inspeccionar la pagina con burp suite y encontramos: +x-secret-token +token + +Con esta nueva información, interceptamos la petición que se hace al hacer click en “query api”, y agregamos la cabecera “x-secret-token” con el valor que aparece en data-t. +intercept1 + +Al hacer forward, obtenemos ahora +hint1 + +Si tomamos el valor del token anterior y probamos decodificarlo con rot13, obtenemos: +rot13web + + +Se obtiene : “d3v3l0p3r_t00l5”, esta no es la flag, asi que probamos interceptar de nuevo la peticion a /api , agregando de nuevo la cabecera de “x-secret-token” con el nuevo valor: +intecept2 + + +Finalmente obtenemos: +zoomflag + + +Flag: jctf{r0t_y0ur_w4y_t0_4cc3ss} + diff --git a/2025/MilaConPapasFritas/readme.md b/2025/MilaConPapasFritas/readme.md new file mode 100644 index 0000000..b9a222c --- /dev/null +++ b/2025/MilaConPapasFritas/readme.md @@ -0,0 +1,15 @@ +# TeamMilaConPapasFritas +## Integrantes +### Aguilar Jose 10428/4 +### Delgado Daniela 15005/5 +## Los writeups corresponden a los siguientes retos: + +### | KashiCTF’26 | [https://kashictf.iitbhucybersec.in/challenges](https://kashictf.iitbhucybersec.in/challenges) | Ancient Mistery | Criptography | +### | UMassCTF 2026 | [https://ctf.umasscybersec.org](https://ctf.umasscybersec.org/challenges)/ | BrOWSER BOSS FIGHT | Web | +### | Jersey CTF VI | [https://ctf.jerseyctf.com/](https://ctf.jerseyctf.com/) | Crypto Visor | Criptography | +### | Jersey CTF VI | [https://ctf.jerseyctf.com/](https://ctf.jerseyctf.com/) | X-Ray Vision | Web | + +Los ctf se desarrollaron los siguientes días: + +* UMassCTF 2026 : 10PM UTC April 10 – 10PM UTC April 12, 2026 +* Jersey CTF VI : Sat, Apr 18th 2026, 1:00 PM (-03:00) \- Sun, Apr 19th 2026, 1:00 PM (-03:00) .