באתר רמי לוי תקשורת התגלתה חולשה שחושפת את היסטורית השיחות של כל משתמש

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

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

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

חיבור בעייתי לאתר רמי לוי
חיבור בעייתי לאתר רמי לוי

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

הסבר טכני על מהות החולשות

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

אתר רמי לוי תקשורת - צילום מסך
אתר רמי לוי תקשורת – צילום מסך

חולשה ראשונה: חוסר הגנה על ממשק קבלת החשבוניות

בקישור https://mobile.rami-levy.co.il/My/invoices ניתן לקבל את מספרי החשבוניות של כל משתמש באמצעות בקשת GET פשוטה והעברת הפרמטרים phone שהוא מספר הטלפון של הלקוח ו-match. אך ה-match אינו נבדק כלל. כל מה שצריך להעביר זה את מספר הטלפון באופן הזה:

https://mobile.rami-levy.co.il/My/invoices?phone=PHONE_NUMBER&match=1111

ולקבל את כל מספרי החשבוניות של הלקוח עם מספר הלקוח. ה-match אינו נבדק כלל.

מספרי החשבוניות ומספר הלקוח חיוניות בהתקפה הסופית (חולשה שלישית) המאפשרת לנו לקבל את כל פירוט השיחות.

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

חולשה שניה: חוסר הגנה על ממשק הכניסה לאתר

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

 https://mobile.rami-levy.co.il/Client/validateacc

עם הפרמטרים phone, match ו-idnum.

בפועל, לא נעשית בדיקה של מספר תעודת הזהות (idnum) והמידע הנבדק הוא מספר הטלפון ו-4 הספרות האחרונות של כרטיס האשראי. בממשק אין שום הגנת brute force והוא נותן חיווי מיידי על הצלחה, כלומר אפשר בקלות לשגר כמה בקשות שרוצים על מנת לנסות ולנחש את מספר כרטיס האשראי המשויך למספר הטלפון. כיוון שמדובר ב-4 ספרות נומריות, מספר הניסיונות המקסימלי שצריך הוא 10 בחזקת 4 או 10,000. אפשר לעשות את זה בקצב מהיר ואפשר לעשות את זה בקצב איטי. אבל מה שצריך זה סקריפט פשוט. עם ממוצע של 5,000 ניסיונות, זה אומר שאפילו בקצב נמוך, אפשר למצוא את 4 הספרות האחרונות של כרטיס האשראי בקלות וכך לבצע לוגין כמו כל משתמש ולקבל את כל המידע השמור במנגנון האתר: מספר תעודת זהות, כתובת פיזית, כתובת מייל ומספרי חשבוניות ומספר לקוח. דבר שאנחנו גם כן יכולים להשתמש בו בחולשה השלישית והקריטית יותר.

חולשה שלישית: חוסר הגנה על ממשק קבלת פירוט השיחות

על מנת לקבל גישה לפירוט השיחות, ישנה שכבת הגנה נוספת. הלקוח צריך לשלוח באמצעות האתר בקשה לקבלת שיחות ולאחר שליחת הבקשה, נשלח סמס לטלפון של הלקוח עם קוד סודי שאותו הוא נדרש להזין בממשק. בפועל, על מנת לצפות בפירוט השיחות, נשלחת בקשת GET אל:
https://mobile.rami-levy.co.il/My/invoice
עם הפרמטרים הבאים:
type = calls
phone = מספר הטלפון
invoice = מספר החשבונית (שמשיגים מחולשה א׳ או ב׳)
code = מספר הלקוח (שמשיגים מחולשה א׳ או ב׳)
vcode = קוד סודי בן 4 ספרות שמקבלים אך ורק בסמס.

דוגמה לבקשת ה-GET

https://mobile.rami-levy.co.il/My/invoice?type=calls&phone=PHONE_NUMBER&invoice=INVOICE_NUMBER&code=COSTUMER_NUMBER&vcode=XXXX

