PracticU

עקיפה של זיהוי ROOT ב-UnCrackable3

בלי כתוביותעם כתוביות
PracticU › קורס סייבר והאקינג ל-Android - פריצה לטלפונים ואפליקציות אנדרואיד - בודק חוסן - Mobile App Pentesting › עקיפה של זיהוי ROOT ב-UnCrackable3
מילון מושגים:
root - משתמש העל במערכות Linux, בעל הרשאות מלאות לכל פעולה. גם הרמה העליונה בעץ של תיקיות או נתונים.
ספרייה - אוסף קוד מוכן, כמו פונקציות ומחלקות, שמפתחים משתמשים בו בתוכניותיהם במקום לכתוב הכול מחדש.
הוק - נקודת חיבור שמאפשרת להריץ קוד מותאם בשלב מסוים של תהליך. ב-React, מנגנון לניהול מצב ויכולות ברכיבים.
הצפנה - המרת מידע לצורה בלתי קריאה בעזרת מפתח, כך שרק מי שמחזיק במפתח המתאים יכול לפענח ולקרוא אותו.
חבילה - אוסף ארוז של קוד, ספריות או קבצים המופץ כיחידה אחת ומותקן בעזרת מנהל חבילות.
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.
שורת פקודה - ממשק טקסטואלי שבו מקלידים פקודות למערכת ההפעלה ומקבלים תגובה בטקסט, במקום להשתמש בעכבר.

עקיפה של זיהוי ROOT ב-UnCrackable3
בשיעור זה אנו מתמודדים עם רמה שלישית של אתגרי האבטחה, שבה האפליקציה בודקת אם הטלפון פרוץ או שקבצים שונו, ומפעילה הגנות הן ברמת הג'אווה והן בתוך הספרייה החיצונית. אנו מנתחים את הקוד, מגלים שבתוך הספרייה רצה פונקציה שסורקת את מיפויי הזיכרון בחיפוש אחר FRIDA, ובונים סקריפת הוק שמסתיר את מילת החיפוש מהסורק ובכך עוקף גם את ההגנה השנייה.
נושאי הסיכום המוצגים בשיעור:
1. הרמה השלישית באתגר: אנו מגיעים לרמה השלישית של אתגרי החברה שמפרסמת אתגרי אבטחה, ארגון אבטחה עולמי שמטפל בפרצות בעולם הווב וגם במובייל. מורידים את קובץ ה-APK, מתקינים אותו בטלפון ומנסים לפרוץ אותו.
2. זיהוי פריצה וטמפרינג: מיד בהפעלה האפליקציה מודיעה שזוהה טלפון פרוץ או שבוצע טמפרינג. טמפרינג משמעו שמישהו שינה קבצי ספריות או קבצי ג'אווה, למשל בעזרת פאצ'ים כמו שעשינו בהרצאות קודמות.
3. ניתוח הקוד מג'אווה ומטה: הניתוח מתחיל מהג'אווה ובמידת הצורך יורדים לספריות ה-Native, קבצי ה-סו שהם ספריות דינמיות שהג'אווה נעזרת בהן, ואותן אפשר לנתח גם בכלי הפענוח המוכר.
4. מציאת הפעילות הראשית: מקובץ המניפסט רואים שהפעילות שמופעלת אוטומטית היא הפעילות הראשית, ואליה מגיעים ישירות ורואים שם דברים חדשים שלא היו ברמות הקודמות.
5. הגנות חדשות בקוד: בפעילות הראשית מופיע מפתח הצפנה, משתנה בקרת שינויים שבודק שאף אחד לא שינה את הקובץ, הצגת דיאלוג עם יציאה מהמערכת, ופונקציית אימות ספריות שבודקת שקבצי הספריות אינם מפוצצים, ואם יש פאץ' היא מבצעת יציאה.
6. הפעלת הסביבה לעבודה: מתחברים לטלפון בעזרת ה-ADB, מפעילים את שרת ה-FRIDA בתוך הטלפון בעזרת אפליקציה ייעודית שמפעילה את השרת הקיים, מזהים את מזהה התוכנה בעזרת פקודת רשימת התהליכים ומתחברים לממשק הגרפי שפועל בפורט 5000.
7. Spawn עם עקיפת יציאה: בוחרים אנדרואיד, שם החבילה, יצירת תהליך חדש במקום התחברות לקיים, והפעלה מיידית של סקריפת עקיפת היציאה שמממש מחדש את פונקציית היציאה של המערכת כך שהיא רק מדפיסה מידע על המסך ולא יוצאת.
8. קריסה וגילוי ההגנה השנייה: למרות עקיפת היציאה FRIDA קורסת והסקריפטים נהרסים. מתברר שיש פונקציה בשם goodbye בתוך ספריית ה-סו שמפעילה הגנה נגד רוטינג, כלומר ההגנות קיימות גם ברמת הספרייה ולא רק ברמת הג'אווה.
9. פתיחת הספרייה בכלי הפענוח: מפורקים את קובץ ה-APK לתיקיית עבודה, מאתרים את קובץ הספרייה בתיקיית ה-lib ופותחים אותו בכלי הפענוח, שמנתח את הקובץ ומציג רשימת פונקציות, ובהן פונקציית ה-goodbye שמפריעה לנו.
10. מעקב אחר הקוראים לפונקציה: בעזרת צפייה בהפניות לפונקציה ומעבר בין החלונות המסונכרנים רואים שפונקציית ה-goodbye נקראת מפונקציה אחרת בספרייה, והמטרה הסופית שלנו היא למנוע את הרצת ה-goodbye.
11. הבנת לוגיקת הסריקה: בפענוח לשפת C רואים שהפונקציה פותחת את קובץ המיפויים שמציג מה טעון בזיכרון, קוראת ממנו בלולאה ומחפשת את מילת ה-FRIDA. אם היא מוצאת אותה היא יוצאת מהלולאה ומגיעה ל-goodbye, ואם לא היא ממשיכה להסתובב עם השהיה של חצי שנייה ובדיקה חוזרת.
12. תוכנית העקיפה: המסקנה היא שצריך שפונקציית ההשוואה שהסורק משתמש בה אף פעם לא תחזיר מילת FRIDA, ולכן נעקוף את פונקציית ההשוואה עצמה במקום להמציא את הגלגל מחדש.
13. שימוש בטמפלייט הוק Native: מהממשק הגרפי לוקחים את הטמפלייט המוכר להוק של פונקציית Native, מכניסים את שם הפונקציה, ואת שם הספרייה אפשר להשאיר ריק כדי שהכלי יחפש את הפונקציה בכל הספריות הטעונות.
14. בניית לוגיקת הזיהוי: בכניסה לפונקציה קוראים את שני הפרמטרים כמחרוזות מהזיכרון, בודקים עם פונקציית חיפוש אם המילה FRIDA נמצאת באחת מהן, ושומרים את התוצאה במשתנה שמחובר בעזרת המקור הזמין גם ביציאה מהפונקציה.
15. התערבות בערך המוחזר: ביציאה מהפונקציה, אם זוהתה מילת FRIDA בכניסה, מחליפים את הערך המוחזר לאפס כאילו לא נמצא דבר, ואם לא זוהתה מילה מחזירים את מה שנכנס בלי שינוי. כך מתערבים רק כשבאמת היה חשש לזיהוי.
16. הרצה ואישור העקיפה: שומרים את הסקריפט המלא, ומריצים אותו גם דרך הממשק הגרפי וגם דרך שורת הפקודה שנוחה יותר לניסויים. אחרי עקיפת היציאה האפליקציה נשארת פתוחה, ובכך התגברנו על שתי ההגנות, הראשונה ברמת הג'אווה והשנייה בתוך קובץ הסו.
בשיעור הבא נעסוק בנושא הסבר על Frida Interceptor Replace.
בסוף השיעור עקפנו את זיהוי ה-ROOT ברמה השלישית על ידי שילוב של עקיפת פונקציית היציאה בג'אווה והסתרת מילת ה-FRIDA מפונקציית הסריקה שבספרייה החיצונית.
SR12603HE

