ماذا سنبني اليوم؟ سنقوم بكتابة سكربت Python لأتمتة جمع معلومات الاستخبارات مفتوحة المصدر (OSINT) من مصادر عامة، مع التركيز على استخراج بيانات نطاق، عناوين بريد إلكتروني، وتحديد الوجود على وسائل التواصل الاجتماعي.
الخطوة 1: تهيئة البيئة وجمع معلومات النطاق (Whois)
في هذه الخطوة الأولى، سنقوم بجمع معلومات أساسية عن النطاق (Domain) المستهدف باستخدام مكتبة python-whois. هذه المعلومات تشمل عادةً تاريخ التسجيل، تاريخ انتهاء الصلاحية، واسم المسجل.
ملاحظة تقنية: مكتبة
python-whoisهي غلاف (wrapper) بسيط لاستعلامات Whois القياسية. تأكد من تثبيتها أولاً باستخدامpip install python-whois.
لنبدأ بتثبيت المكتبة وكتابة الجزء الأول من الكود:
أولاً، قم بتثبيت المكتبة:
pip install python-whois
ثم، أضف الكود التالي إلى ملفك (مثلاً osint_script.py):
import whois # استيراد مكتبة whois
def get_domain_info(domain):
"""
تستخرج معلومات Whois لنطاق محدد.
"""
print(f"\n[+] جمع معلومات Whois للنطاق: {domain}")
try:
w = whois.whois(domain) # إجراء استعلام Whois
domain_info = {
"النطاق": domain,
"المسجل": w.registrar, # اسم المسجل
"تاريخ الإنشاء": w.creation_date, # تاريخ إنشاء النطاق
"تاريخ الانتهاء": w.expiration_date # تاريخ انتهاء صلاحية النطاق
}
return domain_info
except Exception as e:
print(f"[-] خطأ أثناء استخراج معلومات Whois: {e}")
return {"النطاق": domain, "المسجل": "غير متوفر", "تاريخ الإنشاء": "غير متوفر", "تاريخ الانتهاء": "غير متوفر"}
# مثال على الاستخدام (سيتم تجميعه لاحقًا)
# target_domain = "example.com"
# domain_data = get_domain_info(target_domain)
# print(domain_data)
الخطوة 2: البحث عن عناوين البريد الإلكتروني باستخدام محركات البحث
في هذه الخطوة، سنتعلم كيفية البحث عن عناوين البريد الإلكتروني المرتبطة بالهدف باستخدام محركات البحث. سنستخدم تقنية "Google Dorking" لإنشاء استعلامات بحث محددة، ثم سنستخدم مكتبة googlesearch-python لجلب النتائج. بعد ذلك، سنوضح كيفية استخراج أنماط البريد الإلكتروني من محتوى افتراضي.
ملاحظة تقنية: مكتبة
googlesearch-pythonتعتمد علىBeautifulSoup4وrequests. قم بتثبيتها باستخدامpip install beautifulsoup4 google.
أولاً، قم بتثبيت المكتبات المطلوبة:
pip install beautifulsoup4 google requests
ثم، أضف الكود التالي:
from googlesearch import search # استيراد دالة البحث من جوجل
import re # استيراد مكتبة التعبيرات النمطية (Regular Expressions)
import requests # لاستجلاب محتوى الصفحات
from bs4 import BeautifulSoup # لتحليل HTML
def find_emails_via_search(target_domain, num_results=5):
"""
تبحث عن عناوين البريد الإلكتروني المرتبطة بالنطاق باستخدام Google Dorks.
"""
print(f"\n[+] البحث عن عناوين البريد الإلكتروني للنطاق: {target_domain}")
emails = set() # استخدام مجموعة لتخزين البريد الإلكتروني الفريدة
# بناء استعلام Google Dork
query = f'"{target_domain}" email OR mail OR contact site:linkedin.com OR site:twitter.com OR site:github.com OR site:crunchbase.com'
try:
# البحث عن أفضل النتائج
for url in search(query, num_results=num_results, stop=num_results, pause=2): # تعيين تأخير بين الطلبات
print(f" [.] فحص الرابط: {url}")
try:
response = requests.get(url, timeout=5) # طلب محتوى الصفحة
if response.status_code == 200:
# استخدام Beautiful Soup لتحليل HTML واستخراج النص
soup = BeautifulSoup(response.text, 'html.parser')
text = soup.get_text() # الحصول على النص الكامل للصفحة
# التعبير النمطي للبحث عن عناوين البريد الإلكتروني
found_emails = re.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', text)
for email in found_emails:
if target_domain in email: # التأكد من أن البريد الإلكتروني ينتمي للنطاق المستهدف
emails.add(email)
except requests.exceptions.RequestException as e:
print(f" [-] خطأ في جلب الرابط {url}: {e}")
except Exception as e:
print(f" [-] خطأ في تحليل الرابط {url}: {e}")
except Exception as e:
print(f"[-] خطأ أثناء البحث عن البريد الإلكتروني: {e}")
return list(emails) # تحويل المجموعة إلى قائمة
# مثال على الاستخدام (سيتم تجميعه لاحقًا)
# target_domain = "example.com"
# emails_found = find_emails_via_search(target_domain)
# print(emails_found)
الخطوة 3: تحديد الوجود على وسائل التواصل الاجتماعي
في هذه الخطوة، سنقوم بالبحث عن ملفات تعريف (بروفايلات) وسائل التواصل الاجتماعي المرتبطة بالهدف. سنستخدم مرة أخرى googlesearch-python مع استعلامات محددة لاستهداف منصات مثل LinkedIn و Twitter و GitHub.
from googlesearch import search # استيراد دالة البحث من جوجل
def find_social_media(target_name, num_results=3):
"""
تبحث عن ملفات تعريف وسائل التواصل الاجتماعي لاسم مستهدف.
"""
print(f"\n[+] البحث عن ملفات تعريف وسائل التواصل الاجتماعي لـ: {target_name}")
social_profiles = {} # قاموس لتخزين الروابط حسب المنصة
platforms = {
"LinkedIn": f'"{target_name}" site:linkedin.com/in OR site:linkedin.com/company',
"Twitter": f'"{target_name}" site:twitter.com',
"GitHub": f'"{target_name}" site:github.com',
"Facebook": f'"{target_name}" site:facebook.com'
}
for platform, query in platforms.items():
print(f" [.] البحث عن {platform}...")
results = []
try:
for url in search(query, num_results=num_results, stop=num_results, pause=2):
results.append(url)
except Exception as e:
print(f" [-] خطأ أثناء البحث عن {platform}: {e}")
social_profiles[platform] = results
return social_profiles
# مثال على الاستخدام (سيتم تجميعه لاحقًا)
# target_name = "Example Company"
# social_data = find_social_media(target_name)
# print(social_data)
الخطوة 4: تجميع النتائج وعرضها
الآن بعد أن أصبح لدينا دوال منفصلة لجمع أنواع مختلفة من المعلومات، سنقوم بتجميعها في سكربت واحد وتنظيم النتائج لتقديم تقرير شامل ومفهوم.
def generate_report(target_domain, target_name):
"""
يجمع جميع المعلومات المستخرجة ويطبع تقريراً.
"""
print("\n" + "="*50)
print(f"تقرير OSINT للهدف: {target_name} ({target_domain})")
print("="*50)
# 1. جمع معلومات النطاق
domain_data = get_domain_info(target_domain)
print("\n--- معلومات النطاق (Whois) ---")
for key, value in domain_data.items():
print(f"{key}: {value}")
# 2. البحث عن عناوين البريد الإلكتروني
emails = find_emails_via_search(target_domain)
print("\n--- عناوين البريد الإلكتروني المحتملة ---")
if emails:
for email in emails:
print(f"- {email}")
else:
print("لم يتم العثور على عناوين بريد إلكتروني.")
# 3. تحديد الوجود على وسائل التواصل الاجتماعي
social_profiles = find_social_media(target_name)
print("\n--- ملفات تعريف وسائل التواصل الاجتماعي ---")
for platform, urls in social_profiles.items():
print(f"{platform}:")
if urls:
for url in urls:
print(f" - {url}")
else:
print(f" لم يتم العثور على ملفات تعريف لـ {platform}.")
print("\n" + "="*50)
print("انتهى تقرير OSINT.")
print("="*50)
# تعريف الهدف
# target_domain_input = input("أدخل النطاق المستهدف (مثال: example.com): ")
# target_name_input = input("أدخل الاسم أو اسم الشركة المستهدفة (مثال: Example Company): ")
# generate_report(target_domain_input, target_name_input)
الكود النهائي الكامل
إليك السكربت كاملاً، جاهزاً للنسخ والتشغيل. تأكد من تثبيت جميع المكتبات المذكورة في الخطوات السابقة (python-whois، beautifulsoup4، google، requests).
import whois
from googlesearch import search
import re
import requests
from bs4 import BeautifulSoup
import time # لاستخدام التأخير بين الطلبات
def get_domain_info(domain):
"""
تستخرج معلومات Whois لنطاق محدد.
"""
print(f"\n[+] جمع معلومات Whois للنطاق: {domain}")
try:
w = whois.whois(domain)
# التأكد من أن قيم التاريخ هي سلاسل نصية لضمان التنسيق
creation_date = str(w.creation_date) if w.creation_date else "غير متوفر"
expiration_date = str(w.expiration_date) if w.expiration_date else "غير متوفر"
domain_info = {
"النطاق": domain,
"المسجل": w.registrar if w.registrar else "غير متوفر",
"تاريخ الإنشاء": creation_date,
"تاريخ الانتهاء": expiration_date
}
return domain_info
except Exception as e:
print(f"[-] خطأ أثناء استخراج معلومات Whois: {e}")
return {"النطاق": domain, "المسجل": "غير متوفر", "تاريخ الإنشاء": "غير متوفر", "تاريخ الانتهاء": "غير متوفر"}
def find_emails_via_search(target_domain, num_results=5):
"""
تبحث عن عناوين البريد الإلكتروني المرتبطة بالنطاق باستخدام Google Dorks.
"""
print(f"\n[+] البحث عن عناوين البريد الإلكتروني للنطاق: {target_domain}")
emails = set()
query = f'"{target_domain}" email OR mail OR contact site:linkedin.com OR site:twitter.com OR site:github.com OR site:crunchbase.com'
try:
for url in search(query, num_results=num_results, stop=num_results, pause=2):
print(f" [.] فحص الرابط: {url}")
try:
response = requests.get(url, timeout=5)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'html.parser')
text = soup.get_text()
found_emails = re.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}', text)
for email in found_emails:
if target_domain in email:
emails.add(email)
except requests.exceptions.RequestException as e:
print(f" [-] خطأ في جلب الرابط {url}: {e}")
except Exception as e:
print(f" [-] خطأ في تحليل الرابط {url}: {e}")
time.sleep(1) # تأخير إضافي لتجنب حظر IP
except Exception as e:
print(f"[-] خطأ أثناء البحث عن البريد الإلكتروني: {e}")
return list(emails)
def find_social_media(target_name, num_results=3):
"""
تبحث عن ملفات تعريف وسائل التواصل الاجتماعي لاسم مستهدف.
"""
print(f"\n[+] البحث عن ملفات تعريف وسائل التواصل الاجتماعي لـ: {target_name}")
social_profiles = {}
platforms = {
"LinkedIn": f'"{target_name}" site:linkedin.com/in OR site:linkedin.com/company',
"Twitter": f'"{target_name}" site:twitter.com',
"GitHub": f'"{target_name}" site:github.com',
"Facebook": f'"{target_name}" site:facebook.com' # قد يتطلب دقة أكبر لنتائج مفيدة
}
for platform, query in platforms.items():
print(f" [.] البحث عن {platform}...")
results = []
try:
for url in search(query, num_results=num_results, stop=num_results, pause=2):
results.append(url)
except Exception as e:
print(f" [-] خطأ أثناء البحث عن {platform}: {e}")
social_profiles[platform] = results
time.sleep(1) # تأخير إضافي لتجنب حظر IP
return social_profiles
def generate_report(target_domain, target_name):
"""
يجمع جميع المعلومات المستخرجة ويطبع تقريراً.
"""
print("\n" + "="*50)
print(f"تقرير OSINT للهدف: {target_name} ({target_domain})")
print("="*50)
# 1. جمع معلومات النطاق
domain_data = get_domain_info(target_domain)
print("\n--- معلومات النطاق (Whois) ---")
for key, value in domain_data.items():
print(f"{key}: {value}")
# 2. البحث عن عناوين البريد الإلكتروني
emails = find_emails_via_search(target_domain)
print("\n--- عناوين البريد الإلكتروني المحتملة ---")
if emails:
for email in emails:
print(f"- {email}")
else:
print("لم يتم العثور على عناوين بريد إلكتروني.")
# 3. تحديد الوجود على وسائل التواصل الاجتماعي
social_profiles = find_social_media(target_name)
print("\n--- ملفات تعريف وسائل التواصل الاجتماعي ---")
for platform, urls in social_profiles.items():
print(f"{platform}:")
if urls:
for url in urls:
print(f" - {url}")
else:
print(f" لم يتم العثور على ملفات تعريف لـ {platform}.")
print("\n" + "="*50)
print("انتهى تقرير OSINT.")
print("="*50)
if __name__ == "__main__":
target_domain_input = input("أدخل النطاق المستهدف (مثال: example.com): ")
target_name_input = input("أدخل الاسم أو اسم الشركة المستهدفة (مثال: Example Company): ")
generate_report(target_domain_input, target_name_input)
النتيجة المتوقعة
عند تشغيل السكربت، سيُطلب منك إدخال النطاق المستهدف (مثل google.com) واسم الشركة أو الشخص المستهدف (مثل Google Inc.). بعد الإدخال، سيقوم السكربت بالخطوات التالية:
- طباعة معلومات Whois للنطاق المدخل.
- البحث عن عناوين البريد الإلكتروني المرتبطة بالنطاق من خلال محركات البحث، وعرض أي عناوين يتم العثور عليها.
- البحث عن روابط لملفات تعريف وسائل التواصل الاجتماعي (LinkedIn, Twitter, GitHub, Facebook) المتعلقة بالاسم المستهدف، وعرض الروابط المكتشفة.
- في النهاية، سيتم عرض تقرير شامل يجمع جميع المعلومات المستخرجة في تنسيق مقروء على سطر الأوامر.
مثال على جزء من الإخراج المتوقع (مع الأخذ في الاعتبار أن النتائج ستختلف بناءً على الهدف ومحتوى الويب في وقت التشغيل):
[+] جمع معلومات Whois للنطاق: example.com
--- معلومات النطاق (Whois) ---
النطاق: example.com
المسجل: IANA
تاريخ الإنشاء: 1995-08-14 04:00:00
تاريخ الانتهاء: غير متوفر
[+] البحث عن عناوين البريد الإلكتروني للنطاق: example.com
[.] فحص الرابط: http://www.example.com/contact
[.] فحص الرابط: http://www.example.org/about
[-] خطأ في جلب الرابط ... (أو استخراج بريد إلكتروني)
--- عناوين البريد الإلكتروني المحتملة ---
- info@example.com
- support@example.com
[+] البحث عن ملفات تعريف وسائل التواصل الاجتماعي لـ: Example Company
[.] البحث عن LinkedIn...
[.] البحث عن Twitter...
--- ملفات تعريف وسائل التواصل الاجتماعي ---
LinkedIn:
- https://www.linkedin.com/company/example-company
Twitter:
- https://twitter.com/ExampleCompany
GitHub:
لم يتم العثور على ملفات تعريف لـ GitHub.
Facebook:
- https://www.facebook.com/ExampleCompanyPage
==================================================
انتهى تقرير OSINT.
==================================================