Reconocimiento
Para comenzar, como es costumbre, comprobamos si la máquina está disponible:
|
|
|
|
Si echamos un vistazo al valor TTL en la respuesta, vemos que la máquina a la que nos enfrentamos tiene como sistema operativo GNU/Linux.
A continuación vemos que servicios están desplegados haciendo un escaneo de puertos, principalmente por el protocolo TCP:
|
|
|
|
Una vez hecho esto, vemos que están expuestos los puertos 22 y 80. Veamos que servicios maneja, lanzando con nmap una serie de scripts de reconocimiento:
|
|
|
|
Obteniendo acceso a la máquina víctima
Vemos ssh ejecutándose y un servicio web desplegado en el puerto 80. Como no disponemos de credenciales para ssh, vamos a echar un vistazo a la web; primero desde terminal para saber a qué tecnologías nos enfrentamos:
|
|
Al principio no veremos nada ya que nos redirige a un dominio que nuestro ordenador no sabe interpretar; para ello añadimos la dirección ip a nuestro archivo local /etc/hosts además del dominio al que nos redirige stocker.htb.
Echando un rápido vistazo a la página web, no se ve nada que destaque; con la herramienta gobuster veamos si hay algún subdominio:
|
|
Añadimos el subdominio de la imagen al fichero de hosts y accedemos a él para ver un panel de autenticación para acceder a los recursos de la plataforma.
Intentar algún bypass simple no es efectivo; interceptando la petición desde nuestro dispositivo con BurpSuite podemos cambiar el contenido de la aplicación de “url-encoded” a “json” sin recibir ningún error del estilo “Internal Server Error”; esto me hace pensar que por detrás se esté haciendo algún tipo de petición a una base de datos.
Saltando el panel de autenticación
Haciendo varias pruebas encontré una manera de saltarme el panel.A continuación se puede ver una forma de aprovechar esto jugando con los valores json:
¿Qué estamos haciendo realmente? Según la documentación de MongoDB $ne selects the document where the value of the field is not equal tothe specified value es decir, estamos seleccionando todos los valores distintos al que hemos puesto incluido los valores de autenticación correctos . Usando este valor que se interpreta internamente como un tipo de dato BSON, podemos acceder como usuario registrado a la plataforma.
Obteniendo credenciales ssh
Nos encontramos ante una especie de tienda, donde seleccionamos los objetos para comprar, realizamos la compra y obtenemos un pdf a modo de factura. Interceptando la petición de compra podemos alterar el contenido de este pdf.
Mirando los metadatos del fichero, este está generado con chromium ¿podremos ver el contenido de un fichero abusando de esto y gracias a un iframe?La respuesta es que sí, podemos:
Obtenemos el usuario “Angoose”. Tras buscar en varios ficheros insatisfactoriamente se me ocurrió buscar ficheros “js” que contuvieran la configuración del usuario para el inicio de sesión de este; probé con varios hasta dar con el “index.js” que contenía:
Probando el usuario y la contraseña en ssh ganamos acceso.
Escalada de privilegios
Una vez hemos ganado acceso tenemos permisos para ejecutar como root sin contraseña el comando “node” acompañado de cierta ruta usando el comodín asterisco. Gracias a este comodín podemos ejecutar realmente el fichero que queramos porque el comodín se puede sustituir por cero o más ocurrencias de cualquier caracter. Creamos el siguiente scrip y obtenemos la flag de root:
|
|