ברוכים הבאים לאזור הבלוגים הטכנולוגיים של ITsafe

קריאה מהנה

Mossad 2018 Solutions Part 1

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

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

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

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

מקווים שתהנו לקרוא כמו שאנחנו נהנו לפתור...
האתגר מתחיל בdomain הבא:
www.r-u-ready.xyz
בdomain אנו רואים את התמונה הבאה:
סמל המוסד
כדי להוציא את הטקסט מהתמונה השתמשתי בכלי שנקרא OCR, OCR זה ראשי התיבות של Optical Character Recognition ובעת מחקר משתמשים בשיטה זו כדי לעקוף מנגנוני captcha חלשים.

על מנת להשתמש בOCR נעתיק את החלקים של התמונה באמצעות snipping tool ונשמור אותם בקבצים נפרדים כך:
צופן brainfuck ראשון
כעת נעלה את הקבצים לאחד מאתרי הocr, כאשר מבצעים מעקפים לcaptcha אפשר גם להשתמש במודול הpython שנקרא pytesser.
https://www.onlineocr.net/
התוצאה תראה כך:
שימוש ב-OCR לצורך הוצאת הטקסט מהתמונה
ניתן לראות שחסרים כמה תווים והפלט אינו מושלם, אך יחד עם זאת עדיף על העתקת כל התווים בעצמנו.

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

כדי להריץ את הקוד אפשר להשתמש באתר הבא:
http://www.bf.doleczek.pl/
לאחר הרצת הקוד עם החלק השני נקבל את התוצאה xor-with-key:
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 פעולות:

  • הרשמה
  • התחברות

אתר חדשות בשם Dark New
נבחן את קוד המקור של האתר, ונראה שבתחתית הקובץ יש לנו לינק לדף הנקרא administration:
קוד html שמסגיר את דף הניהול
אם נפתח את הדף נראה שקיבלנו status code 401 מה שמסמן שהדף קיים אבל אין לנו גישה אליו, כך שהמטרה ברורה!

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

כבר בחלק הזה הסקנו שפתרון האתגר כנראה יהיה קשור איכשהו לurl הזה, נבחר תמונה כלשהי מגוגל ונלחץ על הכפתור TRY:
https://upload.wikimedia.org/wikipedia/he/1/19/Google_Maps_Icon.png
בעת ביצוע הפעולה ניתן לראות בburpsuit שמסיבה כלשהי הלינק קודד עם base64
בקשה שמכילה את ה-base64
בגלל שהbase64 הנוכחי מסתיים בPadding בסופו ניתן לראות את הטקסט %3D%3D שזה בעצם Url encoding שהדפדפן ביצע. עלינו קודם כל לפתוח את הurl encoding ורק אז לפתוח את הbase64 כדי לעשות זאת בקלות

סמנו את הטקסט ולחצו על ctrl+shift+u שזה בעצם מבצע url decode התוצאה תראה כך:
aHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvaGUvMS8xOS9Hb29nbGVfTWFwc19JY29uLnBuZw==
כעת סמנו את הטקסט בשנית ולחצו על ctrl+shift+b שזה מבצע base64 decode והתוצאה תראה כך:
נתיב לתמונת הפרופיל ב-url שהופיע ב-base64
כעיקרון בעת פיתוח אתר אינטרנט אין שום סיבה לבצע קידוד base64 לurl כך שמשהו מאוד חשוד בפניה הזאת, כדי להמשיך לחקור אותה לחצו על ctrl+r כדי להעביר אותה ל-repeater.
חבילת המידע ב-repeater
אם נחזור למערכת נראה שהתמונה נטענה והיא נמצאת בנתיב /profilePics/[code].
הנתיב לתמונה
ניסיון פנייה לכתובת הזאת באופן ישיר יציג לכם Nothing there:
תשובה מהשרת עם הכיתוב nothing there
וזה מכיוון שיש להחליף גם את תוכן העוגייה מהתשובה של העלאת הקובץ, אם תשימו לב בעת העלאת הקובץ קיבלת מהשרת set-cookie בדרך כלל שמקבלים set-cookie הוא לא נמצא שם סתם ויש צורך להשתמש בו.
פנייה עם העוגייה מציגה את התמונה
עד כאן למדנו לשלוח תמונה בפורמט base64 ולגשת אליה, השלב הבא הוא לבצע ניסיון פניה מקומי לקבצים בצד השרת באמצעות הפנייה ל file כך:
file:///var/www/register.php
לפני שנשלח אותו לשרת נמיר את המידע לbase64 באמצעות ctrl+b ונשלח אותו:
ניסיון ניצול SSRF
צד השרת מחזיר לנו שלא ניתן לפנות לכתובת כי הסיומת אינה .png ננסה לעקוף זאת באמצעות Null byte כך:
file:///var/www/register.php%00.png
ובינגו, השרת טען את הקובץ:
שימוש בnull byte עזר להגיע לקובץ
כעת נפנה לקובץ על ידי פנייה לקובץ register.php ועדכון העוגייה:
תוכן הקובץ register.php
נראה שהצלחנו לגשת לקובץ, אבל לא נראה שיש משהו מעניין בקובץ הזה, לכן ניסנו לפנות לקובץ login.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
פניית SSRF לקובץ administration פנימי
אם נפתח את הדף כמו קודם נקבל:
תוכן קובץ administration מכיל נתיב לפתרון
אם נפתח את הדף בדפדפן ונלחץ על הלינק נעבור לאתגר הבא:
הודעה על פתרון השלב ההמשך בחלק השני לחלק השני של הפתרון

Share this post