PracticU

עקיפה של זיהוי ROOT בקבצי smali

בלי כתוביותעם כתוביות
PracticU › קורס סייבר והאקינג ל-Android - פריצה לטלפונים ואפליקציות אנדרואיד - בודק חוסן - Mobile App Pentesting › עקיפה של זיהוי ROOT בקבצי smali
מילון מושגים:
root - משתמש העל במערכות Linux, בעל הרשאות מלאות לכל פעולה. גם הרמה העליונה בעץ של תיקיות או נתונים.
DLL - קובץ ספרייה ב-Windows המכיל קוד ופונקציות שתוכנות שונות יכולות לטעון ולהשתמש בהן במשותף.
Java - שפת תכנות עילית ומונחית עצמים, הרצה על מכונה וירטואלית (JVM) ומשמשת לפיתוח מגוון יישומים.
ספרייה - אוסף קוד מוכן, כמו פונקציות ומחלקות, שמפתחים משתמשים בו בתוכניותיהם במקום לכתוב הכול מחדש.
באג - תקלה או שגיאה בקוד שגורמת לתוכנה להתנהג בניגוד למצופה.
GitHub - שירות ענן לאחסון מאגרי קוד מבוססי Git, המאפשר שיתוף פעולה, מעקב גרסאות וניהול פרויקטים.
הערה - טקסט בקוד שמסביר אותו לבני אדם ואינו מבוצע על ידי המחשב.
תעודה דיגיטלית - מסמך מוצפן שמאשר את זהותו של אתר או שרת וקושר אותו למפתח ציבורי, ומונפק על ידי רשות אישורים.

