R136A1

[InsecureBank] 3. Weak Authorization mechanism 약한 인증 매커니즘 본문

Android/InsecureBankv2

[InsecureBank] 3. Weak Authorization mechanism 약한 인증 매커니즘

r136a1x27 2021. 11. 5. 17:31

약한 인증 매커니즘. 쉽게 예를 들면 계정 정보를 수정할 때, 관리자 페이지에 접근할 때

비밀번호를 한번 더 입력받지 않거나 추가적인 인증 과정 없이 사용자를 신뢰하여 중요한 정보를 변경할 수 있게 함

(웹에서도 나타남)

 

모바일에서는 액티비티를 기반으로 인증과정을 건너뛸 수 있다.

 

기능 분석하기

약한 인증 매커니즘은 취약점 찾기 없이도 찾아낼 수 있다.

Insecurebank의 기능에는

1. Transfer(송금)

2. View Statement(상태 보기) = 송금 내역

3. Change Password(비밀번호 변경)

특히 1. Transfer과 3. Change Password의 경우 민감한 정보를 다루므로 추가적인 인증 절차가 필요하다.

 

Transfer의 경우 추가적인 인증 절차 없이 From Accounts를 입력할 수 있으므로

자신의 계좌가 아닌 다른 계좌 대상으로 돈을 송금하는 것이 가능하다.

(또한, 앱 DB에 계좌가 없어도 무조건 송금된다)

Change Password의 경우에도 추가적인 인증 과정 없이 로그인만 되어 있다면 password를 변경할 수 있다.

이정도만 해도 인증 매커니즘이 취약하다 볼 수 있지만

두 경우 모두 로그인 화면을 통과해야만 접근할 수 있는 기능이므로, 추가적으로 로그인을 우회하는 취약점을 찾아보자.

 

수동으로 취약점 찾기

액티비티 살펴보기(manifest.xml 에 선언되어있음)

run app.package.manifest com.android.insecurebankv2 또는 1. 에서 확인했던 것 처럼 jd-gui로 확인할 수 있다.

 <activity android:label="@string/app_name" android:name="com.android.insecurebankv2.LoginActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
 </activity>
 <activity android:label="@string/title_activity_file_pref" android:name="com.android.insecurebankv2.FilePrefActivity" android:windowSoftInputMode="adjustUnspecified|stateVisible|adjustResize|adjustPan|adjustNothing"/>
 <activity android:label="@string/title_activity_do_login" android:name="com.android.insecurebankv2.DoLogin"/>
 <activity android:label="@string/title_activity_post_login" android:name="com.android.insecurebankv2.PostLogin" android:exported="true"/>
 <activity android:label="@string/title_activity_wrong_login" android:name="com.android.insecurebankv2.WrongLogin"/>
 <activity android:label="@string/title_activity_do_transfer" android:name="com.android.insecurebankv2.DoTransfer" android:exported="true"/>
 <activity android:label="@string/title_activity_view_statement" android:name="com.android.insecurebankv2.ViewStatement" android:exported="true"/>
 <activity android:label="@string/title_activity_change_password" android:name="com.android.insecurebankv2.ChangePassword" android:exported="true"/>
 <activity android:theme="@style/Theme.Translucent" android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
 <activity android:theme="@style/Theme.IAPTheme" android:name="com.google.android.gms.ads.purchase.InAppPurchaseActivity"/>

여기서 주목해야 하는 것은 activity의 android:exported 속성이다.

intent-filter가 있을 경우 true로자 자동 설정되고,

intent-filter가 없을 경우 default는 false이기 때문에

true인 activity를 뽑아보면 아래와 같다.

login_activity, post_login, do_transfer, view_statement, change_password

 <activity android:label="@string/app_name" android:name="com.android.insecurebankv2.LoginActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
 </activity>
 <activity android:label="@string/title_activity_post_login" android:name="com.android.insecurebankv2.PostLogin" android:exported="true"/>
 <activity android:label="@string/title_activity_do_transfer" android:name="com.android.insecurebankv2.DoTransfer" android:exported="true"/>
 <activity android:label="@string/title_activity_view_statement" android:name="com.android.insecurebankv2.ViewStatement" android:exported="true"/>
 <activity android:label="@string/title_activity_change_password" android:name="com.android.insecurebankv2.ChangePassword" android:exported="true"/>

 

drozer를 통해 취약점 찾기

run app.activity.info -a com.android.insecurebankv2

자동으로 android:exported 속성이 true인 액티비티(취약한 액티비티)만 찾아준다.

 

참고로 이 개수는 run app.package.attacksurface com.android.insecurebankv2를 통해 도출된 취약점 개수와 동일하다


여기서 우리가 주목해야 할 것은 DoTransfer과 ChangePassword 모두 true이라는 점이다.

따라서 첫 화면에서 로그인 없이 DoTransfer 또는 ChangePassword로 뛰어넘을 수 있다.

 

drozer exploit code

run app.activity.start --component com.android.insecurebankv2 com.android.insecurebankv2.DoTransfer

 

adb exploit code

am start com.android.insecurebankv2/ .DoTransfer

 

방어 기법

activity android:exported 설정을 false로 변경한다.

Comments