סיכום תחרות האקינג של אוגוסט פינגווין

לפני שאני מתחיל לתאר מה קרה בתחרות אני רוצה לציין נקודה שכדאי שתשב טוב טוב בראש של קוראי – פוסט זה נכתב ע”י מי שהפסיד. יש לראות את כל מה שנכתב באור זה.

עוד הייתי רוצה להגיד מספר מילים על הקבוצה המנצחת. מבחינות רבות היתה זו הקבוצה האידאלית. שלושה אנשים שאף אחד מהם אינו קוטל קנים בלינוקס, ומצד שני אנשים צנועים שלא סובלים מעודף אגו, ולכן יכולים לראות מישהו אחר מחזיק את המקלדת. הם ניצחו, וניצחו ביושר ובזכות. הגיע להם לנצח.

(מימין לשמאל – עדי סתו, עמוס שפירא וצפריר כהן. התמונה צולמה ע”י שושנה פורבס).

התחרות


מטרת התחרות היתה לעמוד במשימות כמה שיותר מהר. היינו יכולים לנצח בהפרש גדול אם היינו זוכרים את הנקודה הקטנה הזו. נו, טויב.

Stage 2


משימה מספר אחת, שהוצגה ע”י אבירם עוד בתוך האולם, היתה לשנות את תוכנו של קובץ מ-Locked ל-Unlocked. בדברי הסיכום אבירם אמר שהוא ציפה שהמשימה הזו תיקח כשעה. אין לי מושג למה. לי היה ברור מה עומד לצפות לנו על המכונה עוד לפני שיצאתי מהאולם, ומהזמן שלקח לקבוצה השניה נראה שגם להם היה דיי ברור.

הרעיון היה לשנות את הקובץ ‎/etc/stage2.tmp, שאמר משהו בסגנון של:

This is the door to Stage 2:
Status: Locked



הטריק – הקובץ, על מערכת ext2, הכיל flag שנקרא “immuteable”. זה אומר שלא ניתן לשנות אותו. היה צורך להשתמש ב-chattr כדי לבטל את הדגל, ואז ניתן היה לשנות אותו. מכיוון שרק שמעתי על האופציה הזו עד היום (אתמול), הייתי צריך לקרוא את דף ההסבר כדי לוודא איך משתמשים בפקודה. When all else fails – read the manual.

למה Stage2? בגלל שהיה גם שלב מקדים. הסיסמא שניתנה לנו היתה למשתמש “root”. המשתמש הנ”ל היה מחוסר הרשאות. המשתמש “nobody” היה מחוסר סיסמא, ובעל מספר משתמש 0. למי שלא מבין ביוניקס – nobody בעצם היה root. אפילו מארגני האתגרים לא ראו לנכון לקרוא לזה “מכשול”.

בסופו של דבר נפתרו שני השלבים הראשונים תוך מספר דקות, ע”י שתי הקבוצות. למעשה, שנינו פתרנו את השלב באותו הזמן. הצעה לסדר היום – כולם כבר יודעים על immuteable. מכיוון שאין לו שום שימוש אחר מלבד לעבוד על אנשים, אני מציע להוציא אותו לגמלאות.

Stage 3


במובנים מסויימים, השלב הזה היה גולת הכותרת של התחרות. המטרה היתה לחזור על הפעולה, אולם הפעם על הקובץ “‎/usr/local/august/stage3.tmp”. הקובץ ישב בתוך מערכת קבצים שהיתה loopback mounted לתוך קובץ – דהיינו – מערכת הקבצים ישבה בתוך קובץ, ולא ישירות על הדיסק. לקח מספר 1 – לגבות את הקובץ לפני שמתחילים לעבוד עליו. כמו כן, מערכת הקבצים היתה minix, מערכת יוניקסית לחלוטין, אבל לא מקובלת בעולם הלינוקס (או בכלל יותר).

מעצם העובדה שהמארגנים הדגישו את העובדה שמולי מעורב בעניין, היה ברור שהבעיה פה היא קרנל שהם שינו. עדיין, אנחנו בחרנו ללכת במסלול הסטנדרטי של טיפול בבעיות מסוג זה. יש נהלים מקובלים לטיפול במכונות שידוע שטיפלו בהם.

נסיון פשוט לערוך את הקובץ עם vi גרם לכך שתוכן הקובץ אופס לחלוטין. לקח מספר 2 – מארגני התחרות לא מאמינים במקום לטעויות. אוקיי – בשלב הזה גיבינו את הקובץ שממנו באה מערכת הקבצים. בשלב הבא ניסינו לערוך את הקבצים במקום אחר, ותחת שמות שונים מעט. לפחות חלק מהנסיונות אף הן נכשלו. אני לא במאה אחוז סגור על זה, אבל נראה לי שיותר נסיונות נכשלו ממה שהיו צריכים, אבל באגים ב”תיקון” של מולי רק עזרו לנו בהמשך, כך שאל לי להתלונן. בכל מקרה, היה ברור ש-“cp” לא בדיוק מעתיק, ו-“mv” לא בדיוק משנה שם.

בשלב הזה יש שתי אופציות. האחת היא שמישהו שיחק עם הכלים cp ו-mv, והשניה היא שמישהו שיחק עם הקרנל. רק כדי לוודא שזה לא המקרה הראשון, עשינוי שתי בדיקות. הראשונה היא להריץ mv עם strace, מה שאישר שהפונקציות הנכונות בקרנל נקראות. השניה היתה להריץ חיפוש אחר עוד קבצים שנקראים mv. מכיוון ש-locate צריך מידע על הקבצים, והמידע לא היה קיים, הרצנו את הפקודה לעדכן את המידע (updatedb). לא השתמשנו במידע הזה בסוף – strace נתן לנו את מה שהיינו צריכים, אבל המידע הזה כן עזר לנו בשלב הבא.

אחרי שידענו את מה שהיה ברור מראש, שהקרנל שונה, עשינו את מה שכל מי שלמד על טיפול במחשבים שפרצו אליהם מונחה לעשות דבר ראשון, ואת מה שמארגני הכנס טענו שמותר, אבל שלא יעזור – עשינו reboot מ-CD שאנחנו סומכים עליו. באופן ספציפי – עלינו מהדיסק שחולק באוגוסט פינגווין של שנה שעברה.

בשלב הזה בדקנו שמתוך ה-CD הזה אנחנו יכולים לייצר קובץ תחת המסלול הנ”ל, שמכיל את המידע הנכון. חזרנו אל המערכת המקורית, וחיפשנו את הקובץ. הוא לא היה שם! בעודינו מגרדים בראשינו, הבנו שעשינו mount למערכת minix מעל הקובץ שעמלנו לשנות. עשינו unmount, והראנו לשופטים (המעט נבוכים) שהקובץ שונה בהצלחה. הזמן – בערך רבע שעה מתחילת השלב.

הערה חשובה
נתתי את ההערה הזו כבר למעלה, אבל חשוב לחזור עליה כאן. התיאור כפי שנכתב פה נכתב ע”י חבר בקבוצה שהפסידה.

לדעתי, בשלב הזה השופטים לקו מעט בשיקול דעתם. הם ייצרו פה מערכת מתוחכמת לשמירת הקובץ משינויים, ולא כל כך רצו לראות פתרון “low tech” לבעיה. הם הסבירו לנו שזה טכנית פותר את השלב, אבל דחקו בנו להמשיך לנסות למצוא את הפתרון ה”נכון”.

וכאן נכנסנו לתסבוכת. היה לנו ברור שיש פה קרנל שמישהו (קריא – מולי) שיחק איתו. רק כדי לוודא את הנקודה, החלפנו עוד פעם ל-CD, וניסינו את הפעולה עוד פעם, הפעם עם הספריות והתוכנות ששייכות למערכת האתגר. במילים אחרות – ניסינו את זה שוב, רק הפעם עם קרנל שאנחנו סומכים עליו, אבל כל השאר מהמערכת ה-hacked. באופן מאוד ברור, זהו הקרנל שגרם לבעיה.

בשלב הזה התחלנו לנסות כמה כיוונים במקביל. דבר ראשון, חיפשנו את השרשרת “Stage3” בתוך קוד המקור של הקרנל שהיה על המכונה (מתוך ההנחה, המוצדקת בדיעבד, שקוד המקור שם זהה לקרנל שמותקן על המכונה בפועל). החיפוש לא הניב כל תוצאה. ניסינו עוד סוגים של דרכים להביא את התוכן הנכון אל הקובץ. בסופו של דבר (כשלוש דקות אחרי שהקבוצה השניה פתרה את האתגר), ומבלי שאנחנו יודעים למה, זה עבר והקובץ שונה.

