השתלטות על חשבונות TikTok - חברת ITSAFE הכשרות סייבר ואבטחת מידע
עם יותר מ-150 שווקים, 75 שפות ומעל למיליארד משתמשים, האפליקציה TikTok הפכה לפופולרית ביותר בעולם! כמו כן, היא האפליקציה המובילה בהורדות בחנויות האפליקציה השונות.
לרוב המשתמשים של האפליקציה הינם בני נוער וילדים אשר משתמשים בה לשיעורים קצרים של 15-60 שניות. באפליקציה ניתן לשתף שיעורים עם כלל משתמשיה או להקליט שיעורים פרטיים שלאיש לא תהיה גישה אליהם.
עקב הפופולריות הרבה של האפליקציה וכמות המשתמשים העצומה, היא מושכת אליה האקרים רבים מכל העולם שמשקיעים משאבים רבים על מנת להגיע למידע האישי של המשתמשים או שינסו לאתר ליקויי אבטחה שיעזרו להם להשפיע על חשבונות המשתמשים.
זו הסיבה שאנחנו החלטנו לבצע מחקר לאפליקציה המפורסמת ולנסות לבחון את ההגנות שלה.
כך בעצם מצאנו שניתן לשלוח לינק זדוני למשתמש דרך האתר של TikTok ואם המשתמש ילחץ על הלינק התוקף יכול:
- לקבל את כל המידע האישי של המשתמש שאיתו הוא נרשם ל-TikTok הן אם בחר לחשוף את המידע והן אם לא.
- למחוק למשתמש את השיעורים מהחשבון.
- להוסיף למשתמש סרטון לחשבון האישי שלו.
- לשנות את הגדרות השיעורים הפרטיים לפומביים ובכך לחשוף את כל המידע האישי של המשתמש.
לאחר הדיווח ל-TikTok הם הגיבו באחריות, אשרו את כל הממצאים ותיקנו את ליקויי האבטחה!
סרטון המדגים את הממצא:
Technical
שליחת לינק זדוני דרך האתר של TikTok. באתר www.tiktok.com איתרנו פונקציונאליות שמאפשרת למשתמש להכניס את מספר הטלפון שלנו על מנת לקבל לינק להורדת האפליקציה.
כך שתוקף יכול להשתמש בכלי burp suite (כלי שאנחנו מלמדים בקורס הסייבר שלנו), לתפוס את ההודעה הנשלחת ולערוך את הפרמטרים בצורה הבאה:
הפרמטר Mobile מכיל את מספר הטלפון אליו יישלח הסמס ואילו הפרמטר download_url מכיל את הלינק שיישלח בסמס. אם נערוך את הפרמטרים נוכל לשלוח לינק ישיר מתוך tiktok למי שאנחנו רוצים ועם איזה לינק שאנחנו רוצים, לדוגמה attacker.com:
לאחר שהתוקף יילחץ על הלינק הוא יגיע לאתר attacker.com, מכיוון שרוב משתמשי TikTok כלל לא משתמשים באתר TikTok.com אלא באפליקציה ניסינו לחפש דרך לגרום ללינק לפתוח את האפליקציה ולהעביר את ההתקפה משם.
מעבר הלינק לתוך האפליקציה והמשך ההתקפה
מכאן המטרה ברורה, עלינו למצוא דרך לגרום לאפליקציה לפתוח את הלינק ששלחנו בסמס עם המזהים של המשתמש של האפליקציה. פתחנו את האפליקציה ב-jadx (תוכנה שאנחנו מלמדים בקורס האנדרואיד האקינג).
והתחלנו לעבור על הקוד, ניתן לראות שישנו Intent שמאזין על musically והוא מגדיר custom schema לאפליקציה, יש לציין שהלינק ייפתח באמצעות ה-domain https://m.tiktok.com/h5/share/webview.
ניתן לראות זאת פה:
כך שאם נוסיף ללינק שלנו שאנו שולחים את התחילית musically: נגרום לאפליקציה לפתוח את הלינק שלנו, אבל איזה לינק נפתח? ואיך נגרום לאפליקציה לבצע פעולה כלשהי עם זהות המשתמש?
כדי לבצע זאת עלינו לוודא שהמשתמש מחובר ואז לבצע את הפעולה דרך האפליקציה, לכן נצטרך למצוא open redirect שיעזור לנו לבצע את הפעולה לאחר ה-login.
איתור open redirect
הסתכלנו ב-domain https://login.tiktok.com וראינו שישנו פרמטר ב-url שקובע לאן המשתמש יעבור לאחר ההתחברות:
https://login.tiktok.com/?redirect_url=https://www.tiktok.com
הבעיה שישנה בקרה לפרמטר ולא ניתן לכתוב שם domain אחר כגון attacker.com מכיוון שהאתר לא יעביר אותנו ל-domain הזה. פתחנו את הקוד והסתכלנו על ההגנה:
ניתן לראות שמדובר בהגנת צד לקוח פשוטה שבסך הכל בודקת האם ה-domain מסתיים ב-tiktok.com. לכן אם נוסיף למילה tiktok.com תחילית כלשהי זה גם יתקבל לדוגמה: https://www.attacker-tiktok.com.
המתכנתים כנראה התכוונו שהלינק שיכנסו אליו יהיה שינוי של subdomain בלבד ולא שינוי של prefix ל-domain עצמו. מה שיראה כך:
רכשנו את ה-domain tlktiktok.com ובכך גרמנו לאתר לפנות אלינו.
כרגע אנחנו נמצאים בשלב הבא, אנחנו יכולים לשלוח לינק דרך האתר של tiktok.com בסמס למטרה. במידה והמטרה תלחץ על הלינק, הלינק ייפתח באפליקציה בתוך webview כי הוא מתחיל ב- musically. האתר שאנחנו פותחים הינו login.tiktok.com שמעביר אותנו לtlktiktok.com שהינו בשליטה שלנו.
את המעבר בצענו כדי לוודא שהמשתמש מחובר לחשבון שלו.
כעת עלינו לבצע פעולות בשם המשתמש ולשם כך נשתמש ב-CSRF.
ביצוע פעולות בשם המשתמש:
לאחר מחקר מעמיק על האתר זיהינו שההגנה מפני CSRF באתר אינה מגינה בצורה נכונה על המשתמש וניתן לשלוח פעולת API למשתמש והיא תתבצע.
בשביל לבצע פעולות בתור משתמשים אחרים עלינו להשיג מידע על המשתמשים וכל מיני מזהים שונים, לכן חיפשנו דרך לקבל מידע נוסף שיעזור לנו בהתקפה.
על מנת להוציא מידע רגיש אודות המשתמשים הסתכלנו על פעולות ה-API של האפליקציה, ראינו שישנם 2 כתובות מרכזיות:
שני ה-subdomain האלו מחזירים מידע רב, אך הבעיה היא שלא ניתן לתקשר איתם באופן ישיר עקב בעיית ה-CORS וה-SOP ואם נבצע פנייה נקבל שגיאת דפדפן:
זו השגיאה שנקבל:
כך שכעת עלינו לעקוף את ה-CORS איכשהו, אחת השיטות לעקוף CORS היא למצוא פעולה מכוונת באתר שמשתמשת ב-JSONP מכיוון שבהגדרת קורס פעולת embed הינה חוקית ולכן אם נאתר פעולת JSONP באתר נוכל לקבל את המידע מבלי לפגוע במנגנון
(על מנגנון זה ושיטות מעקף כמובן שאנו גם מסבירים בקורס)
עברנו על הקוד מקור של האפליקציה והסתכלנו האם יש זכר לפעולת JSOP באמצעות פרמטרים כגון callback או cb ואיתרנו שקיימות מספר פעולות API "מוסתרות" שניתן להוסיף להן את הפרמטר callback ולעקוף את ה-CORS עבור המידע שהן מחזירות לנו.
כך בעצם ביצוע פעולת ajax עם JSOP לכל ה-API שמאפשרים לנו קבלת מידע נותן לנו מידע אישי על המשתמשים ומידע רב שיעזור לנו בהמשך:
לאחר שיש לנו את כל המידע הנחוץ, נתחיל בפעולות על חשבון המשתמשים.
מחיקת השיעורים:
על מנת למחוק את השיעורים יש לנו את הבקשה הבאה:
https://api-t.tiktok.com/aweme/v1/aweme/delete/?aweme_id=video_id
בדוגמה אנו מוחקים את הסרטון 6755373615039991045 השייך למשתמש שאנו תוקפים, את כל המזהים ניתן לראות בקלות על ידי ליקוי האבטחה הנוסף שמצאנו אשר מאפשר לנו לקבל את כל המידע האישי של המשתמש או על ידי הפעלת הסרטון של המשתמש באפליקציה.
חבילת המידע תראה כך:
לאחר שליחת החבילה צד השרת יאשר את הפעולה בגלל שהעוגיות של המשתמש נשלחות עם כל בקשה לצד שרת וימחק את הסרטון למשתמש.
יצירת סרטון חדש:
על מנת שנוכל להחדיר סרטון לחשבון tiktok כלשהו עלינו להבין כיצד מנגנון העלאת השיעורים עובד באפליקציה, בשלב הראשון אנו מעלים את הסרטון ובשלב השני אנחנו מקשרים אותו לחשבון.
כך שאם נעלה את הסרטון לחשבון שלנו ונקבל את ה-id שלו באמצעות הפעולה הבאה:
נקבל את ה-id מהתשובה:
ונשתמש בו בפעולת ה-CSRF שלנו.
שינוי הרשאות סרטון מפרטי לפומבי
כדי לשנות סרטון פרטי לסרטון פומבי על התוקף לדעת תחילה מה ה-id של הסרטון. ישנם מספר הרשאות שיעורים שונות – שיעורים שרק חברים יכולים לצפות בהם, סרטון פרטיים ושיעורים פומביים.
על מנת לקבל id של סרטון שרק חברים יכולים לצפות בו מצאנו פעולת API שתגרום למטרה להוסיף אותנו לחברים שלו באמצעות הפעולה הבאה:
https://api-m.tiktok.com/aweme/v1/commit/follow/request/approve
וה-id של המשתמש שלנו מה שיראה כך:
לאחר מכן נקבל גישה לכל השיעורים שחברים יכולים לצפות בהם ונהפוך אותם לפומביים:
הפרמטר type מציין את רמת הפרטיות כאשר 1 זה public ואילו 2 זה private, כך לדוגמה נהפוך את הסרטון לפומבי:
לסיכום:
במאמר זה הדגמנו איך שרשור של מספר ליקויי אבטחה קטנים יכול להפוך את ההתקפה למוצלחת, כמובן
ש-TikTok אישרו את כל ליקויי האבטחה ותיקנו את הכל.
בהתקפה שהצגנו התוקף שולח סמס מהאתר של tiktok למטרה עם לינק שמכיל musically: אותו לינק גורם לאפליקציה לפתוח את הקישור בתוך webview ולהעביר את המטרה לדף הלוגין ששם הוא יזדהה או יועבר אוטומטית לדף שלנו שמופיע ב-redirect_url שעקפנו.
משם המטרה תגיע לאתר שלנו ואנו נקבל את כל המידע האישי של המשתמש בגלל ה-jsonp והמעקף של ה-CORS ואז נבצע את כל הפעולות שציינו בתור המשתמש באמצעות באג CSRF שמצאנו.