Introducción
CTF NahamStore que podemos encontrar en la plataforma Try Hack Me. De dificultad media, pondremos en práctica la búsqueda y explotación de múltiples vulnerabilidades en una tienda online simulada.
Enumeración
NMAP
Comenzamos realizando un escaneo rápido de los puertos que tiene abiertos la máquina víctima.
El siguiente paso será realizar un escaneo más en profundidad de los tres servicios disponibles.
Tenemos tres servicios disponibles:
- Puerto 22 -> SSH -> OpenSSH 7.6p1
- Puerto 80 -> HTTP -> nginx 1.14.0
- Puerto 8000 -> HTTP -> nginx 1.18.0
Enumeración Web
Tenemos disponible dos servidores Web en los puertos 80 y 8000. Vamos a ver el contenido en el navegador.
Puerto 80
Nos indica que debemos añadir los dominios www.nahamstore.thm y nahamstore.thm a nuestro archivo /etc/hosts.
Volvemos al navegador para ver el contenido de los dominios registrados.
El dominio pertenece a una tienda online. Ambos dominios llevan al mismo sitio web.
Los siguientes pasos serán la enumeración de subdominios y la enumeración de directorios. Comenzamos enumerando los subdominios. Para ello, vamos a utilizar la herramienta assetfinder. Como indican en la Web de Try Hack Me, para realizar el escaneo de subdominios, debemos cambiar .thm por .com (nahamstore.thm sería nahamstore.com para realizar la búsqueda.
Cambiamos las extensiones .com por .thm y los añadimos al archivo /etc/hosts.
Podemos realizar la búsqueda de los llamados vhosts. Para ello, utilizamos la herramienta wfuzz.
Podemos añadir un subdominio más al archivo /etc/hosts
Seguimos enumerando los directorios de los distintos subdominios encontrados. Para ello, utilizamos la herramienta Dirsearch.
Hacemos lo mismo con stock.nahamstore.thm y markting.nahamstore.thm.
Los otros 3 subdominios no devuelven ningún directorio. Nos centraremos en estos tres subdominios a partir de este momento.
Vulnerabilidades
A continuación pasamos a buscar y explotar las diferentes vulnerabilidades presentes en el sitio nahamstore.thm.
XSS
XSS subdominio marketing.nahamstore.thm
Durante la enumeración del subdominio marketing.nahamstore.thm, encontramos directorios que correspondían con campañas de marketing que nos devolvía un error si no encontraba dicha campaña.
Vamos a comprobar si podemos enviar una carga útil XSS.
Stored XSS vía encabezado HTTP
Al realizar un pedido podemos observar que en los detalles del pedido se almacena el User-Agent del usuario que realiza la compra.
Vamos a realizar otro pedido pero en esta ocasión vamos a capturar la petición con Burp para cambiar el valor de User-Agent por una carga útil XSS.
XSS vía etiqueta HTML
Al clicar sobre un producto de la página principal de la tienda, el nombre aparece en la barra de búsqueda como un parámetro GET. Este parámetro no controla el título pero se inyecta en la etiqueta <title> (se muestra en la pestaña de navegador).
Para crear la carga, cerraremos la etiqueta title, agregaremos la carga útil y volvemos a añadir otra etiqueta title de apertura.
XSS en función JavaScript
En la página principal de la tienda, buscamos un producto en “Search For Products”. Se realiza una solicitud GET a /search-products?q=. Vamos a enviar una carga útil para verificar.
XSS Stored vía etiqueta HTML
Visitamos la sección “Returns”. En el formulario, “Return Information” es el único parámetro que refleja información.
Vamos a probar una carga útil para confirmar las sospechas.
XSS Reflected vía etiqueta H1
Ingresamos un directorio no válido en la barra de búsqueda. El sitio refleja directamente que la ruta ingresada no existe.
El texto “Page Not Found” está en una etiqueta H1.
Vamos a aprovechar esto para intentar cargar una carga útil XSS.
Open Redirect
Nos logamos en el sitio Web y procedemos a realizar un pedido cualquiera.
Pulsamos “Add Another Address” y vemos la siguiente URL.
Al ejecutar, nos redirecciona a mi sitio Web.
CSRF
Formulario de cambio de contraseñas sin protección CSRF
La página de cambio de contraseña no tiene ninguna protección CSRF.
CSRF PoC
Ejecutamos este código HTML y podremos cambiar el valor de la contraseña existente por el valor “password”.
Eliminar protección CSRF
El formulario para cambiar la dirección de correo electrónico contiene un parámetro “csrf_protect”.
Vamos a eliminar la protección CSRF y a crear una PoC para comprabar si es vulnerable.
CSRF PoC
Protección CSRF débil
La página de desactivación de la cuenta, hay una protección CSRF débil, que utiliza un campo de entrada oculto. Al descifrar el valor del Token, vemos el valor la ID cifrada en base64.
IDOR
Fuga de direcciones
Vamos a necesitar:
- Realizar un pedido
- Ir a la cesta
- Seleccionar la dirección de entrega.
Después de realizar esto, interceptaremos la petición con Burp y obtendremos nuestra identificación de dirección.
Enviamos la petición de Repeater y modificamos el valor address_id.
Obtenemos la dirección de otro usuario de la tienda online.
LFI
Nos dirigimos a la tienda y abrimos una de las imágenes de los productos disponibles. Observemos la URL.
Con la herramienta Burp Intruder, vamos a realizar un ataque automatizado con una lista de Payloads para explotar vulnerabilidades LFI. Después de un momento, obtenemos resultados.
Hemos encontrado una vulnerabilidad LFI pero no podemos acceder al archivo por falta de privilegios de usuario.
RCE
RCE vía Webshell
Recordamos que en el escaneo con NMAP inicial teníamos un puerto 8000. También nos indicaba un directorio /admin. Vamos a ver en el navegador el contenido de esta Web.
Tenemos un inicio de sesión. Vamos a comprobar el código fuente en busca de información. Si esto no funciona, probaremos una pequeña fuerza bruta con credenciales básicas.
Las credenciales son admin:admin.
Llegamos al panel de administración de las campañas del subdominio maketing.nahamstore.thm.
Podemos editar las campañas activas. Vemos que la campaña ejecuta código. Vamos a probar a enviar una reverse Shell. La Shell utilizada será:
Guardamos la actualización de la campaña, y la ejecutamos.
Podemos ejecutar comandos de manera remota.
RCE vía generador de facturas PDF
Segundo RCE conectado al número de pedido cuando hacemos clic en el botón “PDF Receipt”. Vamos a enviar una Reverse Shell a través del parámetro id=.
Al mismo tiempo habilitamos un oyente en el puerto 4444.
Ya estaríamos conectados al servidor Web objetivo.
Un archivo interesante que hemos encontrado es /etc/hosts, donde podemos ver más subdominios aparte de los encontrados en la enumeración inicial y que pueden aportar información adicional.
SSRF
Filtración de tarjetas de crédito
Al comprar un producto, si pulsamos en consultar stock y capturamos la petición, obtenemos lo siguiente:
Recibimos la siguiente respuesta:
Si cambiamos el valor de server= por otro de los subdominios disponibles, nos devuelve un error. Debemos mantener el subdominio stock.nahamstore.thm y buscar como eludir.
Vamos a probar con rutas internas (server=stock.nahamstore.thm@127.0.0.1)
Si añadimos #, nos devuelve a la página principal de nahamstore.thm.
Vamos a probar a cambiar 127.0.0.1 por el subdominio internal-api.nahamstore.thm, y vemos resultados.
Obtenemos un endpoint que puede ser interesante.
Añadimos cualquiera de las /orders disponibles a la petición enviada.
Y tendríamos información sobre el usuario (nombre, email, tarjeta…)
XXE
Vamos a consultar las existencias de un producto de los disponibles en al tienda.4
Ahora probamos a cambiar el método GET por POST.
Se provoca un error por falta de un encabezado HTTP. Vamos a añadir un valor de Token, que por supuesto no será válido.
Al fuzzear la solicitud POST encontramos un error con la extensión XML.
Vamos a enviar otra solicitud POST con el fragmento de un archivo XML.
El error nos indica que no proporcionamos X-Token aunque el encabezado HTTP este presente. ¿Qué significa esto? Pues que en el modo XML, el encabezado HTTP se ignora y espera un valor XML.
Vamos a añadir un valor de X-Token.
Dado que el valor que proporcionamos se refleja, vamos a realizar un ataque XXE. Vamos a enviar una solicitud con el siguiente payload.
Podemos confirmar la vulnerabilidad XXE, ya que devuelve la misma respuesta que en la petición anterior.
Modificamos el payload XXE anterior para ejecutar un ataque LFI a través de la vulnerabilidad XXE.
Hemos podido acceder a la lista de usuarios del sistema.
Inyección SQL
Al enviar un parámetro no válido para un producto, recibimos un mensaje de error para MySQL.
Con SQLMap, vamos a automatizar el proceso de extracción de datos de la base de datos del sitio Web.
Extraemos la información de la base de datos.
No responses yet