الفحص (Scanning) — الاختراق الأخلاقي
الفحص - Scanning
أنواع الفحص
1. Port Scanning
اكتشاف المنافذ المفتوحة
2. Vulnerability Scanning
اكتشاف الثغرات المعروفة
3. Network Scanning
رسم خريطة الشبكة
Nmap - ملك فحص المنافذ
الأوامر الأساسية
# فحص سريع
nmap target.com
# فحص كل المنافذ
nmap -p- target.com
# فحص مع اكتشاف الخدمات
nmap -sV target.com
# فحص مع اكتشاف نظام التشغيل
nmap -O target.com
# فحص شامل
nmap -A target.com
# فحص خفي (SYN scan)
nmap -sS target.comأنواع الفحص
- -sT: TCP Connect (كامل)
- -sS: SYN Scan (نصف اتصال - خفي)
- -sU: UDP Scan
- -sA: ACK Scan (للفايروولات)
حالات المنافذ
- open: مفتوح ويقبل اتصالات
- closed: مغلق لكن يرد
- filtered: فايروول يمنع الوصول
- unfiltered: لا يُعرف إن كان مفتوحاً
المنافذ الشائعة للهجمات
| المنفذ | الخدمة | المخاطر |
|--------|--------|---------|
| 21 | FTP | كلمات مرور واضحة |
| 22 | SSH | Brute Force |
| 23 | Telnet | غير مشفر! |
| 25 | SMTP | Spam/Relay |
| 80/443 | HTTP/S | Web attacks |
| 3306 | MySQL | SQL Injection |
| 3389 | RDP | Brute Force |
أدوات أخرى
- Masscan: أسرع من nmap
- Nessus: فحص ثغرات شامل
- OpenVAS: مفتوح المصدر
- Nikto: ثغرات الويب
# فحص المنافذ بـ Python
import socket
import threading
from concurrent.futures import ThreadPoolExecutor
import time
class PortScanner:
"""
فحص منافذ بسيط وسريع
⚠️ استخدم فقط على أنظمتك أو بإذن!
"""
def __init__(self, target, timeout=1):
self.target = target
self.timeout = timeout
self.open_ports = []
self.services = {
21: 'FTP',
22: 'SSH',
23: 'Telnet',
25: 'SMTP',
53: 'DNS',
80: 'HTTP',
110: 'POP3',
143: 'IMAP',
443: 'HTTPS',
445: 'SMB',
3306: 'MySQL',
3389: 'RDP',
5432: 'PostgreSQL',
6379: 'Redis',
8080: 'HTTP-Proxy',
27017: 'MongoDB'
}
def resolve_target(self):
"""تحويل hostname إلى IP"""
try:
ip = socket.gethostbyname(self.target)
print(f"🎯 الهدف: {self.target} ({ip})")
return ip
except socket.gaierror:
print(f"❌ لا يمكن حل {self.target}")
return None
def scan_port(self, ip, port):
"""فحص منفذ واحد"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(self.timeout)
result = sock.connect_ex((ip, port))
if result == 0:
service = self.services.get(port, 'Unknown')
self.open_ports.append({
'port': port,
'service': service,
'state': 'open'
})
return True
sock.close()
return False
except:
return False
def grab_banner(self, ip, port):
"""محاولة الحصول على Banner"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2)
sock.connect((ip, port))
# إرسال طلب بسيط
if port == 80:
sock.send(b"HEAD / HTTP/1.1\r\nHost: " + ip.encode() + b"\r\n\r\n")
else:
sock.send(b"\r\n")
banner = sock.recv(1024).decode('utf-8', errors='ignore')
sock.close()
return banner[:100] # أول 100 حرف
except:
return None
def quick_scan(self):
"""فحص المنافذ الشائعة"""
print("\n⚡ فحص سريع للمنافذ الشائعة...")
ip = self.resolve_target()
if not ip:
return []
common_ports = [21, 22, 23, 25, 53, 80, 110, 143, 443,
445, 3306, 3389, 5432, 8080, 8443]
start = time.time()
with ThreadPoolExecutor(max_workers=50) as executor:
for port in common_ports:
executor.submit(self.scan_port, ip, port)
elapsed = time.time() - start
print(f"\n✅ اكتمل في {elapsed:.2f} ثانية")
self.print_results()
return self.open_ports
def full_scan(self, start_port=1, end_port=1024):
"""فحص نطاق كامل من المنافذ"""
print(f"\n🔍 فحص كامل من {start_port} إلى {end_port}...")
ip = self.resolve_target()
if not ip:
return []
start = time.time()
with ThreadPoolExecutor(max_workers=100) as executor:
for port in range(start_port, end_port + 1):
executor.submit(self.scan_port, ip, port)
elapsed = time.time() - start
print(f"\n✅ فُحص {end_port - start_port + 1} منفذ في {elapsed:.2f} ثانية")
self.print_results()
return self.open_ports
def service_detection(self):
"""محاولة اكتشاف الخدمات"""
print("\n🔍 محاولة اكتشاف الخدمات...")
ip = self.resolve_target()
if not ip:
return
for port_info in self.open_ports:
port = port_info['port']
banner = self.grab_banner(ip, port)
if banner:
port_info['banner'] = banner
print(f" Port {port}: {banner[:50]}...")
def print_results(self):
"""طباعة النتائج"""
if not self.open_ports:
print(" لم يُعثر على منافذ مفتوحة")
return
print(f"\n المنافذ المفتوحة ({len(self.open_ports)}):")
print(" " + "-" * 40)
for p in sorted(self.open_ports, key=lambda x: x['port']):
print(f" {p['port']:>5}/tcp {p['state']:<8} {p['service']}")
# ===== Vulnerability Check (محاكاة) =====
def check_common_vulnerabilities(target):
"""
فحص ثغرات شائعة (محاكاة للتعليم)
"""
print(f"\n🔍 فحص ثغرات شائعة لـ {target}")
vulns = []
# محاكاة فحص
checks = [
("SSL/TLS", "فحص إصدارات قديمة"),
("HTTP Headers", "فحص headers الأمان"),
("Default Credentials", "فحص كلمات مرور افتراضية"),
("Open Ports", "فحص خدمات غير ضرورية"),
]
for check_name, description in checks:
print(f" ⏳ {check_name}: {description}...")
# في الواقع هنا يتم الفحص الحقيقي
return vulns
# مثال على الاستخدام
# scanner = PortScanner("scanme.nmap.org") # موقع مصرّح للاختبار
# scanner.quick_scan()
# scanner.service_detection()اختبر فهمك