الفحص السلبي والإيجابي: كيف تجمع معلومات عن الموقع بدون تنبيه الجدار الناري؟
ماذا سنتعلم اليوم؟ سنتعمق في استراتيجيات الفحص السلبي والإيجابي لجمع معلومات دقيقة عن المواقع المستهدفة، مع التركيز على تجنب كشف الجدران النارية وأنظمة كشف التسلل (IDS/IPS).
مقدمة: الفحص السلبي مقابل الفحص الإيجابي
الفحص السلبي (Passive Reconnaissance) هو جمع المعلومات دون التفاعل المباشر مع الهدف، مثل استخدام محركات البحث أو قواعد البيانات العامة. بينما الفحص الإيجابي (Active Reconnaissance) يتضمن التفاعل المباشر، مثل مسح المنافذ، مما قد ينبه أنظمة الحماية.
ملاحظة تقنية: الهدف الرئيسي هو الحصول على أقصى قدر من المعلومات بأقل بصمة ممكنة، بدءاً بالأساليب السلبية والانتقال بحذر إلى الإيجابية عند الضرورة.
الخطوة 1: الفحص السلبي - جمع معلومات DNS وWhois
سنبدأ بجمع معلومات DNS و Whois باستخدام مكتبات Python. هذا النوع من الفحص لا يتصل مباشرة بالهدف، بل يستعلم عن قواعد بيانات عامة.
سنستخدم مكتبتي python-whois و dnspython.
التثبيت (إذا لم تكن مثبتة):
pip install python-whois dnspython
جزء الكود الأول:
import whois
import dns.resolver
def passive_recon_dns_whois(domain):
print(f"[*] بدء الفحص السلبي للنطاق: {domain}")
# 1. جمع معلومات Whois
try:
whois_info = whois.whois(domain)
print("\n[+] معلومات Whois:")
# طباعة معلومات Whois بشكل منسق
for key, value in whois_info.items():
print(f" {key}: {value}")
except Exception as e:
print(f"[-] خطأ في جمع Whois: {e}")
# 2. جمع سجلات DNS (A, MX, NS, TXT)
print("\n[+] سجلات DNS:")
record_types = ['A', 'MX', 'NS', 'TXT']
for r_type in record_types:
try:
answers = dns.resolver.resolve(domain, r_type)
print(f" - سجلات {r_type}:")
for rdata in answers:
print(f" {rdata}")
except dns.resolver.NXDOMAIN:
print(f" - سجلات {r_type}: لا يوجد هذا النطاق.")
except dns.resolver.NoAnswer:
print(f" - سجلات {r_type}: لا يوجد سجلات من هذا النوع.")
except Exception as e:
print(f" - سجلات {r_type}: خطأ في الاستعلام: {e}")
# مثال للاستخدام (سيتم تجميعه في الكود النهائي)
# passive_recon_dns_whois("example.com")
ملاحظة تقنية: استخدام
whoisوdnspythonلا ينشئ اتصالاً مباشراً بالخادم الهدف. بل يستعلم عن خوادم Whois و DNS العامة، مما يجعلها طريقة آمنة لتجنب تنبيه الجدران النارية.
الخطوة 2: الفحص السلبي المتقدم - البحث عن النطاقات الفرعية (Subdomain Enumeration)
النطاقات الفرعية يمكن أن تكشف عن تطبيقات أو خدمات غير معروفة. سنستخدم طريقة سلبية عبر محركات البحث (Google Dorking) ومواقع مثل Crt.sh، والتي تعتمد على شهادات SSL/TLS.
جزء الكود الثاني:
import requests
from bs4 import BeautifulSoup
def passive_recon_subdomains(domain):
print(f"\n[*] بدء الفحص السلبي للنطاقات الفرعية للنطاق: {domain}")
# 1. البحث عبر Crt.sh (شهادات SSL/TLS)
print("\n[+] النطاقات الفرعية من Crt.sh:")
try:
crt_sh_url = f"https://crt.sh/?q=%25.{domain}" # الاستعلام عن جميع النطاقات الفرعية
response = requests.get(crt_sh_url)
soup = BeautifulSoup(response.text, 'html.parser')
subdomains = set() # استخدام مجموعة لتخزين النطاقات الفريدة
# البحث عن النطاقات الفرعية في جداول crt.sh
for link in soup.find_all('td'):
text = link.get_text()
if domain in text and '*' not in text and text.count('.') >= 1: # التأكد من أنه نطاق فرعي حقيقي
subdomains.add(text.strip())
for sub in sorted(list(subdomains)):
print(f" - {sub}")
except Exception as e:
print(f"[-] خطأ في جمع النطاقات الفرعية من Crt.sh: {e}")
# 2. البحث عن النطاقات الفرعية باستخدام Google Dorking (مثال مبسط)
print("\n[+] النطاقات الفرعية المحتملة من Google Dorking (تتطلب تحليلاً يدوياً):")
print(f" - جرب البحث في Google عن: site:*.{domain}")
print(f" - جرب البحث في Google عن: site:{domain} intitle:index.of")
print(f" - جرب البحث في Google عن: site:{domain} filetype:pdf")
# مثال للاستخدام (سيتم تجميعه في الكود النهائي)
# passive_recon_subdomains("example.com")
ملاحظة تقنية: Crt.sh هو مصدر ممتاز لمعلومات النطاقات الفرعية لأنه يعتمد على سجلات شهادات SSL/TLS العامة. هذا لا يتطلب أي اتصال مباشر بالهدف، مما يجعله سلبياً تماماً.
الخطوة 3: الفحص الإيجابي الحذر - مسح المنافذ ببطء
عند الانتقال إلى الفحص الإيجابي، يجب أن نكون حذرين. مسح المنافذ السريع ينبه الجدران النارية. سنقوم بمسح المنافذ ببطء شديد.
سنستخدم مكتبة socket الأساسية في Python، مع إضافة تأخير.
جزء الكود الثالث:
import socket
import time
def active_recon_port_scan_slow(target_host, ports, delay=1):
print(f"\n[*] بدء الفحص الإيجابي الحذر للمنافذ على المضيف: {target_host}")
print(f" - مع تأخير {delay} ثانية بين كل منفذ.")
open_ports = []
for port in ports:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # إنشاء كائن socket
s.settimeout(1) # تحديد مهلة قصيرة للاتصال
result = s.connect_ex((target_host, port)) # محاولة الاتصال بالمنفذ
if result == 0:
print(f" [+] المنفذ {port} مفتوح.")
open_ports.append(port)
else:
print(f" [-] المنفذ {port} مغلق أو مفلتر.")
s.close()
except socket.gaierror:
print(f"[-] لا يمكن حل اسم المضيف: {target_host}")
break
except socket.error as e:
print(f"[-] خطأ في الاتصال بالمنفذ {port}: {e}")
time.sleep(delay) # التأخير بين فحص كل منفذ لتجنب الكشف
print(f"\n[+] المنافذ المفتوحة: {open_ports}")
return open_ports
# مثال للاستخدام (سيتم تجميعه في الكود النهائي)
# active_recon_port_scan_slow("example.com", [80, 443, 21, 22, 23], delay=2)
ملاحظة تقنية: مسح المنافذ باستخدام
socket.connect_ex()هو اتصال TCP ثلاثي الاتجاهات كامل. لتجنب أنظمة كشف التسلل، يجب استخدام تأخير كبير بين كل منفذ. استخدام وكيل SOCKS5 أو VPN هو الطريقة الأكثر فعالية لإخفاء عنوان IP المصدر أثناء الفحص الإيجابي، ولكن هذا يتطلب إعداداً إضافياً خارج نطاق هذا الدرس.
الكود النهائي الكامل
هذا هو السكربت الكامل الذي يجمع جميع الخطوات المذكورة أعلاه. تذكر استبدال "example.com" بالنطاق الذي ترغب في فحصه.
import whois
import dns.resolver
import requests
from bs4 import BeautifulSoup
import socket
import time
def passive_recon_dns_whois(domain):
"""
يجمع معلومات Whois وسجلات DNS بشكل سلبي.
"""
print(f"[*] بدء الفحص السلبي للنطاق: {domain}")
# 1. جمع معلومات Whois
try:
whois_info = whois.whois(domain)
print("\n[+] معلومات Whois:")
# طباعة معلومات Whois بشكل منسق
for key, value in whois_info.items():
print(f" {key}: {value}")
except Exception as e:
print(f"[-] خطأ في جمع Whois: {e}")
# 2. جمع سجلات DNS (A, MX, NS, TXT)
print("\n[+] سجلات DNS:")
record_types = ['A', 'MX', 'NS', 'TXT']
for r_type in record_types:
try:
answers = dns.resolver.resolve(domain, r_type)
print(f" - سجلات {r_type}:")
for rdata in answers:
print(f" {rdata}")
except dns.resolver.NXDOMAIN:
print(f" - سجلات {r_type}: لا يوجد هذا النطاق.")
except dns.resolver.NoAnswer:
print(f" - سجلات {r_type}: لا يوجد سجلات من هذا النوع.")
except Exception as e:
print(f" - سجلات {r_type}: خطأ في الاستعلام: {e}")
def passive_recon_subdomains(domain):
"""
يجمع النطاقات الفرعية بشكل سلبي باستخدام Crt.sh.
"""
print(f"\n[*] بدء الفحص السلبي للنطاقات الفرعية للنطاق: {domain}")
# 1. البحث عبر Crt.sh (شهادات SSL/TLS)
print("\n[+] النطاقات الفرعية من Crt.sh:")
try:
crt_sh_url = f"https://crt.sh/?q=%25.{domain}"
response = requests.get(crt_sh_url)
soup = BeautifulSoup(response.text, 'html.parser')
subdomains = set()
# البحث عن النطاقات الفرعية في جداول crt.sh
for link in soup.find_all('td'):
text = link.get_text()
if domain in text and '*' not in text and text.count('.') >= 1:
subdomains.add(text.strip())
for sub in sorted(list(subdomains)):
print(f" - {sub}")
except Exception as e:
print(f"[-] خطأ في جمع النطاقات الفرعية من Crt.sh: {e}")
print("\n[+] تذكير: استخدم Google Dorking يدوياً للحصول على المزيد من النطاقات الفرعية المحتملة.")
print(f" - مثال: site:*.{domain}")
def active_recon_port_scan_slow(target_host, ports, delay=1):
"""
يقوم بمسح المنافذ المستهدفة ببطء لتجنب تنبيه الجدار الناري.
"""
print(f"\n[*] بدء الفحص الإيجابي الحذر للمنافذ على المضيف: {target_host}")
print(f" - مع تأخير {delay} ثانية بين كل منفذ.")
open_ports = []
for port in ports:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(1) # مهلة ثانية واحدة للاتصال
result = s.connect_ex((target_host, port))
if result == 0:
print(f" [+] المنفذ {port} مفتوح.")
open_ports.append(port)
else:
print(f" [-] المنفذ {port} مغلق أو مفلتر.")
s.close()
except socket.gaierror:
print(f"[-] لا يمكن حل اسم المضيف: {target_host}")
break
except socket.error as e:
print(f"[-] خطأ في الاتصال بالمنفذ {port}: {e}")
time.sleep(delay) # التأخير المطلوب لتجنب الكشف
print(f"\n[+] المنافذ المفتوحة النهائية: {open_ports}")
return open_ports
if __name__ == "__main__":
target_domain = input("أدخل النطاق المستهدف (مثال: example.com): ")
# تنفيذ الفحص السلبي
passive_recon_dns_whois(target_domain)
passive_recon_subdomains(target_domain)
# تنفيذ الفحص الإيجابي الحذر
# يمكن تخصيص قائمة المنافذ حسب الحاجة
common_ports = [80, 443, 21, 22, 23, 25, 53, 110, 139, 445, 3389, 8080]
active_recon_port_scan_slow(target_domain, common_ports, delay=2) # تأخير ثانيتين
النتيجة المتوقعة
عند تشغيل السكربت، سيُطلب منك إدخال النطاق المستهدف. بعد إدخال النطاق (مثلاً، google.com أو microsoft.com)، ستحصل على مخرجات مشابهة لما يلي (قد تختلف التفاصيل بناءً على النطاق والوقت):
[*] بدء الفحص السلبي للنطاق: example.com
[+] معلومات Whois:
domain_name: EXAMPLE.COM
registrar: IANA
whois_server: whois.iana.org
... (المزيد من التفاصيل)
[+] سجلات DNS:
- سجلات A:
93.184.216.34
- سجلات MX:
لا يوجد سجلات من هذا النوع.
- سجلات NS:
ns0.example.com.
ns1.example.com.
- سجلات TXT:
لا يوجد سجلات من هذا النوع.
[*] بدء الفحص السلبي للنطاقات الفرعية للنطاق: example.com
[+] النطاقات الفرعية من Crt.sh:
- blog.example.com
- dev.example.com
- www.example.com
... (المزيد من النطاقات الفرعية)
[+] تذكير: استخدم Google Dorking يدوياً للحصول على المزيد من النطاقات الفرعية المحتملة.
- مثال: site:*.example.com
[*] بدء الفحص الإيجابي الحذر للمنافذ على المضيف: example.com
- مع تأخير 2 ثانية بين كل منفذ.
[+] المنفذ 80 مفتوح.
[+] المنفذ 443 مفتوح.
[-] المنفذ 21 مغلق أو مفلتر.
... (نتائج باقي المنافذ)
[+] المنافذ المفتوحة النهائية: [80, 443]
هذا الإخراج يوفر رؤى قيمة حول البنية التحتية للهدف، من سجلات DNS إلى النطاقات الفرعية والمنافذ المفتوحة، كل ذلك مع تقليل مخاطر الكشف عن طريق الجدران النارية.