Introducción
En este laboratorio, explorará una potente función de sqlmap: la capacidad de escribir archivos locales en un servidor remoto. Esta capacidad es crucial en escenarios de pruebas de penetración, ya que le permite cargar web shells, archivos de configuración u otras cargas útiles maliciosas en un servidor comprometido. Cubriremos los prerrequisitos necesarios, como confirmar los privilegios de DBA e identificar directorios escribibles, y luego repasaremos el proceso de creación de un archivo localmente, utilizando sqlmap para cargarlo y, finalmente, verificando su presencia en el servidor.
Confirmar Privilegios de DBA y Permisos de Escritura de Directorios
En este paso, utilizará sqlmap para verificar si el usuario actual de la base de datos tiene privilegios de DBA (Administrador de Base de Datos) e identificar directorios en el servidor que sean escribibles. Tener privilegios de DBA suele ser un requisito previo para escribir archivos, y conocer los directorios escribibles es esencial para elegir un destino para su archivo cargado.
Primero, verifiquemos los privilegios de DBA. Esto es crucial porque sqlmap a menudo requiere privilegios elevados para realizar operaciones del sistema de archivos.
sqlmap -u "http://localhost/vulnerable/index.php?id=1" --is-dba
Debería ver una salida que indique si el usuario es un DBA. Busque una línea similar a [INFO] the back-end DBMS user is a DBA.
A continuación, necesitamos encontrar un directorio escribible en el servidor. sqlmap puede ayudar con esto intentando identificar rutas escribibles comunes. Utilizaremos la opción --file-write con un archivo ficticio y un directorio escribible común como /tmp para probar. Aunque aún no estamos escribiendo un archivo, este comando puede ayudar a confirmar las capacidades de escritura.
sqlmap -u "http://localhost/vulnerable/index.php?id=1" --file-write=/dev/null --file-dest=/tmp/test_write.txt --batch
La bandera --batch le indica a sqlmap que use respuestas predeterminadas para las preguntas, lo cual es útil para la automatización. Si el comando se ejecuta sin errores relacionados con permisos, sugiere que /tmp es escribible.
Salida esperada para --is-dba:
...
[INFO] checking if the back-end DBMS user is a DBA
[INFO] the back-end DBMS user is a DBA
...
Salida esperada para probar los permisos de escritura (puede variar, pero busque mensajes de éxito o la ausencia de errores de permisos):
...
[INFO] the file '/tmp/test_write.txt' has been successfully written on the back-end DBMS file system
...
Crear un Archivo Local para Cargar (ej. upload.txt)
En este paso, creará un archivo de texto simple en su máquina local (el entorno LabEx) que pretende cargar en el servidor de destino. Este archivo puede contener cualquier contenido, pero para este laboratorio, crearemos un archivo de texto básico para demostrar el proceso.
Navegue a la carpeta project de su directorio de inicio, que es el directorio de trabajo predeterminado en este entorno de laboratorio.
cd ~/project
Ahora, cree un archivo llamado upload.txt con algún contenido utilizando el comando echo y la redirección.
echo "This file was uploaded from the LabEx environment!" > upload.txt
Puede verificar el contenido del archivo usando cat:
cat upload.txt
Salida esperada:
This file was uploaded from the LabEx environment!
Usar --file-write y --file-dest para Especificar Origen y Destino
En este paso, aprenderá sobre las opciones de sqlmap utilizadas para escribir archivos: --file-write y --file-dest.
--file-write: Esta opción especifica la ruta local del archivo que desea cargar.sqlmapleerá el contenido de este archivo.--file-dest: Esta opción especifica la ruta absoluta en el servidor remoto dondesqlmapdebe escribir el archivo. Es crucial proporcionar una ruta a un directorio al que el usuario de la base de datos tenga permisos de escritura. Basándonos en nuestro paso anterior,/tmp/es un buen candidato.
Prepararemos el comando sqlmap utilizando estas opciones, pero no lo ejecutaremos hasta el siguiente paso. Esto le permitirá comprender primero la estructura del comando.
El comando se verá así:
sqlmap -u "http://localhost/vulnerable/index.php?id=1" --file-write="/home/labex/project/upload.txt" --file-dest="/tmp/uploaded_file.txt" --batch
Analicemos el comando:
-u "http://localhost/vulnerable/index.php?id=1": La URL de destino con la vulnerabilidad de inyección SQL.--file-write="/home/labex/project/upload.txt": La ruta completa al archivo local que creó en el paso anterior. Recuerde que~/projectse expande a/home/labex/project.--file-dest="/tmp/uploaded_file.txt": La ruta completa donde se escribirá el archivo en el servidor remoto. Estamos utilizando/tmp/como directorio de destino y nombrando el archivo cargadouploaded_file.txt.--batch: Para automatizar el proceso y aceptar las opciones predeterminadas.
Tómese un momento para revisar el comando y asegurarse de que las rutas sean correctas.
Ejecutar el Comando para Cargar el Archivo a un Directorio Escribible
En este paso, ejecutará el comando sqlmap preparado en el paso anterior para cargar upload.txt desde su máquina local al directorio /tmp/ en el servidor de destino, nombrándolo uploaded_file.txt.
Ejecute el comando sqlmap:
sqlmap -u "http://localhost/vulnerable/index.php?id=1" --file-write="/home/labex/project/upload.txt" --file-dest="/tmp/uploaded_file.txt" --batch
sqlmap intentará ahora escribir el archivo. Debería observar el progreso de sqlmap mientras prueba diferentes técnicas para cargar el archivo. Si tiene éxito, sqlmap informará que el archivo ha sido escrito.
Salida esperada (busque el mensaje de éxito):
...
[INFO] the file '/tmp/uploaded_file.txt' has been successfully written on the back-end DBMS file system
...
Este mensaje confirma que sqlmap cree que ha escrito con éxito el archivo en el destino especificado en el servidor.
Verificar la Carga Exitosa usando el Comando --file-read
En este paso final, verificará que el archivo se cargó correctamente en el servidor y que su contenido es el esperado. Puede hacerlo utilizando la opción --file-read de sqlmap, que le permite leer archivos del servidor remoto.
Utilice la opción --file-read, especificando la ruta al archivo que acaba de cargar en el servidor:
sqlmap -u "http://localhost/vulnerable/index.php?id=1" --file-read="/tmp/uploaded_file.txt" --batch
sqlmap intentará leer el archivo y mostrará su contenido en la terminal.
Salida esperada:
...
[INFO] retrieved file content:
This file was uploaded from the LabEx environment!
...
Si ve el contenido "This file was uploaded from the LabEx environment!", significa que su archivo se cargó correctamente y se puede leer desde el servidor. Esto confirma todo el proceso de escritura de un archivo local en el servidor utilizando sqlmap.
Resumen
En este laboratorio, aprendió con éxito cómo aprovechar las capacidades de escritura de archivos de sqlmap. Comenzó confirmando los privilegios de DBA e identificando directorios escribibles en el servidor de destino. Luego, creó un archivo local y utilizó sqlmap con las opciones --file-write y --file-dest para cargarlo en el servidor. Finalmente, verificó la carga exitosa leyendo el contenido del archivo desde el servidor utilizando la opción --file-read. Esta habilidad es fundamental en las pruebas de penetración para diversas actividades posteriores a la explotación.


