تست نفوذ برنامه های اندروید
چکیده
تست نفوذ اپلیکیشن های موبایلی نیازی رو به رشد است که با معرفی چارچوب های Android ، iPhone و iPad اخیرا توجه فراوانی را به سمت خود جلب کرده است. انتظار می رود که در آینده نزدیک، بازار اپلیکیشن های موبایل با افزایش نیاز به استفاده ازاپلیکیشنهای تلفنهای هوشمند مانند اپ های بانکی و تجاری، درآمدی بالغ بر 9 بیلیون دلار داشته باشد.
شرکت های زیادی از طریق توسعهی اپلیکیشن های جدید یا وارد کردن دوبارهی اپلیکیشنهای قدیمی در چارچوب تلفن های هوشمند در تلاشند تا بهرهی بیشتری را از این سود بیکران از آن خود کنند.
این اپلیکیشنها اغلب با اطلاعات شناسایی شخصی، کارت اعتباری و دیگر دیتای حساس افراد سروکار دارند.
این مقاله به صورت اختصاصی برروی کمک به متخصصان امنیت در درک بیشتر ظرافت های تست اپلیکیشن های اندرویدی تمرکز دارد و تلاش می کند تا گام های کلیدی مورد نیاز خواننده نظیر برپایی محیط تست، نصب شبیه ساز اندروید، تنظیم ابزارهای proxy و decompile کردن اپلیکیشن ها و غیره را پوشش دهد. همچنین این مقاله به معرفی ابزارهای امنیتی موجود برای چارچوب اندروید خواهد پرداخت. لازم به ذکر است که این مقاله به تشریح چارچوب امنیتی اندروید، یا شناساندن سیستم عامل اندروید یا پوشش تمام روشهای تست نفوذ اندروید نخواهد پرداخت.
مقدمه
اندروید یک چارچوب مبتنی بر لینوکس است که توسط شرکت گوگل و Open Handset Alliance توسعه داده شده است. برنامه نویسی اپلیکیشنهای اندرویدی منحصرا در جاوا انجام میشود. ساختار نرم افزار سیستم عامل اندروید شامل اپلیکیشن های جاوایی است که برروی ماشین مجازی Dalvik (DVK) اجرا میشوند. این روزها تلفن های همراه در نقش کامپیوترهای کوچکی هستند که نرم افزار های اجرا شده بر روی آنها نقش اپلیکیشن های تحت وب یا اپلیکیشن های کوچک دسکتاپی را بازی می کنند. با دادن اپلیکیشن، شما تنها یک بارفرآیند تنظیم proxy و decompile کردن کد را در پیش رو خواهید داشت و تست امنیت تنها به اجرای تست نفوذ یا مرور کد اپلیکیشنی که می خواهید تست کنید، محدود خواهد شد.
روش های متنوعی برای تست اپلیکیشن های موبایل وجود دارد، به عنوان مثال:
- استفاده از زنجیرهی تست نفوذ اپلیکیشن های تحت وب (مرورگر و proxy)
- استفاده از WinWAP با proxy
- استفاده از شبیه ساز تلفن با یک proxy
در این مقاله ما بر روی استفاده از شبیه ساز تلفن وproxy به عنوان آسان ترین و ارزان ترین گزینه برای تست اپلیکیشنهای موبایل تمرکز خواهیم کرد. برای برخی از platform ها، این شیوه میتواند سخت باشد اما برای اپلیکیشنهای اندرویدی، استفاده از یک شبیه ساز آسان و موثر است.
نیازمندی ها
کامپیوتری که بر روی آن سیستم عامل ویندوز اجرا می شود
جاوا
Eclipse
SDK Android
Fiddler
نصب Android SDK
اولین گام قبل از هر گونه تستی ، دانلود و نصب Android SDK است. برای اهداف این مقاله، ما از Microsoft windows برای تست استفاده خواهیم کرد. کامپیوتر شما به جاوا و Eclipse برای نصب SDK نیاز دارد. پروسهی نصب بر روی Microsoft windows بسیار آسان است. به سادگی Setup.exe را اجرا کنید، سپس SDK_ROOT را به متغیرهای سیستمی که به فولدر /tools اشاره میکنند اضافه کنید و %SDK_ROOT% را به متغیر PATH همان گونه که در شکل زیر نشان میدهد، اضافه نمایید.
شروع به کار شبیه ساز
شبیه ساز موبایل به همراه بسته SDK به صورت package نصب میشود و یک ابزار شبیه ساز مبتنی بر QEMU است که میتوانید برای طراحی، debug و تست اپلیکیشن ها در یک محیط واقعی و زمان اجرای اندرویدی از آن استفاده کنید.
قبل از آغاز به کار با شبیه ساز، نیاز به ایجاد یک ابزار مجازی اندرویدی (AVD) دارید. برای این کار به Eclipse> Window menu>Android SDK and AVD Manager> Virtual Devices مراجعه نموده و یک AVD جدید با تنظیمات پیش فرض بسازید. برای آغاز به کار شبیه ساز، فرمان های زیر را وارد کنید:
emulator –avd testavd
بعدا در این مقاله به گزینه های پیشرفته ای که می توانید توسط این فرمان مشخص کنید، نگاهی خواهیم انداخت. این دستور، شبیه ساز را مطابق شکل زیر شروع به کار میکند
C:\android-sdk-windows\tools>emulator -avd testavd
پس از آن یک اپلیکیشن اندرویدی را دانلود کردید، اپلیکیشن خود را با استفاده از App Invertor بسازید تا بتوانید آنرا با استفاده از شبیه ساز و بقیهی ابزارهای نامبرده شده در این مقاله تست کنید.
چگونه اپلیکیشن های اندرویدی را بر روی شبیه ساز نصب یا حذف کنیم
باید فایل apk. اپلیکیشن اندرویدی را به منظور انجام تست نفوذ بر روی آن در اختیار داشته باشید. از Android Debug Bridge(adb) (که با نصب SDK بر روی سیستم موجود است) برای نصب فایل ها در شبیه ساز استفاده کنید.
یک command prompt باز کنید و فرمان زیر را برای نصب هر فایل apk وارد کنید
adb install < path to the .apk file >
C:\android-sdk-windows\tools> adb install C:\SyncClientBinary.apk
1144 KB/s (0 bytes in 750906.000s)
pkg: /data/local/tmp/SyncClientBinary.apk
اگر در حین نصب فایل apk به پیام خطایی برخوردید، فرمانهای زیر را امتحان کنید
adb kill-server
adb start-server
اگر نصب اپلیکیشن به دلیل محدودیت سایز فایل apk ناموفق بود ، شبیه ساز را با استفاده از دستور زیر دوباره از نو راه اندازی کنید :
emulator –partition-size 256 -memory 512 -avd testavd
C:\Documents and Settings\Consultant>emulator -partition-size 256 -memory 512 -avd testavd
می توانید با استفاده از command prompt یا شبیه ساز، اپلیکیشن را uninstall کنید. برای استفاده از command prompt، adb shell را باز کرده، به فولدر app بروید و از فرمان rm برای حذف فایل apk مطابق شکل زیر استفاده کنید:
C:\android-sdk-windows\tools>adb shell
cd data
cd app
ls
com.funambol.android-1.apk
rm com.funambol.android.apk
rm failed for com.funambol.android-1.apk, No such file or directory
rm com.funambol.android-1.apk
از سوی دیگر، برای حذف اپلیکیشن با استفاده از شبیه ساز، به گزینهی Menu > Settings > Applications > Manage Applications مراجعه کرده و اپلیکیشن را انتخاب و گزینهuninstall را مطابق شکل زیر انتخاب کنید:
تنظیم یک ابزار proxy
اگر اپلیکیشن وب از Http(s) استفاده میکند یا یک سایت است که بر روی مرورگر اندروید تست می شود، گام بعدی برای تست آن، تنظیم یک ابزار پروکسی مانند Fiddler یا Paros است. چهار شیوهی اصلی برای تنظیم یک proxy وجود دارد:
- با استفاده از فرمان زیر جزئیات proxy را زمانی که شبیه ساز آغاز به کار کرد، مشخص کنید. این فرمان برای گوش دادن proxy برروی پورت 8888 (تنظیمات پیش فرض برای Fiddler) استفاده میشود. اگر از هر پورت proxy دیگری (به عنوان مثال پورت 8080 در Paros) استفاده میکنید، شماره پورت را تغییر دهید.
- گزینهی دوم این است که مطابق زیر، جزییات proxy را درقسمت APN شبیه ساز، مشخص کنید
- گزینهی سوم این است که تنظیمات را با استفاده ازadb shell و فرمان export برای تنظیم متغیرمحیطی انجام دهید:
- آخرین گزینه تغییر تنظیمات proxy در تنظیمات دیتابیسی است که مروگر وب اندرویدی از آنجا تنظیمات را میخواند. دیتابیس تنظیمات از SQLite استفاده میکند. اگر تصمیم به استفاده از این گزینه دارید، آشنایی با فرمان های پایهی SQL توصیه میشود. hostname و اطلاعات port را متناسب با آن چه که در فرمان زیر بیان شده است، تغییر داده و بقیه را بدون تغییر رها کنید:
emulator -avd testavd –http-proxy http://localhost:8888
C:\android-sdk-windows\tools>emulator -avd testavd -http-proxy http://localhost:8888
به Home > Menu > Wireless & Networks > Mobile Networks > Access Point Names مراجعه کرده و تنظیمات زیر را به روزرسانی کنید:
Name: Internet
APN: Internet
Proxy: IP address of your computer e.g. 192.168.1.3
Username: < Not Set >
Password : < Not Set >
export HTTP_PROXY=http://localhost : 8888
C:\Documents and Settings\Consultant> adb shell
# export HTTP_PROXY=http://localhost:8888
export HTTP_PROXY=http://localhost:8888
>adb shell
#sqlite3
/data/data/com.google.android.providers.settings.db/
sqlite> INSERT INTO system VALUES(99,'http_proxy','localhost:8888');
sqlite> .exit
تنها یکبار که یکی از گزینه های ذکر شده را برای تنظیم proxy خود استفاده کردید، proxy باید آغاز به دیدن request ها و response ها کند. شکل زیرFiddler را نشان میدهد که درخواستهای HTTP ای که توسط مرورگر شبیه ساز ارسال میشوند را intercept میکند. داشتن یک proxy وب که درخواست ها را intercept کند بخش کلیدی برای حل این معما است. از این نقطه به بعد تست نفوذ شبیه پروسهی تست اپلیکیشنهای تحت وب میباشد.
جعبه ابزار(Toolkit) تست نفوذ اپلیکیشنهای اندرویدی
Android SDK به همراه چندین ابزار ارائه میشود که اگرچه به طور اختصاصی برای تست امنیت طراحی نشده اند، اما میتوانند به عنوان ابزاری برای تست نفوذ استفاده شوند. به علاوه ، چندین ابزار دیگر خارج از SDK مانند Manifest explorer ، Intent Sniffer وIntent Fuzzer وجود دارند که میتوانید به عنوان بخشی از جعبه ابزار خود از آن استفاده کنید.
قبل از اینکه به ابزارهای ویژه نگاهی بیندازیم، ذکر این نکته مفید است که بدانیم زمانی که یک اپلیکیشن تحت وب را برروی چارچوب اندرویدی تست میکنیم، از قدرت debug menu مخفی نهایت بهره را ببرید. به منظور دسترسی به این menu مراحل زیر را دنبال کنید:
به مرورگر اندروید در شبیه ساز بروید
در مکان نمای آدرس، about : debug را وارد و کلیک کنید
به گزینهی menu -> More -> Settings مراجعه کنید
به سمت پایین اسکرول کنید تا منوی now enabled debug را ببینید
تنظیمات UAString به شما اجازه میدهد تا رشتهی User Agent مرورگر را زمانی که در این منو هستید، تغییر دهید.
Android Debug Bridge
قبلا این ابزار را هنگام نصب اپلیکیشن های اندرویدی دیده ایم و میدانیم که بخشی از Android SDK است و shell منحصر به فرد خود را دارد که به شما اجازه میدهد تا فرمانهای لینوکسی مانند ls –l را اجرا کنید. راهنمای توسعه دهندگان اندروید تمام فرمانهای ADB shell را لیست کرده ولی برای بخش کوچکی از فرمانهای زیر اهمیت دارند.
ADB میتواند همهی شبیه سازها و ابزارهای اندرویدی متصل به کامپیوتررا با استفاده از فرمان زیر تعیین کند:
adb devices
C:\Documents and Settings\Consultant> adb devices
List of devices attached
emulator-5554 device
در این مورد، این فرمان، تنها نمونه ای از شبیه سازی که در حال اجراست را پیدا می کند . اگر چندین نمونه در حال اجرا باشد میتوانید از گزینهی - s جهت اجرای فرمان برای یک ابزار یا شبیه ساز خاص استفاده کنید.
adb –s emulator -5554 install Foobar.apk
دستور مهم دیگری که توسط adb ارائه میشود، برای استخراج یا وارد کردن فایلها از شبیه ساز/ابزار اندرویدی به فایل دیتای آن نمونه می باشد. این دستورات زمانی میتوانند مفید باشند که بخواهید فایل ها را از شبیه ساز/ ابزار اندرویدی به کامپیوتر خود دانلود کرده و آنها را مروریا پردازش کنید. ما این قابلیت را با جزییات بیشتر در زمان بحث بر روی پروسهی decompilation امتحان خواهیم کرد.
فرمانهای dumsys یا dumpstate میتواند دیتای سیستم را مانند شکل زیر برروی screen یا یک فایل دیگر قرار دهد. این فایل میتواند شامل اطلاعات مرتبط امنیتی مهمی باشد. به جای آن برای نیل به این هدف شما میتوانید از Dalvik Debug Monitor Service(DDMS) استفاده نمایید.
MKSDCARD
دستور mksdcard با ساخت یک FAT32 disk image به شما اجازهی ساخت یک SD card مجازی برای شبیه ساز را میدهد. این احتمال وجود دارد که اپلیکیشنی که تست میکنید، نیاز به نصب یک دیتابیس یا فایلهای دیگر داشته باشد. بنابراین این دستور زمانی که میخواهید یک اپلیکیشن را برروی شبیه ساز به جای ابزار فیزیکی تست کنید، بسیار کارا خواهد بود.
از دستور mksdcard برای ساخت یک SD card مجازی استفاده کنید.
mksdcard [-l lable] < size >[K][M] < file >
اکنون از گزینهی – sdcard برای آغاز به کار شبیه ساز با اختصاص فایل SD card استفاده کنید.
emulator -sdcard < file specified in the command above >
ممکن است که در طول parsing در فایل های ذخیره شده در SD card توسط اپلیکیشن ، فایل های مخفی رمز شده ای را پیدا کنید. همواره در جستجوی password ها ، PIN ها ، PIIها و دیگر اطلاعات حساس باشید.
SQLITE3
از ترمینال adb shell میتوانید دستور sqlite3 را برای کوئری زدن به دیتابیسی که توسط اپلیکیشن های اندرویدی به وجود آمده و در حافظهی ابزار اندرویدی ذخیره شده است، اجرا کنید. این دستور ممکن است باعث افشای اطلاعات حساسی مانند پسوردها یا PIN ها به صورت hash شده یا clear text شود. این دیتابیس ها با پسوند .db ذخیره شده اند.
به /data/ data / < application> /databases/< nameofthedatabase> .db مراجعه کنید.
C:\Documents and Settings\Consultant> adb -s emulator-5554 shell
#ls /data/data/com.android.quickserachbox/databases
ls /data/data/com.android.quickserachbox/databases
qsb-log.db
# sqlite3 /data/data/com.android.quicksearchbox/databases/qsb-log.db
sqlite3 /data/data/com.android.quicksearchbox/databases/qsb-log.db
SQLite Version 3.6.22
Enter ".help" for instructions
Enter SQL statemnets terminated with a ";"
دستور .table را برای لیست تمام جدول ها و . schema < tablename> را برای لیست ساختار جدول ها، مطابق شکل زیر استفاده کنید:
# sqlite3 /data/data/com.android.quickserachbox/databases/qsb-log.db
sqlite3 /data/data/com.android.quickserachbox/databases/qsb-log.db
SQLite version 3.6.22
Enter ".help" for instructions
sqlite> .table
.table
android_metadata clicklog shortcuts sourcetotals
sqlite> .tables
.tables
android_metadata clicklog shortcuts sourcetotals
sqlite> .schema android_metadata
.schema android_metadata
CREATE TABLE android_metadata < locale TEXT > ;
همچنین میتوانید دستورات SQL مانند select * from shortcuts ; را اجرا نمایید.
Manifest Explorer
هر اپلیکیشنی که برروی سیستم عامل اندروید اجرا میشود، یک فایل AndroidManifest.xml دارد . این فایل از دید امنیتی به دلیل تعریف سطح دسترسی های مورد نیاز اپلیکیشن دارای اهمیت زیادی است . ابزار Manifest Explorer برای تسهیل در مشاهده این فایل xml به کار میرود.در زمان تست اپلیکیشن، مهم است که اپلیکیشن از اصل "least privilege" پیروی کند و از دسترسی هایی که برای کارکرد خود به آنها نیاز ندارد، استفاده نکند.
Intent Sniffer
Intent sniffer مکانیزمی است که ازآن برای جابجایی دیتا بین پروسه ها استفاده میشود. این مکانیزم هسته مرکزی Android’s Inter Process(IPC) را تشکیل میدهد. Intent ها میتوانند شماری از اکشن ها مثل startservice ، sendbroadcast و غیره را نمایان سازد. از این ابزار برای مانیتور کردن intent ها استفاده میشود.
PROCRANK
دستور procrank لیستی از پروسه هایی را که برروی ابزار اندرویدی در حال اجرا است ، همانند شکل زیر نشان میدهد. این دستور شبیه دستور ps است اما دارای ستون های اضافی مانند Vss (نشان دهندهی میزان حافظه ی مجازی اختصاص داده شده به هر پروسه است) و Pss (یک Rss کاهش یافته بر مبنای تعداد پروسه هایی که صفحات فیزیکی را به اشتراک میگذارند) می باشد.
STRACE
Strace ابزاری برای debug کردن است که فراخوان ها و سیگنال های سیستم را ردیابی میکند. این ابزار توسط Android SDK برروی سیستم نصب میشود. زمانی که میخواهید اپلیکیشنی را تست نمایید که رهگیری آن آسان نیست، استفاده از ابزارهایی نظیر Fiddler یا دیگر ابزارهای Http proxy بسیار مفید واقع خواهد شد. تنها کافی است که process ID اپلیکیشن مورد نظررا با دستور Procrank که بالاتر شرح داده شد، کشف کنیم.
BUSYBOX
Busybox برخی از دستورات لینوکسی را که میتوانند در طول پروسهی تست نفوذ مفید واقع شوند، ارائه میدهد و برای افزایش ظرفیت جعبه ابزار اندروید به کار میرود. به منظور نصب busybox میتوانید مراحل زیر را انجام دهید:
busybox binary را دانلود کنید
یک فولدر /data/busybox بسازید
آن فایل باینری را به فولدر مرحلهی قبل منتقل کنید
مطمئن شوید که مجوزهای درست با استفاده از دستور Chmod 755 ./busybox تنظیم شده است
اپلیکیشن را با دستور ./busybox -install نصب کنید
سپس یک دستور در Busybox اجرا کنید. به مسیر پوشهی busybox رفته و دستور زیر را وارد کنید :
. /< command >
Decompiling Android Application
فایلهای اندرویدی با پسوند apk در حقیقت همان فایل های zip شده هستند. آنها میان سایر اجزا شامل فایل هایی نظیر AndroidManifest.xml classes.dex، resources.arsc هستند .میتوانید پسوند .apk را تغییرنام دهید و آن را با یک ابزار ZIP مثل WinZip برای دیدن محتوای درون آن باز کنید.
معمولا مرسوم است که فایلهای .dex را به منظور decompile کردن آنها به کامپیوتر منتقل میکنند. فایل های classes.dex یک اپلیکیشن نصب شده در زیرشاخهی /data/Dalvik-cache قرار دارند.
پسوند .dex فرمت اجرایی dalvik است. به منظور کشیدن فایل های .class از ابزار dexdump که با SDK ارائه شده استفاده کنید .مطابق شکل زیر از دستور زیر به منظور خالی کردن فایل های .class استفاده کنید:
# dexdump -d -f -h data@این آدرس ایمیل توسط spambots حفاظت می شود. برای دیدن شما نیاز به جاوا اسکریپت دارید @classes.dex >> sync.apk.dump
اکنون مطابق شکل زیر، از دستور pull برای گذاشتن فایل به دست آمده از مرحلهی قبل در کامپیوتر استفاده نمایید:
C:\Documents and Settings\Consultant>adb pull /data/dalvik-cache/sync.apk.dump
:\sync.apk.dump
1529 KB/s (0 bytes in 7074192.004s )
اگر در خواندن ساختار کد بایت Dalvik مهارت دارید، این فایل به اندازه ی کافی برای شما مفید است. اما برای آن دسته از افرادی که با جاوا راحت تر هستند گزینهی بهتری برای گرفتن خروجی جاوا وجود دارد .
همچنین میتوانید از baksmali decompiler استفاده کنید که خروجی بسیاری بهتری ارائه میدهد. برای این منظور فایل .dex را به کامپیوتر بکشید . سپس دستوری که در ادامه می آید را اجرا کنید:
C:\>java -jar baksmali-1.2.3.jar -o C:\decompileddex C:\SyncClientBinary\classes.dex
خروجی decompile شدهی فایل .dex در زیر نشان داده شده است. برای بسیاری از افراد کد خروجی بسیار خواناتر از بایت کدهای Dalvik می باشد. بر اساس تحقیقات ما در حال حاضر هیچ راهی برای گرفتن کد جاوای منطبق با یک فایل .dex وجود ندارد و ما معتقدیم که بهترین گزینهی موجود همین است. گزینه ی بعدی که همین کار را انجام میدهد dedexer است.
دسترسی های فایل در Android
دسترسی های فایل اندروید از مدلی مشابه لینوکس استفاده میکند. برای بررسی اختیارات یک فایل، به adb shell بروید و دستور ls –l را تایپ کنید. هر فایل .apk که بر روی شبیه ساز نصب شده باشد USER ID یکتای خود را دارد. این امر باعث میشود که هر اپلیکیشنی نتواند دیتای یک اپلیکیشن دیگر را بخواند و به صورت نرمال توسط اپلیکیشن های دیگر قابل دسترسی نباشد. اگرچه یک فایل جدید با APIهای getSharedPreferences() ، OpenFileOutput() یا CreateDatabase() ساخته شود، میتوانید برای اینکه سایر package ها اجازهی خواندن یا نوشتن در این فایل را به صورت سراسری داشته باشند، پرچم های MODE_WORLD_WRITEABLE و MODE_WORLD_READABLE را مشخص کنید. این کار باعث به وجود آمدن یک نشان هشدار برای زمانی که میخواهید سورس کد را بررسی کنید، میشود. بنابراین جستجوی رشته های MODE_WORLD_WRITABLE و MODE_WORLD_READABLE در کد را مورد ملاحظه قرار دهید و از خود بپرسید آیا آنها واقعا مورد نیازند. باید توجه داشته باشید که چنین بررسی ای تنها زمانی ممکن است که به سورس کد اپلیکیشن دسترسی داشته باشید زیرا این نشان ها در کد decompile شده دیده نخواهند شد.
نویسنده : شرکت مهندس پیشگان آزمون افزار یاس
مراجع
[1]-Penetration Testing Android Applications, Kunjan Shah, Foundstone Professional Services