פוסט זה נועד להיות בעיקר תזכורת לעצמי לגבי תהליך התקנת האמולטור של אנדרואיד, הגדרות בסיסיות, והתקנה של אפליקציות. מקווה שהפוסט גם יעזור לאנשים אחרים, שרק מתחילים את דרכם בביצוע בדיקות חדירות לאנדרואיד.
אילוצים:
- התקנת האמולטור והקבצים הנחוצים להרצת האפליקציות בלבד. כלומר, ללא Android Studio, שמאפשר לבצע כל זה עם GUI, אבל חוץ מזה לא נדרש וסתם שוקל הרבה.
- סביבת העבודה – Linux. אבל התהליך דיי דומה ל-Windows.
הורדה והתקנת האמולטור של אנדרואיד
בעמוד https://developer.android.com/studio/#downloads מופיעים הקישורים להורדת כלים ל- SDK (בחלק של Command line tools only). לאחר ההורדה, כדאי לחלץ את ה- zip (תיקיית tools שבפנים) לתיקיה ייעודית, מכיוון שיהיו הורדות נוספות. לצורך הדגמה יצרתי תיקיה ~/android-sdk .
לאחר מכן, צריך להתקין חבילות נוספות – adb, system images, ועוד. נעבור לתיקיית bin, שבה נמצא sdkmanager:
cd ~/android-sdk/tools/bin
רשימת חבילות זמינות להתקנה:
sdkmanager --list
החבילה הראשונה שכדאי להתקין זה platform tools, הכוללת adb. אותה צריך להתקין רק פעם אחת.
sdkmanager "platform-tools"
לאחר מכן, התקנת ה- system image לגרסת אנדרואיד הנדרשת. אפשר לחשוב על זה כעל מכונות וירטואליות שהאמולטור מריץ. ישנם גם גרסאות של Android Wear ו- Android TV. בהדגמה זו אני מתקין API בגרסה 26 (אנדרואיד 8.0) ללא Play Store. אני חושב שהדגמה זו תהיה הכי שימושית, מכיוון שלא כל הגרסאות של system image מכילות Play Store. לפעמים הבדיקה דורשת גרסת אנדרואיד מסוימת, ולכן יהיה שימושי לדעת איך להתקין Play Store בצורה ידנית, אם יהיה צורך להוריד אפליקציות דרכו.
sdkmanager "system-images;android-26;google_apis;x86_64"
והשלב האחרון – יצירת המכונה (AVD – Android Virtual Device) להרצה באמולטור. נקרא למכונה test1 לצורך הדגמה.
avdmanager create avd -n test1 -k "system-images;android-26;google_apis;x86_64"
שווה לערוך קובץ ההגדרות של AVD שיצרנו:
~/.android/avd/test1.avd/config.ini
הדבר הראשון שאני תמיד מוסיף, זה אפשרות לבצע שיתוף clipboard בין המכונה ל- host:
hw.keyboard=yes
לפעמים גם נדרש להגדיל כמות הזכרון:
hw.ramSize=1024
avdmanager list avd
הרצת האמולטור של אנדרואיד
מעבר לתיקיה של האמולטור: cd ~/android-sdk/emulator
הפעלת AVD לפי שם: emulator -avd test1
במידה והאמולטור קורס ומקלל משהו לגבי libGL, אפשר לנסות להריץ האמולטור עם דגל -use-system-libs
. זה יגרום לאמולטור להשתמש בספריה libstdc++ של המערכת הפעלה ולא אחת שמגיעה עם האמולטור.
דגל שימושי נוסף (בהמשך) הנו -writable-system
, המאפשר לערוך את המחיצת ה- system של AVD.
התקנת Play Store
Android Debug Bridge (או בקיצור ADB) מאפשר לתקשר עם AVD מה- host. לדוגמה, להתקין אפליקציות, להעביר קבצים, לראות לוגים, לקבל shell, ועוד. במכונה שיצרנו לא קיים Play Store; נתקין אותו (ללא Google services נוספים) ידנית באמצעות ADB.
קודם צריך להוריד את קבצי האפליקציה מהאתר https://opengapps.org. שם צריך לבחור את החבילה שמתאימה לגרסת האנדרואיד והפלטפורמה. בדוגמה זו הפלטפורמה הנה x64 ואנדרואיד גרסה 8.0. כמו כן, החבילה להורדה תהיה pico, מכיוון שצריך רק את Play Store.
לאחר מכן, צריך לחלץ את הקובץ Phonesky.apk שנמצא בנתיב הבא בתוך ה- zip שירד:
Core/vending-x86_64.tar.lz/vending-x86_64/240-320-480/priv-app/Phonesky/Phonesky.apk
מכיוון שמדובר על התקנה ידנית של אפליקציה למחיצת ה- system, צריך להפעיל את האמולטור עם אפשרות כתיבה למחיצה זו.
emulator -avd test1 -writable-system
התקנת Phonesky.apk
cd ~/android-sdk/platform-tools/
החלפה למשתמש root:
adb root
טיעינת המחיצה מחדש כדי לקבל הרשאות כתיבה:
adb remount
כניסה לשורת פקודה באנדרואיד:
adb shell
יצירת תיקיה ל- Play Store:
mkdir /system/priv-app/Phonesky
יציאה משורת פקודה:
exit
העתקת קובץ האפליקציה:
adb push ~/Phonesky.apk /system/priv-app/Phonesky/
לאחר מכן צריך להפעיל את Android Shell מחדש:
adb shell stop
adb shell start
עכשיו יש Play Store מותקן:
חשוב להדגיש, שזו לא הדרך הנכונה כדי להתקין אפליקציות רגילות, אלא רק מה שנמצא במחיצת system. אפליקציות רגילות אפשק להתקין בקלות עם הפקודה adb install test.apk
.
במידה ומשהו השתבש, אפשר לצפות בלוגים עם הפקודה adb logcat
.
הגדרת HTTP proxy ו- GPS
את כתובת הפרוקסי אפשר להגדיר ב- GUI של האמולטור (מסך Settings, לשונית Proxy), או להפעיל את האמולטור עם הדגל -http-proxy <host:port>
.
השלב הבא הוא התקנת תעודת CA של הפרוקסי. ללא התעודה לא יעבדו שירותים של גוגל, חיבור מייל ועוד. לדוגמה, לא תהיה אפשרות להתקין אפליקציות מ- Play Store.
הזהרה: לא ניתן להשתמש בשלב זה ב- OWASP ZAP בגלל האופן שבו עובד האמולטור של אנדרואיד עם הגדרת פרוקסי. בניסיון התחברות לשרת, האמולטור מציב את כתובת ה- IP של השרת בפקודת HTTP CONNECT, במקום להציב שם את ה- hostname. בתורו ZAP מג'נרט את תעודת SSL עם כתובת IP בשדה Issued to של התעודה. וזה כמובן גורם לתעודה להיות לא תקינה, מכיוון שכתובת ה- IP שונה מה- hostname. זו תקלה בצד האמולטור, ולא של ZAP, שעובד כצפוי. הנה דוגמה לניסיונות התחברות כושלים לשרתים של גוגל, מכיוון שהתעודה לא תקנית. שימו לב שבפקודת CONNECT רשומה כתובת IP ולא hostname.
כשנתקלתי בתקלה זו בפעם הראשונה, קודם כל בדקתי מה יקרה בעבודה דרך burp. הופתעתי לגלות ש- burp יודע להתמודד עם המצב ומייצר תעודה דיגיטלית תקנית גם עם בפקודת HTTP CONNECT רשומה כתובת IP. הנחתי שהוא לוקח את ה- hostname ממקום אחר. הלכתי לערוץ של burp ב- IRC כדי לקבל ייעוץ. מסתבר שהמפתחים של burp כבר מכירים את הבעיה וטיפלו בה:
<pajswigger> We fixed this a few versions back, now if Burp sees an IP address in the CONNECT header, it sniffs the SNI to determine the domain name
נעבוד עם burp אם כך. שלב ראשון – ייצוא תעודת CA של burp:
שלב שני – העתקת התעודה לאמולטור:
cd android-sdk/platform-tools/
adb push burp.cer /sdcard
שלב שלישי – ייבוא התעודה. אנדרואיד יבקש להגדיר PIN לפני התקנת תעודה דיגיטלית, ויבדוק אותו במידה ונרצה להתקין תעודות נוספות.
עכשיו הפרוקסי מייצר תעודות תקינות
והאמולטור מעביר תעבורה דרך פרוקסי באופן תקני:
את הקואורדינטות GPS ניתן לשנות בהגדרות האמולטור. זה מאוד שימושי לבדיקת אפליקציות הקשורות למיקום.
מחיקת AVD
avdmanager delete avd -n test1