إعداد Burp Suite: اعتراض وتحليل وتعديل طلبات الويب (HTTP Requests)


مقدمة سريعة: ماذا سنتعلم اليوم؟

سنتعلم اليوم كيفية إعداد أداة Burp Suite لاحتراف اعتراض وتحليل وتعديل طلبات الويب (HTTP/HTTPS) الصادرة من متصفحك أو أي تطبيق آخر، مما يمكنك من فهم أعمق لتفاعلات الويب واكتشاف الثغرات الأمنية.

الخطوة 1: تهيئة Burp Suite وتشغيل البروكسي (Proxy Listener)

Burp Suite يعمل كوسيط (proxy) بين متصفحك والإنترنت. أول خطوة هي التأكد من أن البروكسي الخاص بـ Burp Suite يعمل على المنفذ الافتراضي (عادةً 8080).

ملاحظة تقنية: Burp Suite يسمح لك بتعديل منفذ الاستماع (listener port) أو إضافة منافذ أخرى، لكن 8080 هو الأكثر شيوعاً. تأكد من عدم وجود خدمة أخرى تستخدم هذا المنفذ.

للتأكد من أن البروكسي يعمل، افتح Burp Suite وانتقل إلى تبويب "Proxy" ثم "Options". يجب أن ترى قائمة بـ "Proxy Listeners" مع عنوان IP ومنفذ (مثل 127.0.0.1:8080) وحالة "Running".

كمثال توضيحي لكيفية إرسال طلب HTTP بسيط (قبل تهيئة البروكسي) باستخدام Python:

import requests

# عنوان URL الذي سنرسل إليه الطلب
TARGET_URL = "http://httpbin.org/get"

def send_basic_request():
    """
    دالة لإرسال طلب HTTP GET بسيط بدون استخدام بروكسي.
    """
    try:
        # إرسال طلب GET
        response = requests.get(TARGET_URL)
        # طباعة حالة الاستجابة
        print(f"حالة الاستجابة (بدون بروكسي): {response.status_code}")
        # طباعة جزء من المحتوى
        print("جزء من المحتوى:")
        print(response.text[:200])
    except requests.exceptions.RequestException as e:
        print(f"حدث خطأ أثناء إرسال الطلب (بدون بروكسي): {e}")

if __name__ == "__main__":
    print("--- إرسال طلب أساسي بدون بروكسي ---")
    send_basic_request()

الخطوة 2: تهيئة المتصفح أو العميل لاستخدام بروكسي Burp Suite

بعد تشغيل بروكسي Burp Suite، يجب عليك إخبار متصفحك (أو أي تطبيق آخر) بتوجيه حركة المرور عبره. سنستخدم هنا متصفح Firefox كمثال، ولكن المبدأ ينطبق على أي عميل يدعم إعدادات البروكسي.

  1. افتح Firefox.
  2. اذهب إلى الإعدادات (Settings).
  3. ابحث عن "Proxy" أو "Network Settings".
  4. اختر "Manual proxy configuration".
  5. أدخل 127.0.0.1 كـ "HTTP Proxy" و 8080 كـ "Port".
  6. كرر نفس الشيء لـ "SSL Proxy" أو "HTTPS Proxy" إذا كان متاحاً.
  7. تأكد من تفعيل "Use this proxy server for all protocols" أو ما يعادلها.
  8. احفظ التغييرات.

الآن، أي طلب HTTP/HTTPS ترسله من Firefox سيمر عبر Burp Suite. دعنا نرى كيف يمكن لسكربت Python أن يفعل الشيء نفسه:

import requests

TARGET_URL = "http://httpbin.org/get"
BURP_PROXY = {"http": "http://127.0.0.1:8080", "https": "http://127.0.0.1:8080"}

