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

ספוילר: שני מיליון בני אדם זה די הרבה לא חושבים ?

התחברות ללא שם משתמש וסיסמה:

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

POST https://ebag.cet.ac.il/api/users/createSession HTTP/1.1

{"userID": "9f4f5c31-103d-4d3b-9789-XXXXXXXXXXXX"}

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

מסתבר ששנה לאחר ה”תיקון”, הבעיה לא באמת תוקנה אלא רק הדרך בה הלקוח מתחבר שונתה, מה שהשאיר את ה endpoint פעיל אך לא חשוף.

גישה לפרטי התלמידים והמורים (מעל כשני מיליון בני אדם):

מכיוון שכרגע ידוע לנו על דרך להתחבר רק בעזרת מזהה המשתמש נוכל לנקוט בשתי שיטות:

  1. לבצע bruteforce שבו ננסה מזהי משתמש רנדומליים (לא יעיל במיוחד מכיוון שמדובר פה על uuid)
  2. לחפש באתר אזכורים למזהי משתמשים בנקודות ב api השונה

רגע, אז מה אנחנו באמת מחפשים ?

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

{
    "value":
    {
        "user":
        {
            "userRole": "student",
        }
    }
    ...
}

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

אז איפה להתחיל לחפש ?

המחשבה הראשונה שעלתה לי בראש היא חיפוש תחת משימות ההגשה שלי

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

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

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

לאחר רפרוף בדפי האתר נוכל להבחין בבקשה היוצאת מן האתר בכתובת

https://productplayer.cet.ac.il/ScienceCell/
GET https://documentservice.cet.ac.il/api/documentRevisions/65adca33-b018-4519-b4b6-6c88d68aee0b/he/1/6 HTTP/1.1

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

{
    "createdBy": "0d9da50b-4b37-4c64-XXXX-XXXXXXXXXXXX"
}

נבצע את התהליך המאפשר להתחבר ללא סיסמה ושם משתמש ונקבל

{
    "value":
    {
        "user":
        {
            "token": "a94cd910-3456-475a-XXXX-XXXXXXXXXXXX",
            "userRole": "admin",
        }
    }
    ...
}

מעולה ! מצאנו משתמש בעל תפקיד admin, עכשיו רק נשאר להחליף את תוכן העוגיה בtoken אשר קיבלנו מגוף הבקשה ולנסות להבין באילו פיצ’רים אנו יכולים להשתמש

לאחר הכניסה למשתמש נוכל להבחין באופצית ניהול המשתמשים

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

ניתן לצפות בנתוני המורים:

  • שם מלא
  • תעודת זהות
  • תפקיד

ניתן להוריד את נתוני בית הספר כקובץ אקסל (או להשתמש בממשק הוובי) המכיל את רישום התלמידים ובו:

  • תעודת זהות
  • שם מלא
  • מין
  • שם בית הספר (המוביל אל עיר המגורים)
  • שכבת הלימוד ומספר הכיתה
  • מייל
  • שם משתמש
  • סיסמה (האש)

בתי ספר במערכת: 4841
תלמידים: 1,867,527
מורים: 264,352
מספר אנשים כולל: 2,131,879

קיימת אפשרות מועילה המאפשרת לקשר את נתוני האתר למנב”ס (מערכת אינטרנטית לניהול בתי ספר בשימוש רב במשרד החינוך) אשר דואגת לסינכרון תמידי של הפרטים

קובץ האקסל המסויים שהורדתי מן האתר מכיל נתונים על כל תלמידי בית הספר שלי

ניתנת לנו האפשרות להתחבר לכל משתמשי האתר:

גישה ל cms של האתר:

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

שינוי סיסמה למשתמשים שונים וצפייה בפרטיהם:

  • הבעיה ניתנת לניצול ללא תלות במשתמש האדמין (כל משתמש אשר מחובר למערכת יכול לבצע תהליך זה)

במהלך החיפוש באתר הגעתי לכתובת הבאה:

https://accounts.cet.ac.il/ChangeUserPassword.aspx

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

  • שם מלא
  • תעודת זהות
  • חשבונות מייל משוייכים

ניצול בעיה זו יכול להתממש בשתי דרכים:

  1. כניסה למשתמשים ששמות המשתמש שלהם ידועים
  2. ביצוע אנומרצית משתמשים (פשוט bruteforce עד שנגיע ל מזהה משתמש קיים)