עקיפה של זיהוי ROOT בקבצי smali
בשיעור זה נחזור על עקיפת זיהוי השורש של אפליקציית UnCrackable, הפעם בגרסה 2 שלה, ובדרך נלמד טריק יעיל יותר, במקום לעקוף כל פונקציית בדיקה בנפרד, ננטרל את הפקודה האחת שגורמת ליציאה מהאפליקציה, כך שההתראות יופיעו אך האפליקציה תמשיך לרוץ.
נושאי הסיכום המוצגים בשיעור:
1. הרקע להרצאות הבאות: בהרצאות הקרובות נלמד לדבאג ולהציץ בתוך הזיכרון של קובצי ספריות עזר. בווינדוס ספריות העזר נקראות קובצי DLL, ובלינוקס ובאנדרואיד הן נקראות קובצי SO. הן נקראות Native, מקומיות, מפני שהן אינן כתובות ב Java אלא בשפת C או C++, שנהדרות ישירות אל שפת מכונה של מכונה ספציפית, בניגוד לקוד Java שמורד לקוד אוניברסלי ומריץ על כל סוגי המכונות בעזרת ה JVM שמתרגם אותו.
2. התחברות של Java אל הספריות: Java מתחברת אל קובצי השפה המקומית בעזרת JNI, Java Native Interface, ממשק התחברות בין Java לבין קובץ בשפת מכונה. זה חשוב לנו מפני שלמדנו עד כה לפתוח ולשנות את קוד ה Java, אך לפעמים מה שאנחנו צריכים אינו נמצא ב Java אלא מוחבא בתוך ספריית עזר, וצריך לדעת להיכנס גם לשם.
3. האתגר: נעבוד על UnCrackable Level 2 של OWASP, הארגון העולמי לאבטחת מידע, שבו הסוד הוטמן בתוך קובץ SO, בתוך הספרייה המקומית, ותפקידנו להוציא אותו משם.
4. הכנת הסביבה: מאפסים את הטלפון הווירטואלי של Genymotion בעזרת Factory Reset מתפריט העכבר הימני, ויש לנו טלפון נקי. שווה לזכור את האזהרה מהשיעור הקודם, לוקחים גרסה 8 או 11 או 12 ואסור 9 ו 10, כי שם יש באגים בהצגת ערכי הרגיסטרים דרך הדבאגר בשפת ה smali, ואנחנו רוצים להשתמש בדבאגר כזה.
5. התקנת האפליקציה: מורידים את ה APK מה GitHub, גולשים אל המכשיר ומורידים את התריס העליון, לוחצים זמן ארוך על ה Wi Fi ורואים את כתובת ה IP שלו, מתחברים בעזרת adb connect, מאמתים ב adb devices ומתקינים בעזרת adb install. אין בעיה שתהיה מותקנת במכשיר בו זמנית גם גרסה 1 וגם גרסה 2.
6. הבעיה שמתגלה: בהפעלה מוצגת ההודעה שזוהה שורש, ושזה אינו מקובל והאפליקציה תצא כעת, ולחיצה על אישור סוגרת אותה. כל הפעלה מחדש מסתיימת כך.
7. מציאת הקוד ב JADX: משליכים את ה APK אל JADX או פותחים אותו עם File Open, מחפשים את המילה של זיהוי השורש עם סימן הקריאה בתוך הקוד, ומוצאים אותה. שלא כמו בגרסה הקודמת, כאן אחרי התנאי נקראת פונקציה שמקבלת את מחרוזת ההתראה, ושמה נכתב בלי שם מחלקה לפניו, מה שמרמז שהיא נמצאת באותה מחלקה שלנו, ובקונטרול קליק קופצים אל גופה.
8. מה עושה אותה פונקציה: היא מקבלת מחרוזת, יוצרת חלון קופץ, Dialog, שמקבל כותרת מהמחרוזת שהגיעה, בין אם זיהוי שורש ובין אם זיהוי דבאגר, מוסיפה הודעה וכפתורים, ויוצרת בעזרת מילת new מופע חדש של מחלקה, כלומר מחלקה חדשה, שבתוכה פונקציית onClick שמבצעת יציאה מהאפליקציה. יש כאן מחלקה בתוך מחלקה.
9. הטריק של הניטרול: במקום לחפש ולעקוף את כל פונקציות הבדיקה, ולא ידוע כמה מהן קיימות, מחפשים בקוד את הפקודה של יציאת המערכת, System.exit, ומתגלה שהיא מופיעה בקוד פעם אחת בלבד, ולכן ניטרול מקום אחד פותר את כל המקרים.
10. פענוח בעזרת apktool: בתיקיית עבודה חדשה בשם patch, טלאי, מריצים את apktool עם פקודת הפענוח על הקובץ. שווה להבין מה קורה כאן, ה APK מתנהג כמו קובץ zip וניתן לפתוח אותו כארכיון ולראות את הקבצים שבפנים, שכן כל קוד ה Java יושב בתוך קובץ ה classes dex, ולכן הפענוח הוא לא רק פתיחת ה zip אלא גם ביצוע פענוח לקוד המהודר שבפנים.
11. חיפוש בתוך הקבצים: נכנסים אל תיקיית ה smali של החבילה הראשית של האפליקציה, ובעורך טקסט מתקדם משתמשים בחיפוש בתוך קבצים, עם מילת החיפוש exit, בתיקייה זאת, מסננים לכל הקבצים ומבצעים חיפוש מלא. מוצאים את ההודעה ואת פקודת היציאה, ומתברר שהיא נמצאת בקובץ של המחלקה הפנימית, MainActivity עם סימן דולר אחד, מפני שכל מחלקה מקבלת קובץ משלה וכל new יוצר מחלקה פנימית נוספת, ולכן מופיעים סימני דולר עם מספור.
12. הנטרול בפועל: את השורה אפשר פשוט למחוק, או להוסיף לפניה סולמית שהופכת אותה להערה, טקסט שמתעלמים ממנו ומיועד למתכנת, ובעת ההידור הוא כבר לא יופיע. אנחנו מבחינות אלה בשינוי קוד ה smali, שהוא הייצוג של קוד הבייטקוד של Java. פותחים את הקובץ בעורך פשוט ומאמתים שהסולמית נמצאת לפני הפקודה.
13. בנייה מחדש וחתימה: מוחקים את ה APK הישן, מריצים את apktool עם פקודת הבנייה, שזה ההפך מהפענוח, ומתקבל בתיקיית ההפצה ה APK החדש. אי אפשר להתקין אותו ישר, צריך לחתום עליו דיגיטלית, ולכן דרוש מפתח הצפנה פרטי, שאותו יוצרים בעזרת keytool כפי שראינו בשיעור הקודם, וכאן פשוט מעתיקים את המפתח שכבר יצרנו בתיקיית העבודה הקודמת. חותמים בעזרת jarsigner, הכלי מבקש את סיסמת המפתח, והאזהרה שהתעודה חתומה על ידי עצמה היא תקינה, העיקר שאין שגיאה, ויש לנו קובץ מוכן וחתום.
14. ההתקנה והבדיקה: מסירים את האפליקציה הישנה מהמכשיר, את שם החבילה שלה מגלים בעזרת רשימת האפליקציות של פרידה, ומסירים אותה בעזרת adb uninstall או בגרירה אל אזור ההסרה, ואז מתקינים מחדש את הגרסה החתומה בעזרת adb install. בהפעלה מוצגת שוב ההתראה על זיהוי השורש, אך בלחיצה על אישור האפליקציה אינה יוצאת, זהו הטריק, ונותר רק לנחש את הקוד הסודי שלה. כך עקפנו את חסימת ההפעלה, ובשיעור הבא נתחיל לחפש את הקוד הסודי עצמו.
בשיעור זה הכרנו את קובצי ה SO המקומיים ואת ה JNI שמחבר את Java אליהם, התקנו את UnCrackable Level 2, איתרנו ב JADX את הקוד שמציג את ההתראה ויוצא מהאפליקציה, גילינו שפקודת היציאה מופיעה בקובץ המחלקה הפנימית פעם אחת בלבד, נטרלנו אותה בעזרת סולמית בקובץ ה smali, בנינו וחתמנו מחדש את ה APK בעזרת apktool ו jarsigner עם המפתח שכבר יצרנו, והאפליקציה המתוקנת כבר אינה יוצאת בעת ההתראה. בשיעור הבא נעסוק בנושא הסבר על JNI ועל קבצי SO.
SR12595HE

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

  1. 00:00

    הכרת קבצי ה-SO

  2. 01:00

    ספריות מקומיות Native

  3. 01:54

    ממשק ה-JNI

  4. 02:47

    האתגר UnCrackable 2

  5. 03:46

    התקנת האפליקציה

  6. 04:40

    הגדרת כתובת הטלפון

  7. 05:17

    חזרה על זיהוי ה-Root

  8. 06:45

    מבנה חלון ההתראה

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

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

  1. 00:02

    שלום לכולם בהרצאות הקרובות אנחנו נלמד איך לדבק איך להסתכל בתוך הזיכרון של קבצי dll של לינוקס של ספריות העזר לתוכנה הראשית בלינוקס הdll נקרא so קבצים עם סיומת so וזה למעשה libraries ספריות עזר לתוכנה הראשית ששם יש כל מיני פונקציות קוד והתוכנה הראשית משתמשת בספריות האלו לרוב משתמשים בזה כדי לא לרשום קוד פעמיים או שלוש או ארבע אותו

  2. 00:34

    קוד שהיה כבר כתוב להשתמש בו שוב אז לוקחים קוד שרוצים למחזר אותו שמים אותו ב-DLL בליבררי בספריית עזר וכמה תוכנות יכולות להתחבר לאותה ספרייה וספריות העזר האלו אמרנו בווינדוס נקראות DLL בלינוקס ואנדרואיד הן נקראות SO והן נייטיב למה הן נייטיב כי הן לא כתובות בג'אווה הן כתובות בשפת C או C++ אבל לא ג'אווה למעשה הם בשפת מכונה כמו קובץ אגזה מקורי,

  3. 01:08

    זאת אומרת שהוא מקומפל לשפת מכונה ולא לקוד אוניברסלי של Java, כי קוד של Java אפשר להריץ על כל סוגי המכונות, כי זה לא באמת שפת מכונה, כי יש JVM שמתרגם את השפה של Java למכונה ספציפית.

  4. 01:25

    Native Libraries כבר כתובים בשפת המכונה הסופית, ולכן הם נקראים Native כי הם מותאמים למכונה ספציפית. בקיצור זה קבצים שהם כמו קבצי אקזה, כמו אסמבלר רגיל.

  5. 01:38

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

  6. 01:51

    דרך Java Native Interface, GNI. Java Native Interface זה למעשה השיטה שבה Java תתחבר לקובץ בשפת מכונה ותדבר איתו. זה אינטרפייס, זה ממשק התחברות ביניהם ואנחנו נראה איך הוא עובד ונלמד לדבק ולקשר ולהיכנס לקרביים שלו.

  7. 02:12

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

  8. 02:28

    אנחנו צריכים גם לדעת להיכנס לשם ולהוציא משם המידע. איך אנחנו נעשה את זה? אנחנו נעשה את זה דרך אתגר שנקרא Uncrackable Level 2. ב-Uncrackable Level 2 הם הרביעו את הסוד בתוך קובץ SO, בתוך ה-DLL, בתוך הליבררי, ואנחנו צריכים להוציא את זה משם.

  9. 02:49

    איך מתחילים? מתחילים מזה שלוקחים ג'יני מושן, שזה סימולטור של טלפון במחשב הפיזי שלי, עשיתי לו איפוס, עשיתי פה, לקחתי ג'יני מושן במחשב הפיזי שלי, עשיתי עליו right click ולמטה פקטורי reset אולי תראו את זה אתם רואים פה עשיתי פקטורי reset עשיתי לו איפוס ועכשיו יש לנו טלפון נקי יפה מאוד דבר אחד מאוד מאוד חשוב שאני

  10. 03:15

    אגיד לכם תיקחו טלפון או גרסה 87 או 11 12 אבל לא 9 ו-10 אסור שיהיה כתוב פה 9 ו-10 כי יש שם באגים ואני לא רוצה להיכנס יש בעיה עם שמאלי אם להציג את הערך של רג'יסטרי דרך דבאגר ואנחנו רוצים להשתמש בדבאגר בסמאלי ולכן עדיף לא לקחת גרסה 9 ו-10 הבעיה היא כשאנחנו עושים דיבאג לתוכנה לראות את הערכים של רגיסטרים של הזיכרון שלו

  11. 03:46

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

  12. 04:04

    הנה יש לנו OWASP שזה הארגון העולמי של אבטחת מידע וכל מה שקשור לחורי אבטחה. קראגס מאתגרים שהם עשו. אנדרואיד Level 2, Uncrackable Level 2 ו-Download.

  13. 04:17

    יש לכם פה גם קישור למי שנתקשה למצוא. שואו אינפולדר, אנחנו רואים פה שהוא ירד לי ואני עושה כאן CMD וכותב ADB Install ל-Uncrackable Level 2, הפעם אנחנו רוצים Level 2 רגע, רגע, רגע, הוא לא יתקין כי הוא לא יודע איפה הטלפון שלי שכחתי לחבר את הטלפון, בואו נבדוק מה ה-IP של הטלפון שלי אני מוריד את זה למטה, לוחץ לחיצה ארוכה כאן

  14. 04:45

    לוחץ על הרשת ה-Wi-Fi שלי ורואה שהכתובת 174 נהדר, מתחבר לטלפון, ב-ADB Devices בודק שהטלפון עובד ועושה ADB Install דרך אגב, אין בעיה שיהיה בו זמנית מותקן גם גרסה הראשונה וגם הגרסה השנייה.

  15. 05:03

    הנה, התקנו את האפליקציה, נהדר, ובואו נפעיל אותה. Root Detected, הוא מזהה שזה Root, ו-This is unacceptable, the app is now going to exit.

  16. 05:14

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

  17. 05:28

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

  18. 05:44

    אפשר היה לפתוח סתם ג'אדקס ולהגיד לו File Open ל-APK או לזרוק את ה-APK על ג'אדקס, לא משנה. אנחנו מחפשים את ה-Root Detected סימן קריאה.

  19. 05:55

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

  20. 05:58

    a את המילה רות דטקטד ופונקציית a כנראה היא זאת שיוצאת החוצה בלחיצת אוקיי שימו לב מה קורה פה פה יש אותו מקרה של if משהו גם a up is debugable גם a זאת אומרת שיש לי כמה פעמים שקורה מצב שפונקציית a נקראת ויוצאת החוצה עכשיו פונקציית a היא כתובה בלי קלאס למה לפני השם אין קלאס כי זה בתוך אותו קלאס שלי זה נמצא איפשהו מעליי פה למעלה ואני רואה

  21. 06:50

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

  22. 07:03

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

  23. 07:11

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

  24. 07:25

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

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

ההרצאה הקודמת: דיבאג של קובץ APK בתוך Android Studio ללא קוד מקור

ההרצאה הבאה: הסבר על JNI ועל קבצי SO

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

  • עקיפה של AMSI
  • שימוש בקבצי JAR
  • שורש הבעיה - Root Cause
  • העלאת הרשאות - עקיפה של UAC

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

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