בדיעבד הסתבר שהקבוצה השניה עלו על הטריק (אמרתי שמגיע להם, או לא אמרתי?). הם חיפשו “august” בקובצי הקונפיגורציה של הקרנל. משם הם מצאו את הקובץ עם השינויים, ובו היה מתועד שהשינוי תקף רק בחודש אוגוסט. הם שינו את השעון על המכונה לחודש אחר, ועשו את השינוי. המארגנים טענו שגם זה לא הפתרון שהם התכוונו אליו, אבל אנחנו נצטרך לשאול אותם למה הם התכוונו.

Stage4


ההנחיות בשלב זה אמרו שיש קובץ במקום לא ידוע על הדיסק, עם שם דומה לשמות הקודמים, אבל מוחלף למשהו יותר 1337. הקובץ מוצפן, אבל המפתח לא נמצא על מערכת הקבצים. בקובץ יש הוראות להשלמת השלב.

את הקובץ מצאנו ע”י הפקודה locate, אותה הכנו בשלב הקודם. הקובץ היה /usr/share/doc/liboaf0/S74g3.tmp. הקובץ היה מוצפן ב-PGP, וgpg אמר לנו שהמפתח הינו מפתח ElGamal, ונתן את הזיהוי שלו.

בשלב הזה היינו מעט תקועים. אחת ההצעות שעלתה היתה ש”לא במערכת הקבצים” פירושו ב-Swap. חיפוש על כל ה-Swap לא העלה מפתח. הצעה נוספת שלא צלחה היתה ב-MBR. אפילו בזכרון ה-CMOS ניסינו. הרצנו חיפוש אחר הזיהוי של המפתח על כל הדיסק, כמו גם חיפוש אחרי PGP (חייב להופיע במפתח אם מישהו רוצה להאמין שנוכל למצוא אותו במסגרת התחרות). שום דבר.

בשלב הזה התחיל שלב ההצעות החוזרות. אנשים הציעו את שם הכנס, שם התחרות, כתובת כרטיס הרשת, ועוד הצעות שונות, ובעיקר משונות. מפתח ElGamal הינו מפתח ציבורי שחייב לקיים חוקים מתמטים מסויימים. לא כל רצף ביטים יכול להיות מפתח, ולכן לא סביר שאף אחד מהנ”ל יתאים. בשלב זה התייאשנו וביקשנו רמז. קיבלנו את התשובה שהרמז יגיע רק אחרי שעה. בשלב זה שלפתי חפיסת קלפים כדי לעשות קצת קסמים (שלא עשיתי), וגם תרמתי את כרטיס הגלידה שלי למישהי שלא קיבלה אחד בכניסה, וקניתי לעצמי שתיה. גלית ימיני מ”הארץ” שאלה אותי ביציאה אם פתרנו, ועניתי לה שאנחנו מחכים לרמז.

אחרי 45 דקות, וכשהסתבר שהקבוצה השניה תקועה באותה מידה, אחרי שחיפשה באותם המקומות, קיבלנו מיני-רמז – המפתח נמצא ברשת. התחלנו לסרוק את הרשת ולחפש עוד מחשבים. מצאנו רק את המחשב של נועם, שהשגיח על התחרות. אחרי טיפה נסיונות נועם התעורר, וביקש שבבקשה נעזוב את המחשב הפרטי שלו מהבית, ושהמפתח לא נמצא שם. ייאמר לזכותו שלא היתה הרבה פאניקה בקולו. עוד קצת חיפושים מצאו את המפתח המיוחל בשירות chargen, שרץ על המכונה שלנו. לאף אחד, כולל למארגנים, אין הסבר מדוע חיפוש על הדיסק לא מצא אותו. אבירם הסכים איתי שההגדרה של “לא במערכת הקבצים” היתה בעייתית.

פיענוח הקובץ נתן לנו סיסמה, ושלח אותנו להשתמש ב-back door על המחשב השני כדי למחוק אותו. בשלב זה עשיתי החלטה שאולי עלתה לנו בתחרות. במקום ישר ללכת למחשב השני, אמרתי “בו ננסה למצוא את הדלת האחורית על המחשב שלנו”. כמובן שישר גם החלפנו סיסמאות, וגם הורדנו את כרטיס הרשת. בשלב כלשהו באו המארגנים והורו לנו להעלות את כרטיס הרשת חזרה, למרות שזה לא היה אסור ע”פ תנאי התחרות המקוריים.