def send_request_via_proxy():
    """
    دالة لإرسال طلب HTTP GET عبر بروكسي Burp Suite.
    """
    try:
        # إرسال طلب GET عبر البروكسي المحدد
        # 'verify=False' مطلوب عادة للطلبات عبر HTTPS عند استخدام Burp Suite
        # لأنه يستخدم شهادة موقعة ذاتياً.
        response = requests.get(TARGET_URL, proxies=BURP_PROXY, verify=False)
        print(f"حالة الاستجابة (عبر البروكسي): {response.status_code}")
        print("جزء من المحتوى:")
        print(response.text[:200])
    except requests.exceptions.RequestException as e:
        print(f"حدث خطأ أثناء إرسال الطلب (عبر البروكسي): {e}")

if __name__ == "__main__":
    # هذا الجزء سيتم تشغيله فقط عند تشغيل السكربت مباشرة
    print("\n--- إرسال طلب عبر بروكسي Burp Suite ---")
    send_request_via_proxy()
ملاحظة أمنية: عند استخدام Burp Suite لاعتراض حركة مرور HTTPS، ستحتاج إلى تثبيت شهادة CA الخاصة بـ Burp Suite في متصفحك أو نظام التشغيل لتجنب تحذيرات الأمان. هذا يضمن أن متصفحك يثق في الشهادة التي يقدمها Burp Suite.

الخطوة 3: اعتراض وتحليل طلبات الويب في Burp Suite

بعد تهيئة العميل (المتصفح أو السكربت) لإرسال الطلبات عبر Burp Suite، يمكنك الآن اعتراضها وتحليلها. في Burp Suite، انتقل إلى تبويب "Proxy" ثم "Intercept". تأكد من أن "Intercept is on" (الزر يجب أن يكون مضاءً باللون البرتقالي أو الأخضر).

عندما تقوم بإرسال طلب من متصفحك أو تقوم بتشغيل السكربت السابق، سيظهر الطلب في نافذة "Intercept" في Burp Suite. يمكنك هنا رؤية كل تفاصيل الطلب:

  • HTTP Method (GET, POST, etc.)
  • URL
  • HTTP Headers (Host, User-Agent, Cookie, Referer, etc.)
  • Parameters (GET, POST, JSON body)

الآن، دعنا نرسل طلباً مع بعض الرؤوس المخصصة لنرى كيف تظهر في Burp Suite:

import requests

TARGET_URL = "http://httpbin.org/headers" # خدمة تعرض الرؤوس المستلمة
BURP_PROXY = {"http": "http://127.0.0.1:8080", "https": "http://127.0.0.1:8080"}

def send_request_with_custom_headers():
    """
    دالة لإرسال طلب HTTP GET مع رؤوس مخصصة عبر بروكسي Burp Suite.
    """
    # تعريف الرؤوس المخصصة
    custom_headers = {
        "User-Agent": "MyCustomBurpAgent/1.0",
        "X-Custom-Header": "BurpSuite_Test_Value"
    }
    try:
        # إرسال الطلب مع الرؤوس المخصصة وعبر البروكسي
        response = requests.get(TARGET_URL, headers=custom_headers, proxies=BURP_PROXY, verify=False)
        print(f"حالة الاستجابة (مع رؤوس مخصصة): {response.status_code}")
        print("الرؤوس المستلمة من الخادم (جزء):")
        # httpbin.org/headers يعيد الرؤوس كـ JSON
        print(response.json().get('headers', {}))
    except requests.exceptions.RequestException as e:
        print(f"حدث خطأ أثناء إرسال الطلب (مع رؤوس مخصصة): {e}")

if __name__ == "__main__":
    print("\n--- إرسال طلب مع رؤوس مخصصة عبر بروكسي Burp Suite ---")
    send_request_with_custom_headers()

الخطوة 4: تعديل طلبات الويب وإعادة إرسالها

