המוסד, כמו ארגוני ביון אחרים בעולם מפרסם אחת לתקופה אתגר במטרה לגייס לשורתיו אנשי טכנולוגיה, וכמו רוב אנשי המחקר שאנחנו מכירים, החלטנו לצלול פנימה, רק הפעם בשונה מפעמים קודמות החלטנו לפרסם גם מאמר עם הפתרונות.
את האתגר הזה פתרנו אנוכי רומן זאיקין ודיקלה ברדה חוקרת בצק פוינט.
באופן אישי מכל האתגרים של המוסד שפתרנו זה היה המעניין ביותר עד כה.
במהלך המאמר אנחנו נתאר את הפתרונות ואת הדרך להגעת הפתרון, באתגרים מהסוג הזה צריך הרבה חשיבה מחוץ לקופסא וניסיון בפתירת אתגרים אחרים לא מזיק כמובן 🙂
מקווים שתהנו לקרוא כמו שאנחנו נהנו לפתור…
האתגר מתחיל בdomain הבא:
www.r-u-ready.xyz
בdomain אנו רואים את התמונה הבאה:
כדי להוציא את הטקסט מהתמונה השתמשתי בכלי שנקרא OCR, OCR זה ראשי התיבות של Optical Character Recognition ובעת מחקר משתמשים בשיטה זו כדי לעקוף מנגנוני captcha חלשים.
על מנת להשתמש בOCR נעתיק את החלקים של התמונה באמצעות snipping tool ונשמור אותם בקבצים נפרדים כך:
כעת נעלה את הקבצים לאחד מאתרי הocr, כאשר מבצעים מעקפים לcaptcha אפשר גם להשתמש במודול הpython שנקרא pytesser.
https://www.onlineocr.net/
התוצאה תראה כך:
ניתן לראות שחסרים כמה תווים והפלט אינו מושלם, אך יחד עם זאת עדיף על העתקת כל התווים בעצמנו.
כעת נסדר את התוצאה בהתאם לתמונה, החלק הראשון:
נעשה את אותו הדבר לחלק השני:
התווים האלו הם בעצם שפת התכנות שנקראת brainfuck זו שפת תכנות פשוטה למדי, שבדרך כלל משתמשים באתגרים.
כדי להריץ את הקוד אפשר להשתמש באתר הבא:
http://www.bf.doleczek.pl/
לאחר הרצת הקוד עם החלק השני נקבל את התוצאה xor-with-key:
אם נסתכל על החלק הראשון נוכל לראות שיש נקודה שחוזרת מספר פעמים בקוד שלא מופיעה בחלק השני של הקוד , בשפת brainfuck אם מופיעה נקודה זה מעיד על הדפסה של המקום הנוכחי בזיכרון, כשניסינו להריץ את הקוד לא ראינו כלום, לכן לחצנו על כפתור ה Advanced באתר על מנת לקבל את מיקום תאי הזיכרון בקוד ולהלן התוצאה:
אם ניקח את הרמז שקיבלנו בחלק השני של הקוד לעשות xor עם מפתח כלשהו, ואת העובדה שאת פעולת xor מבצעים על 2 ערכים נסיק שחסר לנו ערך כלשהו שכנראה נמצא בתמונה.
כך שהסקנו שהערך הראשון בפעולת ה XOR הוא תאי הזיכרון:
7A 46 5C 53 55 59 03 5A 41 03 06 01 00
הסתכלנו שוב על התמונה ושמנו לב שיש טקסט נוסף שחוזר על עצמו הרבה פעמים לכן הסקנו שהערך השני שחסר לנו הוא הטקסט שמופיע בתמונה:
Israel-is-70
מכיוון שהערך הראשון הוא ערך אקסדצימלי עלינו להמיר את הטקסט לאקסדצימלי גם כן, ניתן לעשות זאת באמצעות python :
"Israel-is-70".encode("hex")
נקבל:
49737261656c2d69732d3730
כעת נבצע xor כפי שכותבי האתגר ביקשו:
hex(0x49737261656c2d69732d3730 ^ 0x7A465C535559035A41030601)
ונקבל את התוצאה:
33352e3230352e33322e3131
נמיר את התוצאה חזרה לascii כך:
"33352e3230352e33322e3131".decode("hex")
ונקבל:
35.205.32.11
אם ניגש לכתובת ה-IP נקבל את האתגר הבא:
part 1
האתגר מתחיל בתוך אתר קטן ופשוט שמכיל בסה”כ 2 פעולות:
- הרשמה
- התחברות
נבחן את קוד המקור של האתר, ונראה שבתחתית הקובץ יש לנו לינק לדף הנקרא administration:
אם נפתח את הדף נראה שקיבלנו status code 401 מה שמסמן שהדף קיים אבל אין לנו גישה אליו, כך שהמטרה ברורה!
עלינו להגיע לדף הזה בדרך כלשהי, לאחר שנבחן את האתר לעומק נראה שמלבד הרשמה אין לנו יותר מידי אפשרויות.
בעת תהליך ההרשמה ניתן לראות שהאופציה האחרונה היא מאוד חשודה, אתרים לא מבקשים בדרך כלל להכניס תמונת פרופיל כקישור מאתר מרוחק.
כבר בחלק הזה הסקנו שפתרון האתגר כנראה יהיה קשור איכשהו לurl הזה, נבחר תמונה כלשהי מגוגל ונלחץ על הכפתור TRY:
https://upload.wikimedia.org/wikipedia/he/1/19/Google_Maps_Icon.png
בעת ביצוע הפעולה ניתן לראות בburpsuit שמסיבה כלשהי הלינק קודד עם base64
בגלל שהbase64 הנוכחי מסתיים בPadding בסופו ניתן לראות את הטקסט %3D%3D שזה בעצם Url encoding שהדפדפן ביצע. עלינו קודם כל לפתוח את הurl encoding ורק אז לפתוח את הbase64 כדי לעשות זאת בקלות
סמנו את הטקסט ולחצו על ctrl+shift+u שזה בעצם מבצע url decode התוצאה תראה כך:
aHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvaGUvMS8xOS9Hb29nbGVfTWFwc19JY29uLnBuZw==
כעת סמנו את הטקסט בשנית ולחצו על ctrl+shift+b שזה מבצע base64 decode והתוצאה תראה כך:
כעיקרון בעת פיתוח אתר אינטרנט אין שום סיבה לבצע קידוד base64 לurl כך שמשהו מאוד חשוד בפניה הזאת, כדי להמשיך לחקור אותה לחצו על ctrl+r כדי להעביר אותה ל-repeater.
אם נחזור למערכת נראה שהתמונה נטענה והיא נמצאת בנתיב /profilePics/[code].
ניסיון פנייה לכתובת הזאת באופן ישיר יציג לכם Nothing there:
וזה מכיוון שיש להחליף גם את תוכן העוגייה מהתשובה של העלאת הקובץ, אם תשימו לב בעת העלאת הקובץ קיבלת מהשרת set-cookie בדרך כלל שמקבלים set-cookie הוא לא נמצא שם סתם ויש צורך להשתמש בו.
עד כאן למדנו לשלוח תמונה בפורמט base64 ולגשת אליה, השלב הבא הוא לבצע ניסיון פניה מקומי לקבצים בצד השרת באמצעות הפנייה ל file כך:
file:///var/www/register.php
לפני שנשלח אותו לשרת נמיר את המידע לbase64 באמצעות ctrl+b ונשלח אותו:
צד השרת מחזיר לנו שלא ניתן לפנות לכתובת כי הסיומת אינה .png ננסה לעקוף זאת באמצעות Null byte כך:
file:///var/www/register.php%00.png
ובינגו, השרת טען את הקובץ:
כעת נפנה לקובץ על ידי פנייה לקובץ register.php ועדכון העוגייה:
נראה שהצלחנו לגשת לקובץ, אבל לא נראה שיש משהו מעניין בקובץ הזה, לכן ניסנו לפנות לקובץ login.php והתוצאה הייתה:
ניתן לראות שבקובץ הlogin.php יש בדיקה האם פונים למשתמש admin והאם מגיעים מכתובת האייפי 127.0.0.1.
יש לקחת בחשבון שאת הפנייה מבצע השרת כך שאין שום מניעה לגרום לו לבצע את הפנייה לכתובת:
http://127.0.0.1/
ובשביל לשלוח את המשתמש admin ניתן לראות לפי הקוד שחשפנו שבצד שרת מצרפים לפרמטר user_name, על סמך המידע שקיבלנו מהקובץ נבצע את הפנייה הבאה:
http://127.0.0.1/login.php?user_name=admin%00.png
ונקבל את העוגייה chState כמו קודם, כעת נשתמש בעוגייה כדי לבצע פנייה לadministrations שלא הצלחנו לפנות אליו קודם לכן ונקבל:
http://127.0.0.1/administration%00.png
אם נפתח את הדף כמו קודם נקבל:
אם נפתח את הדף בדפדפן ונלחץ על הלינק נעבור לאתגר הבא:
ההמשך בחלק השני לחלק השני של הפתרון