משום מה לא מצאנו ב-netstat אף אחד מאזין. הלכנו לסרוק את המחשב שלהם, אבל לא הספקנו למצוא את הפורט הפתוח שהתוכנה שהם דרשו שלא נהרוג השאירה. הקבוצה השניה הספיקה כן למצוא אותו, ולמחוק לנו את המחשב. הפסדנו בהפרש של דקות בודדות.

סיכום

א. היה כיף. לפני ואחרי הכל – זה מה שהכי חשוב.
ב. התחרות היתה מאוד מאוד צמודה. בסה”כ שתי הקבוצות ניסו לפתור את אותם האתגרים באותן הדרכים. אנחנו שלחנו מישהו למחשב שלהם בערך באותו הזמן שמישהו שלהם התיישב על המחשב שלנו.

אתגר הקרנל, לדעתי, לא תוכנן כראוי. זה לא שאני לא מעריך טיפול במכונה מתוך הקרנל. זה פשוט שיחסית לדברים שנתקלים בהם על מכונות אמיתיות שפרצו אליהם, מה שמולי עשה זה תרגיל לילדים בגן. טיפולי קרנל בעולם האמיתי מעלימים מהעולם ה-userland כל זכר לתהליכים, קבצים, מקום על הדיסק, פורטים מאזינים, ועוד. הם יכולים לפתוח back door על כתובת IP פיקטיבית, אשר מגובה בכתובת MAC פיקטיבית, תוך שהם מריצים מערך TCP פיקטיבי. לעומת הדברים האילו, מה שמולי עשה מחוויר לחלוטין. טעימות ניתן לקבל באתר http://www.rootkit.com. לאור הנ”ל, הדבר היחידי שניתן לעשות למכונה שידוע ששיחקו איתה הוא להפסיק להשתמש בשום תוכנה שבאה ממנה. כל פתרון אחר הינו עבודה בעיניים ונידון לכשלון.

הקבוצה השניה בחרה לנחש “august”, מילה שמולי לא הסתיר. אנחנו בחרנו לנחש “Stage3”, מילה שמולי בחר כן להסתיר. מטרת ההסתרה לא ברורה לי כל כך, מכיוון שאם הוא היה רוצה, הוא היה יכול לגרום לזה שלא נוכל למצוא את זה בכלל. יכול להיות שאני לא מבין משהו בהליכי התכנון, ויכול גם להיות שמישהו פה פשוט ניסה להיות חכם, ולאו דווקא הגיוני בהקשר של תחרות. בדיעבד היינו צריכים להגיד למארגנים שהפתרון הראשון שלנו הוא הפתרון, ולהמשיך הלאה.

למרות כל הביקורת, חשוב לי להדגיש – זאת הייתה תחרות כייפית, ואני רוצה להודות לאבירם, מולי, נועם ואחרים שארגנו אותה.

אני גם רוצה לברך את עמוס, עדי וצפריר, חברי הקבוצה המנצחת. עמדתם באותם האתגרים שאנחנו עמדנו בהם, ועמדתם בהם יותר בכבוד מאיתנו. הפעם ניצחתם, אבל עוד נפגש 🙂

שחר

מאת

שחר שמש

מייסד–שותף וחבר ועד בתנועה לזכויות דיגיטליות מייסד שותף בעמותת „המקור”. פעיל קוד פתוח. מפתח שפת התכנות Practical