קוד הסמס נשלח ללקוח באמצעות בקשת POST אל הכתובת https://mobile.rami-levy.co.il/My/invoice_sms עם הפרמטר phone. ברגע שנשלחת בקשת POST מסוג זה, נשלח סמס פשוט ללקוח עם הקוד. ללא הסבר או התרעה.

סמס עם קוד סודי שהתקבל מרמי לוי
סמס עם קוד סודי שהתקבל מרמי לוי

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

כלומר, משהו בסגנון הזה:


const bf = require('bruteforce');
const colors = require('colors'); // eslint-disable-line

bf({
    len: 4,
    chars: [1, 2, 4, 5, 6, 7, 8, 9, 0],
    step: (number) => {
        console.error(`GENERATING GET PARAMETER NUMBER ${number}`.red);
        console.log(`Trying to break: https://mobile.rami-levy.co.il/My/invoice?type=calls&phone=MY_PHONE&invoice=INVOICE_NUMBER&code=CUSTOMER_NUMBER&vcode=${number}`.blue);
    },
});

רק שבמקום console.log, אני מבצע request, המודול שמייצר את המספרים הוא bruteforce JS. במידה ואני מקבל 200, בינגו. יש לי את המספר של הפרמטר vcode ואיתו אני יכול לגשת לכל מספרי החשבוניות ולקבל את כל פירוטי השיחות. זה הכל.

הגנה מפני פרצות brute force

ישנן כמה פרקטיקות מאוד פשוטות שקל ליישם בכל הנוגע להגנה מפני brute force. המוכרת שבהן היא re-captcha.

מתוך גוגל.קום

אך ניתן ליישם הגנות אחרות. באתר זה, למשל, 20 ניסיונות שיובילו ל-404 או 403 יובילו לחסימה מוחלטת של כל הבקשות מה-IP למשך 20 דקות.

התגובה של רמי לוי תקשורת

בניגוד למצופה, אנשי המקצוע מטעם רמי לוי ששוחחו איתי התקשו להבין את מהות הפירצה. למרות שאישרו בשיחה הטלפונית את כל הפרטים. המחשבה שיש מי שיכול להפעיל סקריפט פריצה שיכול להריץ התקפה של brute force כדי לנחש 4 ספרות נומריות נראתה להם כלא ריאליסטית. הם טענו שהאתר יקרוס אם יפעילו כזו כמות של בקשות. הניסיונות שלי להסביר להם שאפילו ב-80 בקשות לשעה (מספר נמוך לכל הדעות) ניתן לפצח את קוד הסמס ב-62 שעות בלבד בממוצע, לא הואילו. לאחר דין ודברים הם טענו שהם יתקנו את החולשות שאותן הן כינו ׳הצעות יעול׳. כרגע החולשות האלו אמורות להיות מתוקנות.

פוסטים נוספים שכדאי לקרוא

DALL·E 2024-09-06 12.34.24 - A visually engaging post about Python and cryptographic problems. The image should feature a dark-themed background with a glowing, futuristic Python
פתרונות ומאמרים על פיתוח אינטרנט

בעיות במימוש של פונקציות קריפטוגרפיות בפייתון

היום (16 לספטמבר) ממש, אני מעביר הרצאה ב-PyconIL 2024 על בעיות קריפטוגרפיות באפליקציות פייתון. לצערי אי אפשר להכניס את כל הבעיות הקריפטוגרפיות להרצאה אחת או

תמונה של הבית הלבן עם מחשוב ענן וטקסט: FEDRAMP
פתרונות ומאמרים על פיתוח אינטרנט

FedRAMP & FIPS מבוא למתחילים

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

צילום מסך של סוואגר
יסודות בתכנות

openAPI

שימוש בתשתית הפופולרית למיפוי ותיעוד של API וגם הסבר בסיסי על מה זה API

מיקרו בקרים

חיבור מצלמה למיקרובקר

חיבור מצלמה למיקרו בקר ויצירה של מצלמת אבטחה מרחוק בעלות של 20 שקל.

גלילה לראש העמוד