Kodax

الفحص (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()
اختبر فهمك