Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions 2025/MilaConPapasFritas/CTF1-Ancient Mistery /readme.md
Original file line number Diff line number Diff line change
@@ -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
<img width="482" height="589" alt="Screenshot_294" src="https://github.com/user-attachments/assets/b7355d69-6514-44d8-8a58-ecd0f5ac0115" />
## 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:
<img width="515" height="407" alt="Screenshot_292" src="https://github.com/user-attachments/assets/663c881e-a364-4a94-a074-694dd0f4c3ef" />
## Resultado
Al ejecutar el script, despues de varias decodificaciones (49 veces), se obtiene un texto que comienza con flag{..}
<img width="418" height="180" alt="Screenshot_293" src="https://github.com/user-attachments/assets/48604383-ad2b-4dfb-937b-44fe45633612" />

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}**

24 changes: 24 additions & 0 deletions 2025/MilaConPapasFritas/CTF1-Ancient Mistery /solve.py
Original file line number Diff line number Diff line change
@@ -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
42 changes: 42 additions & 0 deletions 2025/MilaConPapasFritas/CTF2-Browser Boss Fight/readme.md
Original file line number Diff line number Diff line change
@@ -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”.

<img width="1365" height="728" alt="image1-bbf" src="https://github.com/user-attachments/assets/d174ec2d-785e-4953-984c-cef34d58b6f6" />





### 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”.

<img width="1365" height="729" alt="image2-bbf" src="https://github.com/user-attachments/assets/e9579253-2d4e-416c-8061-534f24118fa8" />



### 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”
<img width="1331" height="438" alt="image3-bbf" src="https://github.com/user-attachments/assets/6adc49e0-d7ed-4fb7-8a8f-4469e7754d40" />


### Ahora haciendo uso de burp suite y de la pista, interceptamos la peticion para cambiar el valor constante de key por “under_the_mat”.
<img width="1365" height="724" alt="image4-bbf" src="https://github.com/user-attachments/assets/f70d8912-659a-4d94-aced-21db724c4e24" />

### Y asi logramos el acceso a la siguiente pagina:
<img width="1355" height="657" alt="image5-bbf" src="https://github.com/user-attachments/assets/662ba8a2-dac2-41ad-88c6-165144b97f42" />

### Como vemos el texto dice “i removed the axe”, si inspeccionamos encontramos que tiene hasAxe=false:
<img width="1007" height="101" alt="image6-bff" src="https://github.com/user-attachments/assets/8703de20-df5f-4ec2-93ac-7cc4f510d895" />

### Si interceptamos nuevamente la petición get y modificamos el valor por true:
<img width="1365" height="728" alt="image7-bbf" src="https://github.com/user-attachments/assets/10928b82-bd9e-4c2b-a62e-aff04d60a94c" />


### Finalmente obtenemos la flag:
<img width="1365" height="728" alt="image8-bbf" src="https://github.com/user-attachments/assets/015f165a-48bc-499d-a589-2ca5bce7b413" />

## Flag obtenida : UMASS{br0k3n_1n_2_b0wz3r5_c4st13}

4 changes: 4 additions & 0 deletions 2025/MilaConPapasFritas/CTF3-Cripto Visor/CryptoVisor.txt
Original file line number Diff line number Diff line change
@@ -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
16 changes: 16 additions & 0 deletions 2025/MilaConPapasFritas/CTF3-Cripto Visor/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# X-Ray Vision
## Categoría: Web
### Tenemos el siguiente enunciado:
<img width="521" height="530" alt="criptoenun" src="https://github.com/user-attachments/assets/77428f4c-1099-4af4-a6c9-cf11dc1c22e7" />

### 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:
<img width="1342" height="726" alt="rot47" src="https://github.com/user-attachments/assets/f7fb7f40-91f0-4287-bbb5-15a3796d06bc" />

### 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
<img width="1083" height="495" alt="rot13" src="https://github.com/user-attachments/assets/441b0beb-1edc-400f-afe6-dff76e6a5f28" />

### Finalmente obtenemos la flag : jctf{4cbdcC0Dc=FEbd0J_F}
### Ejecutando el script solve.py se obtiene la flag de manera automatica.
65 changes: 65 additions & 0 deletions 2025/MilaConPapasFritas/CTF3-Cripto Visor/solve.py
Original file line number Diff line number Diff line change
@@ -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}")
38 changes: 38 additions & 0 deletions 2025/MilaConPapasFritas/CTF4-X-Ray Vision/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# X-Ray Vision
## Categoría: Web

### Tenemos el siguiente enunciado:
<img width="507" height="631" alt="enun" src="https://github.com/user-attachments/assets/e5e14a94-d2c7-49f5-8763-59dabaf50a7e" />

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:
<img width="1365" height="728" alt="web" src="https://github.com/user-attachments/assets/70b7c597-0912-443d-a371-354a842d56ba" />

Lo único interactivo es el boton de “query api”, si hacemos click obtenemos:
<img width="1365" height="725" alt="hint0" src="https://github.com/user-attachments/assets/1a1bf836-ffaa-4736-b35a-5fb4decfcfc0" />

Nos aparece el mensaje: “status: unathorized missing token”. Con esta pista lo que hacemos es inspeccionar la pagina con burp suite y encontramos:
<img width="1365" height="726" alt="x-secret-token" src="https://github.com/user-attachments/assets/33e19573-0087-46bc-bbac-b5d806b2ef1b" />
<img width="812" height="268" alt="token" src="https://github.com/user-attachments/assets/5d61dd7b-1473-4a3b-81f2-a57f267a337a" />

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.
<img width="1365" height="726" alt="intercept1" src="https://github.com/user-attachments/assets/b1b06664-35ec-4061-a450-db2c6644002b" />

Al hacer forward, obtenemos ahora
<img width="821" height="108" alt="hint1" src="https://github.com/user-attachments/assets/c1a7f780-b41c-4d57-9741-93674da9d01f" />

Si tomamos el valor del token anterior y probamos decodificarlo con rot13, obtenemos:
<img width="1365" height="727" alt="rot13web" src="https://github.com/user-attachments/assets/b8fbd19b-0dbc-4c2f-b87b-05dc9969c3e1" />


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:
<img width="1365" height="650" alt="intecept2" src="https://github.com/user-attachments/assets/1ba14a10-b4bd-40d9-bd0a-7b7334378062" />


Finalmente obtenemos:
<img width="748" height="184" alt="zoomflag" src="https://github.com/user-attachments/assets/6b6d2fa9-1ce3-4ec1-80af-a02da72212c5" />


Flag: jctf{r0t_y0ur_w4y_t0_4cc3ss}

15 changes: 15 additions & 0 deletions 2025/MilaConPapasFritas/readme.md
Original file line number Diff line number Diff line change
@@ -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) .