3 פרויקטי CTF שתוכלו להקים בבית הערב, בלי לחכות לתחרות¶
הרבה אנשים חושבים ש-CTF זה משהו שקורה רק בתחרות מאורגנת, עם צוות, עם שעון רץ, ועם שרתים של מישהו אחר. זה לא נכון. חלק גדול מהלמידה הכי טובה בתחום קורה כשאתם בונים לעצמכם אתגר קטן, לבד, בבית, ופשוט נאבקים בו עד שהוא נשבר. הנה שלושה פרויקטים כאלה שאפשר להתחיל היום, לפי סדר עולה של מורכבות.
לפני שנתחיל, הערה אחת שחוזרת בכל פוסט כזה כי היא באמת חשובה - כל מה שמתואר כאן מתבצע נגד מכונות שאתם הקמתם בעצמכם, במעבדה שלכם, מנותקת מהעולם. לא נגד שרת של מישהו אחר בלי אישור.
רעיון 1 - מכונה פגיעה עם כתיבת writeup מלא¶
הדרך הכי מהירה להתחיל היא להוריד מכונה וירטואלית שכבר בנויה עם פגיעויות מכוונות. שני מקורות טובים - DVWA, שהיא אפליקציית ווב פגיעה שרצה בקלות בדוקר, ואתרים כמו VulnHub, שמארחים מכונות שלמות עם רמות קושי שונות שצריך לפרוץ מקצה לקצה, כולל העלאת הרשאות בסוף.
מה שהופך את הפרויקט הזה לשווה יותר מסתם "לפתור ולעבור הלאה" הוא כתיבת writeup - תיעוד מסודר של כל שלב שעשיתם. סריקה ראשונית עם nmap, מה מצאתם, איך זיהיתם את הפגיעות, איך ניצלתם אותה, ואיך העליתם הרשאות עד ל-root או Administrator. writeup טוב כולל גם את הדרכים שלא עבדו לכם, לא רק את הפתרון הסופי.
הערך האמיתי כאן הוא שבעוד שנה, כשתשבו בראיון עבודה ומישהו ישאל "ספר לי על פרויקט שעשית", יהיה לכם מסמך אמיתי להראות במקום לנסות לזכור מהזיכרון. מי שרוצה להעמיק בדיוק בתחום הזה, בקורס בודק החדירות שלי יש בניית מסלול שלם מהיסודות ועד לתקיפת מכונות כאלה בצורה שיטתית.
רעיון 2 - לבנות אפליקציית ווב פגיעה בעצמכם¶
זה השלב הבא, וגם המלמד ביותר מבין השלושה. במקום להוריד אפליקציה שמישהו אחר בנה עם פגיעות, תבנו אחת קטנה בעצמכם, בכוונה עם באג. למשל, דף התחברות פשוט בפייתון עם Flask שבודק שם משתמש וסיסמה מול בסיס נתונים, אבל בונה את השאילתה עם concatenation של מחרוזות במקום parameterized query - כלומר עם חור SQL Injection קלאסי.
אחרי שהבאג בפנים, תעברו לכובע השני ותנסו לפרוץ למה שבניתם. תזריקו ' OR '1'='1 בשדה הסיסמה ותראו את ההתחברות עוקפת את הבדיקה. אחר כך תוסיפו שדה תגובה שמציג טקסט שהמשתמש הזין בלי סניטציה, ותנסו להריץ עליו XSS פשוט.
היתרון הגדול כאן הוא שאתם רואים את הבעיה משני הצדדים - גם כמפתחים שכתבו את הקוד הפגיע, וגם כתוקפים שמנצלים אותו. זה בדיוק ההבנה שהופכת בודק חדירות טוב, כי אתם לא רק יודעים לזהות דפוס מוכר, אתם מבינים למה הקוד נשבר ברמת המנגנון.
רעיון 3 - אתגר buffer overflow פשוט בשפת C¶
זה הרעיון הכי מאתגר, וגם הכי שווה למי שרוצה להבין ניצול בינארי מהיסוד. תכתבו תוכנית קטנה ב-C עם פונקציה שמעתיקה קלט משתמש למשתנה עם strcpy לתוך מערך בגודל קבוע, בלי בדיקת גבולות. משהו כמו מערך של 64 בתים שמקבל קלט מהמשתמש בלי שום הגבלת אורך.
תקמפלו את זה עם הגנות כבויות - כלומר בלי stack protector ובלי ASLR, כדי שתוכלו לראות את המנגנון בצורה נקייה בלי להילחם בהגנות מתקדמות מדי בשלב הזה. אחר כך תשתמשו בכלי כמו gdb כדי לראות איך המחסנית נראית, איפה כתובת החזרה יושבת, ותנסו לבנות קלט שדורס אותה ומפנה את הריצה לפונקציה אחרת בתוכנית, כמו פונקציה נסתרת שמדפיסה "פרצתי".
זה לא פרויקט של יום אחד. זה פרויקט שילמד אתכם יותר על איך תוכנית באמת רצה בזיכרון מכל קורס תיאורטי. אחרי שתשלטו בגרסה הבסיסית, אפשר להדליק בהדרגה הגנות אמיתיות ולנסות לעקוף אותן, שזה כבר נושא בפני עצמו.
לסיכום¶
שלושת הפרויקטים האלה בונים זה על גבי זה - מהרצה של מכונה מוכנה, דרך יצירת פגיעות בעצמכם, ועד לניצול ברמת הבינארי. אתם לא צריכים לחכות לתחרות CTF כדי להתחיל להתאמן. כל מה שצריך זה מכונה וירטואלית, קצת סבלנות, והנכונות להתעצבן על שגיאה עד שהיא נשברת.
אם אתם רוצים ללמוד את זה בצורה מובנית, עם תרגול מודרך ולא רק זריקה למים, קורס בודק החדירות שלי בעברית בדיוק בנוי בשביל זה - מהיסודות ועד לתרגילים מעשיים כמו אלה שתיארתי כאן.