Enumeración
En primer lugar voy a realizar un escaneo de puertos con nmap:
Me encuentro con el puerto 22 y 80 abiertos así que voy a ingresar en la página web para ver de que se trata:
En la página me encuentro con un login que posee dos inputs, uno para el mail y otro para la contraseña.
Dentro de la página también me encuentro con una sección para registrarse y otra para ingresar como administrador:
También noté que dentro de la pagina principal hay una opción para restablecer la contraseña:
Al haber tantos inputs lo primero que se me viene a la mente es realizar pruebas en cada uno de ellos en busca de una vulnerabilidad de inyección SQL.
Tras realizar pruebas en todos los inputs noté que en la pagina para restablecer la contraseña es vulnerable. Lo que hice para demostrarlo fue enviar la siguiente consulta en el input: 'OR 1=1, esto me devolvió un error, esto es positivo ya que significa que tiene acceso a la base de datos.
Para finalizar le envié 'OR 1=1 --, lo cual según el mensaje que devuelve lo toma como verdadero:
Con estas pruebas estoy en condiciones de afirmar que es vulnerable a la inyección SQL.
Explotación
Para realizar la inyección SQL voy a utilizar la herramienta sqlmap. Previo a utilizar esta herramienta hay que realizar una serie de pasos:
En primer lugar voy a registrarme en la página para crear un usuario real, luego abro Burpsuite para comenzar a interceptar la comunicación y en la pagina de "Reset Password" envío el mail que acabo de crear. Una vez apretado el botón para recuperar la contraseña Burpsuite comenzará a interceptar esa comunicación. Para finalizar voy a copiar los datos que intercepto Burpsuite y los voy a pegar en un nuevo archivo el cual voy a llamara sql.txt.
Ahora si estoy en condiciones de usar sqlmap:
Gracias a este analisis sé que el servidor utiliza mysql. Ahora el siguiente paso sería lista los nombres de las bases de datos:
De las bases de datos que me devolvió la unica que me parece interesante es "usage_blog".
Teniendo en cuenta el nomrbe de la base de datos, voy a listar todas las tablas que se encuentran en ella, para eso voy a usar el siguiente comando:
sqlmap -r reset.request --level 5 --risk 3 --threads 10 -p email --batch -D usage_blog --tables
Y me devuelve los siguiente:
Hay varias tablas que me llaman la atención, probé ingresando en todas y la que contiene las credenciales que necesitamos es "admin_users". Al ingresar dentro de esta tabla encontré un usuario junto con una contraseña hasheada:
La contraseña tiene un hash de tipo "blowfish", así que voy a usar la herramienta John The Ripper para romper ese hash. Para comenzar a descifrar el hash voy a crear un archivo llamado hash.txt, ahí es donde voy a incluir el hash a romper:
Al pasar el archivo hash.txt por John The Ripper me devuleve la contraseña "whatever1".
Lo que voy a hacer ahora es ingresar las credenciales obtenidas en el panel de administrador y logré ingresar con éxito.
Inspeccionando la página noté que está la posibilidad de modificar la foto del perfil. Paralelamente a este descubrimiento también encontré en internet que existe una vulnerabilidad (CVE-2023-24249) asociada con la carga de imágenes de perfil.
Entonces lo que voy a intentar realizar es insertar en lugar de una foto de perfil un archivo PHP que contenga una reverse shell.
Para lograrlo en primer lugar voy a crear un puerto de escucha usando netcat:
nc -lvnp 4444
Luego voy a crear un nuevo archivo de nombre shell.php.jpg (le agrego la extensión .jpg ya que el sistema solo admite archivos .jpg). A este archivo le voy a cargar un payload que me permita realizar la reverse shell. El payload lo obtuve del siguiente repositorio: https://github.com/pentestmonkey/php-reverse-shell?source=post_page-----16397895490f--------------------------------
Una vez tenemos el archivo con el payload cargado hay que modificar los campos $ip y $port con los valores de nuestra direccion ip y el numero de puerto que abrimos en netcat:
Ahora voy a proceder a cargar el archivo shell.php.jpg en la función de carga de imagen de perfil. Una vez cargado el archivo me da una previsualización, acá es cuando tengo que iniciar Burpsuite para interceptar la conexión.
Una vez tengo Burpsuite iniciado, le doy a enviar para que se envíe el archivo al servidor y burpsuite pueda interceptar esa petición.
Con la petición interceptada solo resta modificar el nombre del archivo eliminando el ".jpg" de forma tal que me quede solo "shell.php". De esta forma estoy enviando un archivo PHP que me va a permitir generar la reverse shell.
Al enviarlo automáticamente se establece la conexión en la terminal donde tengo abierto netcat:
Un consejo muy útil una vez que llegamos a este punto es ejecutar el siguiente comando para hacer la interfaz sea mas amigable:
python3 –c ‘import pty; prt.spawn(“/bin/bash”)’
La bandera user la puedo hallar fácilmente escribiendo el comando "ls" dentro del usuario "dash".
Escalada de Privilegios
Ahora lo que tengo que hacer es escalar privilegios para obtener acceso de root.
Al ejecutar el comando ls -la me encuentro con un archivo llamado ".monitrc", este es un archivo de configuración para Monit, la cual es una herramienta de monitoreo y administración de sistemas unix.
Dentro de ese archivo encuentro una credencial, la cual probé ingresar mediante SSH usando el usuario "xander" y funcionó. (xander era el otro usuario que tenía la máquina).
Una vez dentro de xander voy a usar el comando "sudo -l" para vero los permisos que tengo.
Veo que tengo permisos completos para ejecutar /usr/bin/usage_manage.
Para poder escalar privilegios utilizando ese binario me apoye 100% en un articulo de HackTricks, el cual me permitió escalar privilegios: https://book.hacktricks.xyz/linux-hardening/privilege-escalation/wildcards-spare-tricks?source=post_page-----16397895490f--------------------------------.
Basicamente para este punto lo que debemos hacer es encontrar la clave privada RSA que se utiliza para la autenticación en SSH. Esta clave privada permite a un usuario autenticarse de manera segura en un servidor sin necesidad de una contraseña, siempre y cuando el servidor tenga la clave pública correspondiente en su archivo
Una vez obtenemos esa clave la usamos para establecer una nueva Shell, esta vez con permisos de root.
Espero que este tutorial te haya sido de ayuda. Feliz hackeo!