13 תגובות בנושא “סיכום תחרות האקינג של אוגוסט פינגווין”

  1. נשמע כיף, ממש כיף.
    איך המארגנים לא יכלו להסביר את זה שהמפתח לא נמצא על הדיסק? הם לא יודעים מה הם עשו?

    בכל מקרה, בעזרת השם, בשנה הבאה אני אבוא =)

    1. אתה צוחק עלי? הוא מאוד מאוד מאוד שימושי. הוא תמיד איתי בארנק, והוא כבר הציל לי יותר ממערכת אחת.

      מצד שני, אתה יכול להסביר לי למה הכוונה ב"השתתפתי"?

      אתה מצאת את המדפיס.
      אתה החלטת על ההפצה.
      אתה שילמת על ההדפסה.
      אתה באת פעם שניה כדי לשלם את המע"מ.
      אתה אספת את הדיסקטים המוכנים.

      אני חושב שלאור כל הנ"ל, אתה יכול לקחת טיפה יותר קרדיט. מגיע לך.

      שחר

  2. כמו שחר, אני מעוניין לציין שהתחרות היתה כיפית. אני הייתי בקבוצה שבמקרה ניצחה. במקרה: כי התחרות היתה צמודה למדי וההפרש היה של כמה דקות לכל כיוון.

    אני מעוניין לפרט קצת יותר לגבי דרך פתרון שלב שלוש: במשך זמן לא מועט לא הבננו מה קורה. לאחר שהחלטנו לבדוק את כיוון הקרנל ראינו שאין לנו כבר יותר מדי זמן להרבה חיפושים על כל עץ הקרנל.

    היתה לנו הרגשה שאם משהו מונע מאיתנו התעסקות בקובץ מסויים, הרי שמדובר על security policy שונה. לצערינו אף אחד מאיתנו לא הכיר את selinux ושות’. אולם מעיון בקובץ ה־config ראינו ש: CONFIG_SECURITY=y ומשהו יותר מוזר: פרמטר בשם CONFIG_SECURITY_AUGUST כמה שורות מתחתיו שהיה מופעל גם־כן. ואמנם ב־security/‎ תחת המקור של הקרנל ראינו קובץ חשוד בשם august.c . ראינו שם שורה שמשמעה היא שאם התאריך הוא באוגוסט, אי־אפשר לבצע פעולות מסויימות.

    שמעתי את מולי (?) אומר לאחר מכן שנקבל ניקוד גבוה אבל לא את הניקוד המקסימלי, מכיוון שעשינו את זה בדרך שבה הם ציפו ולא מצאנו דרך יותר מקורית.

    1. צפריר, מה שאמרתי היה שפתרתם את זה בדיוק כמו שהתכוונו (אם כי היו עוד כמה פתרונות אפשריים – למשל לתקן את ה- minix ולעלות עם קרנל ונילה, או לקמפל את הקרנל שלנו מחדש). מבחינתי, זה 9 מתוך 10 – 10 מתוך 10 זה אם הייתם מוצאים דרך לעקוף את ה-patch או לנטרל אותו שלא חשבנו עליה, במגבלות מסויימות – למשל, לא אהבנו את שיטת ה- mount כי היא לא שינתה את הקובץ הרלוונטי אלא שמה אחר עם inode שונה.

      בכל מקרה, העיקר שכולם נהנו! לקחים יופקו לפעם הבאה, אם תהיה.

  3. שלום לכולם,

    תרשו לי להציג את עצמי. אני אחד ממתכנני התחרות. הסיבה שהמפתח
    לא נמצא ע"י חיפוש ב-filesystem הוא מהסיבה הפשוטה שהמפתח
    הוכנס ישירות לקוד המקור של inetd (המספק את שירות chargen)
    וישב בזיכרון כל אותו הזמן. כמו כן, קוד המקור של inetd לא היה
    זמין על המכונה כמו שאולי חלקכם חשבתם 🙂

    תיאורטית ניתן היה למצוא אותו ע"י חיפוש בתוך /proc/kmem אך
    מסתבר שזה בלבול מוח אחד גדול מכיוון שמלבד כמה תווים ידועים
    אין שום מחרוזת ידועה מתוך המפתח (ה-ID שלו כמובן לא מופיע
    במחרוזת המפתח).

    1. אם קוד המקור של inet כולל את המפתח, אז כך גם הבינארי של inet, לא?
      אם הבינארי של inet כולל את המפתח, אז יש סקטורים על הדיסק שכוללים את המפתח, לא? הבינארי של inet דווקא כן היה על המכונה.
      אם זה המצב, אז חיפוש על כל הדיסק של המחרוזת PGP אמור היה להניב את המפתח.

      לא קניתי את ההסבר.

      שחר

  4. התרשמתי עמוקות.
    אח שלי בוהה בי בעצב מלווה באכזבה כשהבין שקריאות ההתרגשות באות מכיוון הסברים על תחרות פריצה.

    כשנתתי את הפאנץ’ ליין: "…והם מחקו להם את המחשב!", הוא אפילו לא הניד עפעף…

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

Bear