أبحاث ثغرات الويب وعمليات الإقامة الطويلة
اكتشاف ثغرات جديدة، تحليل المتغيرات، وعمليات منخفضة وبطيئة
لماذا هذا الدرس مختلف
الدروس السابقة (web-attacks، advanced-web، web-redteam-deep) علّمتك كيف تستغل ثغرات معروفة. هذا الدرس يعلّمك كيف تجد ثغرة لم يكتشفها أحد بعد، وكيف تبقى داخل الهدف لأشهر دون أن تُكتشف. هذه المهارة الحقيقية لفرق العمليات المصرّح لها فيدرالياً — لأن الثغرات الجديدة لا تحتوي توقيعات IDS وتعطي وصولاً قبل أن يكتب أحد patch.
منهجية البحث — هرم الإيجاد
الباحثون الجادون لا يبدأون بـ fuzzer عشوائي. يتبعون هرماً — كل طبقة أرخص بكثير من التالية:
Patch Diffing عملياً — الطريق الأقصر للـ n-day
أكثر من 60% من "الـ 0-days" التي يستخدمها مهاجمو الدول هي n-days — ثغرات صدر patch لها لكن الضحية لم يحدّث. الفرق بينك وبين APT هو من يقرأ الـ patch أسرع.
راقب: github.com/<vendor>/<product>/security/advisories، رسائل oss-security@، وملفات CHANGELOG. كلمات تستحق التنبيه: sanitize, escape, validate, auth, bypass, regression, CVE.
كل سطر تحقق مُضاف يجيب على سؤال: "ما المدخل الذي كان يكسر هذا؟". لو رأيت if (user.id != session.id) reject()، الـ trigger هو طلب يستخدم session واحدة وuser id آخر.
كثير من الـ patches ناقصة. لو أصلحوا /api/users/<id>، تحقق من /api/v2/users/<id> و/internal/users/<id> و/admin/users?id=. غالباً واحد منها نُسي.
Variant Analysis — كيف تحوّل ثغرة إلى عشر
لما تجد ثغرة، اسأل ثلاثة أسئلة فوراً:
- لماذا حدثت؟ ما الفرضية الخاطئة في عقل المطور؟ (مثلاً: "الـ URL parser يطابق ما تراه عيني").
- أين الفرضية نفسها مكررة؟ grep لنفس النمط في الـ codebase وفي مشاريع منافسة.
- ما هو الـ root API الضعيف؟ لو كان urllib.parse، فكل مشروع يستخدمه عرضة. اصعد إلى الجذر.
# نمط 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، راقب التغطية.
# مثال 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 --syncLogic 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) → ترسل الرابط لنطاقك → استلام التوكن.
ابتكار ثغرة عندما لا توجد — التفكير الخصومي
أحياناً الكود نظيف. الثغرة في بنية النظام:
- اكتب نموذج التهديد للهدف من الذاكرة، لا تنظر للكود. ما الفرضيات؟ (مثلاً: "CDN يمنع IP غير مدرج").
- اقتل كل فرضية واحدة-واحدة. هل يمكن تجاوز CDN عبر origin مكشوف؟ هل يمكن خداع الـ allow-list بـ DNS rebinding؟
- اربط primitives صغيرة. CRLF + open redirect + cache بدون keying = SSRF لكامل CDN. كل جزء وحده "لا يستحق الإبلاغ"؛ مجتمعة = critical.
- اقرأ المنشورات الأكاديمية. USENIX Security, IEEE S&P, BlackHat USA. تقنيات تظهر فيها قبل سنتين من ظهورها في bug bounties.
عمليات الإقامة الطويلة — Long-Haul Tradecraft
اكتشاف الثغرة هو 20% من العملية. الـ 80% الباقية: كيف تبقى داخل الشبكة 6-18 شهراً دون أن يُكتشف وجودك. هذا ما يميّز APT عن "script kiddie لديه CVE".
مبادئ الـ Long-Haul الستة
كل ثنائية تسقطها = توقيع. استخدم ما هو موجود: curl, wget, certutil, bitsadmin, schtasks, wmic, PowerShell, sudo, cron, systemd. الويبشل الأمثل في 2026 ليس c99.php — هو سطر واحد مدفون في ملف JSON إعدادات.
تجنب autoruns, services, scheduled tasks الواضحة. بدلاً منها: عدّل ملف .bashrc لخدمة، أضف صفحة إلى Confluence/SharePoint داخلية فيها webshell، أنشئ Lambda بصلاحيات IAM دائمة، عدّل قالب CloudFormation. هذه "مرئية" لكن لا تثير alerts.
قواعد ذهبية: (أ) لا beacon ثابت الفترة، (ب) تجنب IPs، استخدم نطاقات بسمعة (ج) TLS بشهادة LetsEncrypt حقيقية على نطاق "ممل" مسجّل قبل 6 أشهر، (د) شغّل beacon فقط داخل ساعات عمل المنطقة الزمنية للهدف.
الـ implant الذكي ينام أسابيع. Volt Typhoon (CCP APT المُتهم باختراق بنى تحتية أمريكية حرجة) بقي خاملاً 5 سنوات في بعض الأهداف. التفعيل عبر trigger خارجي (مثلاً تغريدة بـ hash معين، أو سجل DNS TXT يتحدث).
اقسم وصولك ثلاث طبقات: (1) recon — IP عبر VPN عام، يمكن أن يحرق، (2) operational — تستخدمه لجمع المعلومات، (3) crown jewel — لا يُستخدم إلا لاستخراج البيانات الحاسمة، مرة كل أشهر. حرق طبقة 1 لا يكشف 2 أو 3.
تعليقات في الكود، رسائل خطأ، أسماء ملفات، أوقات النشاط، حتى ترتيب لوحة المفاتيح — كل واحد يخون الجنسية. APT الأمريكية وُصفت بأنها "الوحيدة التي ترسل beacons في الإجازات الأمريكية لا الصينية". (راجع Equation Group leaks).
استخراج البيانات بدون أن يُلاحظ
- تجزئة + تشفير + استبطاء: 100GB على 90 يوم بمعدل 12MB/ساعة لا يُلاحظ في معظم بيئات.
- قنوات شرعية: ارفع البيانات إلى Google Drive/Dropbox/OneDrive بحساب enterprise "منسي". DLP غالباً تتسامح مع وجهات الـ SaaS المعروفة.
- DNS exfil كملاذ أخير فقط؛ بطيء وصاخب لو قارنته بـ HTTPS لخدمة معروفة.
- Steganography داخل صور تُرفع لمنصات تواصل اجتماعي شرعية (مع الحذر من إعادة الترميز).
الدفاع — كيف يصطاد المدافع البارع كل ما سبق
- 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) تفترض أن العدو داخل، تبحث استباقياً كل أسبوع.
الخط الأخلاقي والقانوني — قبل أن تبدأ
- لا تختبر على نظام بدون إذن مكتوب. "الموقع علني" لا يعني "مأذون". 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 — أبحاث أكاديمية تسبق الصناعة بسنتين