JPGChat - TryHackMe
SUMMARY
Debemos encontrar 1 bandera. Primero, a partir de un escaneo de puertos pude saber que había un servicio desconocido ejecutándose. Además, en el banner emitido por el servicio al momento de establecer una conexión, se podía observar un mensaje que nos indicaba que el código fuente del servicio estaba en un repositorio Github. Luego, de buscar el repositorio en Internet, pude analizar su código fuente, dándome cuenta de que era vulnerable a Command Injection, por lo que establecí una conexión con el servicio mediante Netcat, logrando ejecutar una reverse Shell. Luego, en la escalada de privilegios, pude observar que el usuario podía ejecutar un script en Python con los privilegios de root mediante el comando sudo. Además, pude observar que la configuración “SETENV” estaba habilitada en el archivo “sudoers” permitiendo ejecutar un Python Library Hijackign mediante la variable de entorno PYTHONPATH y aprovechando que el script importaba una librería. Logrando, asignar el bit SUID al archivo binario bash con el fin de ejecutar una Shell Bash con los privilegios de root.
FASE RECONOCIMIENTO
En este caso debemos acceder al sistema destino y obtener las banderas. Primero, empezaremos utilizando el comando openvpn y el archivo de configuración OpenVPN con el fin de establecer una conexión VPN y poder acceder a los laboratorios donde están las máquinas virtuales. Además, la plataforma de Tryhackme nos muestra la dirección IP de la máquina jpgchat.
FASE ESCANEO Y ENUMERACION
Ahora pasaremos a la fase de Escaneo y Enumeración con el fin de poder escanear los puertos del sistema destino. Además, obtendremos los servicios que se han levantado en los puertos abiertos, las versiones de los servicios.
Los resultados que obtenemos son:
- Un programa servidor SSH que se ejecuta en el puerto 22.
- Un servicio desconocido que se ejecuta en el puerto 3000. Ademas, podemos observar el banner emitido por el servicio al intentar establecer una conexión. Donde nos hablan que el codigo fuente del servicio puede ser encontrado en algun repositorio GitHub.
Ahora buscaremos en Internet tal repositorio GitHub.
Podemos observar que logramos obtener el codigo fuente del servicio en el respositorio “ https://github.com/Mozzie-jpg/JPChat/blob/main/jpchat.py” . Ahora analizaremos el codigo fuente detalladamente para conocer la logica seguida a medida que establecemos conexión con el servicio con el comando netcat.
FASE GANARA ACCESO O HACKING O EXPLOTACION
- Primero debemos ingresar un mensaje que puede tomar dos valores: “[MESSAGE]” o “[REPORT]”. Si ingresamos el mensaje “[MESSAGE]”, ingresaremos a un bucle inifinito donde podemos escribir diferentes mensajes, pero si escribimos el mensaje “[REPORT]” se ejecutara la funcion “report_form”.
- La funcion “report_form” nos solictara ingresar dos valores que seran utilizados como argumento del comando “echo” con el fin de guardar ambos valores en un log llamado “report.txt”. Ademas, debido a que no se realiza una correcta validacion de la data ingresada por el usuario, podemos realizar una inyeccion de comandos mediante el metacaracter $() con el fin de ejecutar una reverse shell.
De esta manera logramos obtener accesso al sistema destino mediante la vulnerabilidad Command Injection.
FASE ESCALADA DE PRIVILEGIOS
Ahora encontraremos vectores de escalada de privilegios de manera manual con el fin de ser un usuario con mayores privilegios.
Podemos observar que el usuario “wes” puede ejecutar un script en Python llamado “test_module” con los privilegios de root mediante el comando sudo. Ademas, podemos observar que la configuracion “SETENV” esta habilitada. Esta configuracion se convierte en un vector de escalada de privilegio debido a que podemos establecer valores en variables de entorno al momento de ejecutar el comando sin preocuparnos de que se pierdan los valores.
Podemos aprovechar que el script “test_module” importa la librería “compare” para realizar un Python Library Hijacking estableciendo un directorio(Donde estara nuestra librería maliciosa) en la variable de entorno “PYTHONPATH” con el fin de que el interprete de Python ejecute nuestra librería maliciosa.
Podemos observar que nuestra biblitoeca maliciosa “compare”, que suplantara a la original, le ha asignado el bit SUID al archivo binario bash aprovechando la configuracion “SETENV” habilitada en el archivo “sudoers”. Ahora, ejecutaremos una shell Bash con los privilegios de root.
De esta manera realizamos una escalada de privilegios vertical siendo el usuario root, y logrando obtener la bandera en el directorio root.