티스토리 뷰
Drozer를 이용한 앱 취약점 진단 - Broadcast Receiver 결합
취약점 소개
안드로이드 디바이스에서 이벤트가 발생하면 브로드캐스트 신호를 보내게 되는데, 이 신호를 받아 역할을 수행한다. 애플리케이션에서 선언한 액션을 호출하면 리시버는 해당 액션을 인지하여 작업을 수행하고, 수행하는 작업은 브로드캐스트 리시버를 상속 받은 메서드에서 처리한다.
브로드캐스트 리시버를 호출 할 시 비정상적, 악의적인 애플리케이션에서 발생하거나, 공격자에 의해 임의대로 생성할 수 있다.
Target APP - insecurebankv2.apk (취약점 진단용 앱)
link -> https://github.com/dineshshetty/Android-InsecureBankv2
Manifest.xml - Broadcast Receiver 확인
Class |
MyBoradCastReceiver.class |
Name |
theBroadcast |
Exported |
True |
MyBroadCastReceiver.class 확인
dex2jar-2.0, jd-gui-windows-1.4.0 를 이용하여 MyBroadCastReceiver.class 확인
[dex2jar-2.0, jd-gui-windows-1.4.0 사용법은 생략]
public class MyBroadCastReceiver extends BroadcastReceiver { public static final String MYPREFS = "mySharedPreferences"; String usernameBase64ByteString; public void onReceive(Context paramContext, Intent paramIntent) { Object localObject = paramIntent.getStringExtra("phonenumber"); paramIntent = paramIntent.getStringExtra("newpass"); if (localObject != null) { try { paramContext = paramContext.getSharedPreferences("mySharedPreferences", 1); this.usernameBase64ByteString = new String(Base64.decode(paramContext.getString("EncryptedUsername", null), 0), "UTF-8"); paramContext = paramContext.getString("superSecurePassword", null); String str = new CryptoClass().aesDeccryptedString(paramContext); paramContext = ((String)localObject).toString(); paramIntent = "Updated Password from: " + str + " to: " + paramIntent; localObject = SmsManager.getDefault(); System.out.println("For the changepassword - phonenumber: " + paramContext + " password is: " + paramIntent); ((SmsManager)localObject).sendTextMessage(paramContext, null, paramIntent, null, null); return; } catch (Exception paramContext) { paramContext.printStackTrace(); return; } } System.out.println("Phone number is null"); } } | cs |
onReceive() 메서드를 확인해 보면 전화번호를 intent로 받아 전화번호에 문자메시지를 전송하도록 정의되어 있으며 번호가 입력되지 않았을 경우 “Phone number is null”을 출력한다.
Exported 값이 true 이므로 외부 애플리캐이션에서의 브로드캐스트를 전송하여 요청할 수있다.
-phonenumber를 입력하지 않았을 때-
dz> run app.broadcast.send --component com.android.insecurebankv2 com.android.insecurebankv2.MyBroadCastReceiver
broadcast logcat 결과값
-phonenumber 와 newpass 값을 입력하여 broadcast 전송-
dz> run app.broadcast.send --component com.android.insecurebankv2 com.android.insecurebankv2.MyBroadCastReceiver --extra string phonenumber 1111 --extra string newpass test
SMS 전송 logcat 결과값
drozer에서 전송한 broadcast로 인해 SMS 전송 결과값을 확인할 수 있다. 해당 앱의 소스 내용에서는 기존 Password 내용이 노출되는 부분이 노출되어 있기 때문에 이를 응용하여 외부 Broadcast 전송으로 정보를 얻을 수 있다.
'ANDROID > android' 카테고리의 다른 글
취약점 상세 진단 - 루팅 탐지 및 우회 (0) | 2017.05.29 |
---|---|
취약점별 상세 진단 - 취약인증메커니즘 (0) | 2017.05.29 |
안드로이드 앱 진단[Drozer 사용법] (0) | 2017.05.25 |
Android ORM Lite (0) | 2017.02.18 |
Android - push 알림 (notification) (0) | 2016.12.12 |