الميزة الأقوى في Burp Suite هي القدرة على تعديل الطلبات قبل إرسالها إلى الخادم. عندما تعترض طلباً في تبويب "Proxy" -> "Intercept"، يمكنك:

  1. تغيير طريقة HTTP (GET إلى POST).
  2. تعديل URL أو المسار.
  3. إضافة، تعديل، أو حذف رؤوس HTTP.
  4. تعديل جسم الطلب (Request Body) لطلبات POST أو PUT.
  5. إعادة إرسال الطلب المعدل إلى الخادم مباشرةً ("Forward") أو إرساله إلى أدوات أخرى في Burp Suite مثل "Repeater" أو "Intruder" لإجراء اختبارات متقدمة.

لإظهار مفهوم التعديل برمجياً، لنفترض أننا نريد تغيير طريقة الطلب وبعض الرؤوس قبل إرساله. في Burp Suite، ستقوم بذلك يدوياً، ولكن يمكننا محاكاة إرسال طلب "معدل" باستخدام Python:

import requests

TARGET_URL = "http://httpbin.org/post" # خدمة تستقبل طلبات POST
BURP_PROXY = {"http": "http://127.0.0.1:8080", "https": "http://127.0.0.1:8080"}

def send_modified_request():
    """
    دالة لإرسال طلب POST معدل عبر بروكسي Burp Suite.
    نحن هنا نحاكي عملية التعديل التي تتم يدوياً في Burp Suite
    عبر بناء الطلب المعدل مباشرة في السكربت.
    """
    modified_headers = {
        "User-Agent": "ModifiedBurpAgent/2.0",
        "X-Modified-Data": "This_was_changed_in_transit",
        "Content-Type": "application/json" # إضافة header جديد
    }
    modified_data = {
        "username": "admin",
        "password": "modified_password123",
        "action": "login"
    }
    try:
        # إرسال طلب POST مع الرؤوس والبيانات المعدلة وعبر البروكسي
        response = requests.post(TARGET_URL, headers=modified_headers, json=modified_data, proxies=BURP_PROXY, verify=False)
        print(f"حالة الاستجابة (بعد التعديل): {response.status_code}")
        print("جزء من الاستجابة (بيانات الطلب المستلمة من الخادم):")
        print(response.json().get('json', {}))
        print("الرؤوس التي أرسلتها (من الخادم):")
        print(response.json().get('headers', {}).get('X-Modified-Data')) # تأكيد إرسال الرأس المعدل
    except requests.exceptions.RequestException as e:
        print(f"حدث خطأ أثناء إرسال الطلب (بعد التعديل): {e}")

if __name__ == "__main__":
    print("\n--- إرسال طلب معدل عبر بروكسي Burp Suite ---")
    send_modified_request()

الكود النهائي الكامل

هذا السكربت يجمع الأمثلة السابقة، ويسمح لك بتجربة إرسال طلبات عادية، وطلبات عبر البروكسي، وطلبات معدلة عبر البروكسي. تأكد من تشغيل Burp Suite وتفعيل البروكسي على 127.0.0.1:8080 قبل تشغيل السكربت.

import requests

# عناوين URL المستهدفة للاختبار
TARGET_GET_URL = "http://httpbin.org/get"
TARGET_HEADERS_URL = "http://httpbin.org/headers"
TARGET_POST_URL = "http://httpbin.org/post"

# إعدادات البروكسي لـ Burp Suite
BURP_PROXY = {"http": "http://127.0.0.1:8080", "https": "http://127.0.0.1:8080"}

def send_basic_request():
    """
    دالة لإرسال طلب HTTP GET بسيط بدون استخدام بروكسي.
    """
    print("\n--- إرسال طلب أساسي بدون بروكسي ---")
    try:
        response = requests.get(TARGET_GET_URL)
        print(f"حالة الاستجابة: {response.status_code}")
        print(f"جزء من المحتوى: {response.text[:100]}...")
    except requests.exceptions.RequestException as e:
        print(f"حدث خطأ: {e}")

