[InsecureBank] #3 Exploiting Android Activities
adb를 이용하여 액티비티를 임의로 조작할 수 있는 취약점에 대해서 알아보겠습니다.
이전과 마찬가지로 apktool을 이용해서 디컴파일 해줍니다.
./apktool d InsecureBankv2.apk
/InsecureBankv2/AndroidManifest.xml을 열어 보면,
<?xml version="1.0" encoding="utf-8" standalone="no"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.insecurebankv2" platformBuildVersionCode="22" platformBuildVersionName="5.1.1-1819727">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
...중략
<activity android:label="@string/title_activity_file_pref" android:name="com.android.insecurebankv2.FilePrefActivity" android:windowSoftInputMode="adjustNothing|stateVisible"/>
<activity android:label="@string/title_activity_do_login" android:name="com.android.insecurebankv2.DoLogin"/>
<activity android:exported="true" android:label="@string/title_activity_post_login" android:name="com.android.insecurebankv2.PostLogin"/>
<activity android:label="@string/title_activity_wrong_login" android:name="com.android.insecurebankv2.WrongLogin"/>
<activity android:exported="true" android:label="@string/title_activity_do_transfer" android:name="com.android.insecurebankv2.DoTransfer"/>
<activity android:exported="true" android:label="@string/title_activity_view_statement" android:name="com.android.insecurebankv2.ViewStatement"/>
<provider android:authorities="com.android.insecurebankv2.TrackUserContentProvider" android:exported="true" android:name="com.android.insecurebankv2.TrackUserContentProvider"/>
<receiver android:exported="true" android:name="com.android.insecurebankv2.MyBroadCastReceiver">
<intent-filter>
<action android:name="theBroadcast"/>
</intent-filter>
</receiver>
<activity android:exported="true" android:label="@string/title_activity_change_password" android:name="com.android.insecurebankv2.ChangePassword"/>
<activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:name="com.google.android.gms.ads.AdActivity" android:theme="@android:style/Theme.Translucent"/>
<activity android:name="com.google.android.gms.ads.purchase.InAppPurchaseActivity" android:theme="@style/Theme.IAPTheme"/>
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
<meta-data android:name="com.google.android.gms.wallet.api.enabled" android:value="true"/>
<receiver android:exported="false" android:name="com.google.android.gms.wallet.EnableWalletOptimizationReceiver">
<intent-filter>
<action android:name="com.google.android.gms.wallet.ENABLE_WALLET_OPTIMIZATION"/>
</intent-filter>
</receiver>
</application>
</manifest>
activity의 정보들이 보이게 됩니다.
그중 로그인 완료 화면인 PostLogin으로 임의 접근 해보겠습니다.
adb shell로 shell에 접속합니다.
am start -n com.android.insecurebankv2/.PostLogin
am(Activity Manager)명령어는 http://www.dreamy.pe.kr/zbxe/CodeClip/163972에 설명이 잘 되어있습니다.
앱이 실행중이 아니더라도 am을 통해서 원하는 액티비티를 띄울 수 있습니다.
<activity android:exported="true"
android:label="@string/title_activity_post_login"
android:name="com.android.insecurebankv2.PostLogin"/>
이 부분에 exported 가 true이면, 앱 밖에서도 액티비티의 호출이 가능합니다.
따라서 exported="false"로 변경한 뒤, 리컴파일 , sign까지 한 어플을 설치한다면,
./apktool b InsecureBankv2
java -jar sign.jar InsecureBankv2.apk
generic_x86_arm:/ $ am start -n com.android.insecurebankv2/.PostLogin
Starting: Intent { cmp=com.android.insecurebankv2/.PostLogin }
Security exception: Permission Denial: starting Intent { flg=0x10000000 cmp=com.android.insecurebankv2/.PostLogin } from null (pid=11059, uid=2000) not exported from uid 10093
java.lang.SecurityException: Permission Denial: starting Intent { flg=0x10000000 cmp=com.android.insecurebankv2/.PostLogin } from null (pid=11059, uid=2000) not exported from uid 10093
at com.android.server.am.ActivityStackSupervisor.checkStartAnyActivityPermission(ActivityStackSupervisor.java:1788)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:717)
at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:544)
at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:1099)
at com.android.server.am.ActivityStarter.execute(ActivityStarter.java:486)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5120)
at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:5094)
at com.android.server.am.ActivityManagerShellCommand.runStartActivity(ActivityManagerShellCommand.java:479)
at com.android.server.am.ActivityManagerShellCommand.onCommand(ActivityManagerShellCommand.java:161)
at android.os.ShellCommand.exec(ShellCommand.java:103)
at com.android.server.am.ActivityManagerService.onShellCommand(ActivityManagerService.java:16012)
at android.os.Binder.shellCommand(Binder.java:634)
at android.os.Binder.onTransact(Binder.java:532)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:3592)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3291)
at android.os.Binder.execTransact(Binder.java:731)
위와같이 에러가 발생하며 액티비티의 실행이 안되는 것을 확인할 수 있었습니다.
'안드로이드 > InsecureBank' 카테고리의 다른 글
[InsecureBank] #5 Exploiting Weak Cryptography (0) | 2020.01.15 |
---|---|
[InsecureBank] #4 Exploiting Android Content Provider (0) | 2020.01.10 |
[InsecureBank] #2 Application patching , Week Auth (0) | 2020.01.08 |
[InsecureBank] #1 환경 구축하기 (0) | 2020.01.07 |