Reconocimiento
Empezamos con nmap para ver los puertos abiertos de la máquina:
|
|
|
|
Ejecuto la utilidad “grePorts” para obtener los puertos abiertos directamente en la “clipboard”:
|
|
|
|
Y ejecutamos una serie de scripts de reconocimiento con nmap para ver los servicios disponibles y su versión:
|
|
|
|
Vemos un dominio al que apunta el servidor por el puerto 80, por lo que lo inlcuimos en nuestro archivo hosts. Vemos que además hay un servicio en el puerto 9091 relacionado con correo electrónico “xmltec-xmlmail?” que nmap no es capaz de reconocer.
Vamos a empezar echando un vistazo a la página web y veremos después.
Obteniendo acceso a la máquina víctima
La página principal no tiene contenido relevante, por lo que vamos a enumerar recursos disponibles o subdominios válidos vamos a usar la herramienta gobuster:
|
|
Vemos un directorio “tiny/” al que podemos acceder y nos lleva a la página de un gestor de ficheros al que podemos acceder con las credenciales de administración por defecto admin/admin@123. Además podemos obtener información relevante como que por detrás se está ejecutando php.
Ganando RCE
Una vez que hemos accedido lo primero que se me ocurra es subir un fichero y ver si puedo acceder desde el navegador y el contenido se ejecuta … y efectivamente:
He de decir que hay una tarea cron por detrás que elimina aquello que subamos al cabo de unos minutos. Ahora vamos a subir un simple fichero php que nos permita obtener ejecución arbitraria de comandos (RCE) y por ende una reverse shell.
Escalada de privilegios … (a medias)
La escalada de privilegios es sencilla; haciendo una breve búsqueda por posibles agujeros del sistema, nos encontramos con lo siguiente:
Sí, el binario de bash tiene permisos suid, por lo que haciendo lo siguiente, ya podemos obtener las flags de usuario y root:
Escalada de privilegios … (completa)
NOTA: Resulta que la máquina no se hace del todo así … ¿os acordáis del puerto del principio? El 9091. Me extrañó mucho que la máquina tuviera el suid en el binario de bash así de primera, y efectivamente debió ser porque los otros usuarios ya lo habían conseguido…
De todos modos, para ser honesto volví a hacer la máquina de nuevo, lo que me sirvió para aprender a hacer pentesting de web-socket y a entender como funcionan … ¡es increíble! adjunto algunas capturas del camino a seguir:
Como me quedé extrañado con la resolución, miré el foro de discusión de la plataforma y vi que hablaban sobre otro subdominio; miré el fichero hosts y … eureka… no había completado la máquina del todo
Accediendo a ese subdominio me registré y comprobé que la petición era enviada a un web socket ( el puerto desconocido de antes)
Con websocat establecí comunicación para asegurarme y efectivamente me devolvía la misma respuesta al introducir cualquier cadena de texto. Echando un vistazo al fuente de la página se tramita un apartado “id” y había visto antes que se estaba ejecutando mysql en la máquina víctima, lo que me hizo pensar en una SQLi.
Encontré por internet un script e información con la que acontecer la inyección a través del websocket, por lo que una vez ejecutado, solo tuve que extraer la información. Básicamente el programa actúa de intermediario y traduce las peticiones.
Podemos ver usuario y contraseña, lo cual nos servirá para establecer conexión a través de ssh.
La escalada de privilegios es similar a la anterior: abusamos de los privilegios como root y a raíz de eso habilitar la flag suid en bash. Lo hacemos con un script llamado doas (me costó la misma vida encontrarlo en la máquina).