def send_request_via_proxy():
    """
    دالة لإرسال طلب HTTP GET عبر بروكسي Burp Suite.
    """
    print("\n--- إرسال طلب عبر بروكسي Burp Suite ---")
    try:
        # 'verify=False' مطلوب عادة للطلبات عبر HTTPS عند استخدام Burp Suite
        # لأنه يستخدم شهادة موقعة ذاتياً.
        response = requests.get(TARGET_GET_URL, proxies=BURP_PROXY, verify=False)
        print(f"حالة الاستجابة: {response.status_code}")
        print(f"جزء من المحتوى: {response.text[:100]}...")
    except requests.exceptions.RequestException as e:
        print(f"حدث خطأ: {e}")

def send_request_with_custom_headers():
    """
    دالة لإرسال طلب HTTP GET مع رؤوس مخصصة عبر بروكسي Burp Suite.
    """
    print("\n--- إرسال طلب مع رؤوس مخصصة عبر بروكسي Burp Suite ---")
    custom_headers = {
        "User-Agent": "MyCustomBurpAgent/1.0-FullScript",
        "X-Custom-Header": "BurpSuite_Test_Value_FullScript"
    }
    try:
        response = requests.get(TARGET_HEADERS_URL, headers=custom_headers, proxies=BURP_PROXY, verify=False)
        print(f"حالة الاستجابة: {response.status_code}")
        print("الرؤوس المستلمة من الخادم (جزء):")
        # httpbin.org/headers يعيد الرؤوس كـ JSON
        print(response.json().get('headers', {}).get('X-Custom-Header'))
    except requests.exceptions.RequestException as e:
        print(f"حدث خطأ: {e}")

def send_modified_request():
    """
    دالة لإرسال طلب POST معدل عبر بروكسي Burp Suite.
    """
    print("\n--- إرسال طلب معدل (POST) عبر بروكسي Burp Suite ---")
    modified_headers = {
        "User-Agent": "ModifiedBurpAgent/2.0-FullScript",
        "X-Modified-Data": "This_was_changed_in_transit_FullScript",
        "Content-Type": "application/json"
    }
    modified_data = {
        "username": "full_script_user",
        "password": "full_script_password",
        "action": "login_full_script"
    }
    try:
        response = requests.post(TARGET_POST_URL, headers=modified_headers, json=modified_data, proxies=BURP_PROXY, verify=False)
        print(f"حالة الاستجابة: {response.status_code}")
        print("البيانات المرسلة (من الخادم):")
        print(response.json().get('json', {}).get('password'))
        print("الرؤوس التي أرسلتها (من الخادم):")
        print(response.json().get('headers', {}).get('X-Modified-Data'))
    except requests.exceptions.RequestException as e:
        print(f"حدث خطأ: {e}")

if __name__ == "__main__":
    send_basic_request()
    send_request_via_proxy()
    send_request_with_custom_headers()
    send_modified_request()

النتيجة المتوقعة

عند تشغيل السكربت، ستلاحظ ما يلي:

  1. سيتم طباعة حالات الاستجابة وأجزاء من المحتوى لكل طلب يتم إرساله (بدون بروكسي، وعبر البروكسي، ومع الرؤوس المخصصة، والطلب المعدل).
  2. الأهم من ذلك، إذا كان Burp Suite يعمل وكان تبويب "Proxy" -> "Intercept" مفعّلاً، فستعترض جميع الطلبات التي يتم إرسالها عبر البروكسي (الطلبات الثلاثة الأخيرة في السكربت).
  3. في Burp Suite، ستتمكن من رؤية تفاصيل كل طلب، بما في ذلك الرؤوس المخصصة والبيانات المعدلة التي أرسلها السكربت. يمكنك بعد ذلك "Forward" الطلبات لمشاهدة الاستجابات في السكربت.
  4. بالنسبة للطلب الأخير، سترى أن الرؤوس والبيانات التي تم تحديدها في السكربت قد وصلت إلى الخادم (httpbin.org) وتم عكسها في الاستجابة.

هذا يوضح كيف يمكنك استخدام Burp Suite لاعتراض وتحليل وتعديل حركة مرور الويب، سواء كانت صادرة من متصفح أو من سكربت برمجي.