Post

XSSaS

Writeup de la máquina XSSaS de BugBountyLabs.

XSSaS

Resumen de la resolución

XSSaS es una máquina Linux de dificultad Insane (Experto) de la plataforma de BugBountyLabs. En ella explotaremos un XSS a través parámetro user que le pasamos vía GET. Dicho parámetro se almacena en el atributo value del campo input. Finalmente, la inyección XSS se acontece gracias al atributo popovertarget usado en el button y al atributo onbeforetoggle y popover que inyectamos en el campo input.


Enumeración

En primer lugar, realizaremos un barrido en la red para encontrar la Dirección IP de la máquina víctima, para ello usaremos el siguiente comando.

1
arp-scan -I ens33 --localnet

A continuación podemos ver la Dirección IP ya que el OUI es 08:00:27, correspondiente a una máquina virtual de Virtual Box.

Después le lanzaremos un ping para ver si se encuentra activa dicha máquina, además de ver si acepta la traza ICM. Comprobamos que efectivamente nos devuelve el paquete que le enviamos por lo que acepta la traza ICMP, gracias al ttl podremos saber si se trata de una máquina Linux (TTL 64 ) y Windows (TTL 128), y vemos que se trata de una máquina Linux pues cuenta con TTL próximo a 64 (63), además gracias al script whichSystem.py podremos conocer dicha información.

Nmap

En segundo lugar, realizaremos un escaneo por TCP usando Nmap para ver que puertos de la máquina víctima se encuentra abiertos.

1
nmap -p- --open --min-rate 5000 -sS -v -Pn -n 192.168.26.79 -oG allPorts

Observamos como nos reporta que se encuentra abiertos los puertos 22 y 80.

En el segundo escaneo de Nmap no veremos nada interesante.


Puerto 80 - HTTP (Werkzeug - Python)

En primer lugar, nos dirigimos al servidor web y tras un buen rato intentando encontrar el vector de entrada veremos que al introducir el parámetro user en la URL, dicho valor se ve reflejado en el atributo value del campo input.

Es posible que no encontremos el parámetro user, por lo que alternativamente lo podríamos haber descubierto a través de un fuzzing de parámetros usando Wfuzz de la siguiente forma.

1
wfuzz -c -u "http://192.168.26.79/?FUZZ=test" -w /usr/share/wordlists/SecLists/Discovery/Web-Content/burp-parameter-names.txt --hh 548

Tal y como se aprecia abajo conseguimos descubrir el parámetro user de igual forma.

Una vez hemos descubierto el vector de entrada probaremos la siguiente inyección XSS usando este payload.

1
http://<Direccion-IP>/?user="id=x popover onbeforetoggle="><h1>test</h1>

Tal y como vemos a continuación, los caracteres < y > están siendo convertidos a &lt; y &lt, por lo que no podremos inyectar un XSS.

Tras revisar el código fuente nos llamará la atención el atributo popovertarget presente en el button. Por lo que buscando por internet daremos con el siguiente artículo XSS popovertarget - Portswigger donde explican como acontecer un XSS a partir de este atributo (popovertarget).


Explotación

XSS

Tras mirar el anterior artículo entenderemos como acontecer un XSS abusando del atributo popovertarget, en definitiva el payload es el siguiente.

1
http://<Direccion-IP>/?user="id=x popover onbeforetoggle="prompt(1)

Tal y como vemos a continuación conseguimos mostrar el cuadro del prompt().

Usando el mismo payload que antes intentaremos mostrar una ventana de alert().

1
http://<Direccion-IP>/?user="id=x popover onbeforetoggle="alert(1)

Observamos que nos salta un mensaje de error ya que la palabra alert no está permitida.

Una forma de bypasear esta comprobación es usando la función document.write() tal que así.

Destacar la importancia de URL Encodear los + a %2B.

1
http://<Direccion-IP>/?user="id=x popover onbeforetoggle="document.write('<script>ale'%2B'rt(1)</script>')

Tal y como se aprecia en la siguiente captura de pantalla conseguimos mostrar la ventana de alert().

Tras ejecutar el anterior alert() no me detuve y seguí investigando sobre diferentes formas de bypasearlo y me encontré el siguiente artículo XSS Bypass alert - Portswigger donde pude extraer los siguientes payloads alternativos para ejecutar el alert().

1
http://<Direccion-IP>/?user="id=x popover onbeforetoggle="eval('a\154ert(1)')
1
http://192.168.26.79/?user="id=x popover onbeforetoggle="eval(atob('YWxlcnQoMSk'));
This post is licensed under CC BY 4.0 by the author.