פרקי ההרצאה: עקיפה של זיהוי ROOT ב-UnCrackable3

  1. 00:00

    האתגר ברמה השלישית

  2. 00:56

    חזרה על שיטת הניתוח

  3. 02:08

    זיהוי בדיקת טמפרינג

  4. 03:21

    הכנת ה-Frida וה-RMS

  5. 04:36

    קריסה אחרי הפעלת הסקריפט

  6. 05:47

    הפונקציה הבעייתית בספרייה

  7. 07:04

    רשימת הפונקציות ב-IDA

  8. 08:31

    עקיבת קריאות ל-Goodbye

תמלול ההרצאה: עקיפה של זיהוי ROOT ב-UnCrackable3

הטקסט המלא של הדקות הראשונות בהרצאה «עקיפה של זיהוי ROOT ב-UnCrackable3» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:01

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

  2. 00:18

    בואו נוריד את ה-APK, את הקובץ, נתקין אותו בתוך טלפון וננסה לפרוץ אותו, לראות מה הסיסמה שצריך לגלות. אני בא וגורר את זה לטלפון, עושה ADB Install.

  3. 00:32

    הנה הוא מתקין לי אפליקציה מופעלת רוטינג או טמפרינג דטקטט הוא לא נותן לי להיכנס כי הוא רואה שהטלפון פרוץ רוטד או שמישהו עשה טמפר טמפר זה לשנות קבצי dll so או קבצי java מישהו שינה איזשהו קובץ אולי או שהקבצים שלו עם פייצ'ים כמו שעשינו בהרצאות קודמות או שהטלפון פרוץ טוב בוא נראה מתי זה קורה האירוע הזה של סיסטם אקזיט

  4. 01:01

    ניקח את ה-APK וננתח אותו פה. כמו שעשינו בפעמים הקודמות, אנחנו מתחילים מג'אווה, ואם צריך יורדים ל-Native, ל-DLLים, לרמת קבצי SO, שזה ספריות דינמיות שג'אווה נעזרת בהן.

  5. 01:17

    אנחנו יודעים לנתח אותן גם ב-AIDA. אז יש לנו גם ג'אווה וגם Native Libraries. אוקיי, אנחנו רואים פה הרבה חבילות, ואני מחפש את ה-Main Activity. יפה, הנה זה ה-Main Activity שלנו.

  6. 01:32

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

  7. 01:46

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

  8. 02:03

    ונראה שזאת הסיבה שהוא יוצא החוצה כי יש פה פקודת סיסטם אקזיט. ויש פה עוד פונקציה שנקראת VerifyLib שבודקת שהקבצים לא השתנו. אתם רואים שכל הקבצים של ליברריז הם בלי פאצ'ים.

  9. 02:20

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

  10. 02:32

    אז אני מתחיל בסיסטם אקזיט הזה, אחרי זה נחקור את האפליקציה עוד קצת. אז מה אנחנו עושים? אנחנו מפעילים את ה-RMS שלנו, עושים ADB קונקט, מתחברים לטלפון, בתוך הטלפון אנחנו מפעילים פרידה, יש לנו אפליקציה מיוחדת שיודעת להפעיל לנו פרידה סרבר, for start existing Frida Server,

  11. 02:55

    מפעילים שרת פרידה בתוך הטלפון, הנה הוא עובד. עכשיו אחרי שהוא עובד אנחנו כותבים פקודה frida.ps - uai, ורואים את המזהה של התוכנה שלנו וזה מספיק לנו בשביל להתחיל להתחבר אליה דרך ממשק גרפי RMS. הממשק גרפי של פרידה פועל בפורט 5000.

  12. 03:18

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

  13. 03:35

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

  14. 03:51

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

  15. 04:13

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

  16. 04:28

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

  17. 04:59

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

  18. 05:15

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

  19. 05:28

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

  20. 05:42

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

  21. 05:54

    ומה אני הולך לחפש? אני הולך לחפש פונקציית goodby. אוקיי, אז אני עושה דבר כזה. אני יוצר לנו פה תיקייה, כמו שהייתה לנו ב-level 1, עכשיו אני עושה לנו גם תיקייה patch-level 3, מעתיק לשם את הקובץ, נכנס פנימה, עושה CMD ופותח אותה.

  22. 06:14

    איך אני פותח אותה? עם ה-Decode. ה-Decoding פותח לי את הקובץ, עושה לו Unzip. האמת הייתי יכול לעשות Unzip רגיל וזה היה גם מספיק טוב.

  23. 06:25

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

  24. 06:40

    אוקיי לא הצליח להבין באיזושהי שורה איזושהי פקודה אוקיי והנה הוא פתח לי קובץ וניתח אותו פה למעלה אני רואה את כל הקובץ ואני רואה את הכתובות פה רצות תסתכלו ככל שאני זז ימינה הכתובות נהיות יותר גדולות אתם רואים 3000 ומשהו 2000 ומשהו וזה הקובץ כולו ואני מנתח אותו ויש פה ניתוח של הפונקציות ואנחנו צריכים

  25. 07:07

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

  26. 07:20

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

  27. 07:37

    בואו נראה מה מוביל אותנו לפונקציית goodby. אני לוחץ X, עושה right-click, גם 2x רף, זאת אות x, אתם רואים, אני לוחץ x, והוא אומר לי שלושה דברים יכולים לקרוא לקוד הזה.

  28. 07:51

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

  29. 08:07

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

  30. 08:24

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

  31. 08:35

    הבנתם או לא כל כך? עוד פעם, הפונקציה הזאת, מי שקורא לה זאת פונקציה הזאת. ומה זה הפונקציה הזאת?

  32. 08:44

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

  33. 08:55

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

  34. 09:14

    אני רואה פה, בואו נתחיל מלמעלה, אני רואה פה שיש פה איזשהו if v0 הצליח לפתוח את הקובץ map אתם רואים הוא פותח את הקובץ map מיפוי מיפוי זה אומר מי טעון אצלי בזיכרון אז אני לוחץ על הדבר הזה עושה n אני אראה לכם right click n rename var local variable ואני אקרא לו map file memory map

לקורס המלא: קורס האקינג לאנדרואיד אונליין

ההרצאה הקודמת: פריצה של UnCrackable-Level2 עם GUI FRIDA

ההרצאה הבאה: הסבר על Frida Interceptor Replace

הרצאות קשורות מקורסים אחרים

  • עקיפה של AMSI
  • שורש הבעיה - Root Cause
  • העלאת הרשאות - עקיפה של UAC
  • זיהוי מגע באנדרואיד

קורסים נוספים במסלול

  • קורס SOC - מיישם הגנת סייבר
  • קורס סייבר למתחילים - Hacking - בדיקות חוסן תשתיתי ופריצה ל-Windows 10/11 - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס פריצה ומבדקי חדירה לתשתית ארגונית - בדיקות חוסן מתקדמות ל-Active Directory - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס פריצה ומבדקי חדירה לאתרי אינטרנט - בדיקות חוסן לאתרים - Web Pentesting - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP