몸캠 피싱 관련 정리를 하고 싶어서 정보를 찾다가 몸캠피싱 피해자 모임이라는 사이트에서 cloud1one이라는 도메인을 가지는 피싱 사이트를 발견했습니다.
몸캠피싱
몸캠피싱 피해과정은 SNS로 친구요청이나 데이팅 앱 등 친밀감을 쌓고 음란채팅으로 유도하여 피해자의 신체사진 및 영상 등을 확보하고 채팅 중에 음성이 안 들린다 또는 비밀성을 강조하며 악성 앱(음성 채팅, 갤러리, 클라우드, 보안) 설치 유도를 해서 모바일에 저장된 주소록(연락처) 정보를 빼거나 SNS를 통해 피해자의 지인에게 연락 가능한 정보를 수집한다. 수집한 정보를 이용하여 유포한다며 협박을 해서 금전을 요구하는 형태이다.
피해과정
채팅 앱 및 SNS -> 친밀감 형성 -> 피해자 욕구 충족(기프티콘, 금전, 성욕 등) -> 영상 및 사진 요구 -> 지인 연락처 확보(악성 앱 설치) -> 협박 및 금전요구
소개팅 어플에서 만난 사람이 타 sns로 이동 요구를 한 후에 링크를 보내 악성 앱 다운 유도를 하는 상황으로 보입니다. 해당 내용으로는 주소를 정확히 알 수없기 때문에 구글 검색 도구를 이용하여 찾아봤습니다. 확인결과 유효해 보이는 1개의 사이트를 찾을 수 있었습니다.
피싱 사이트 접속 화면
해당 피싱 사이트는 디버그 방지와 [app store] , [google play] 버튼을 눌렀을 때 특정 버전 이상의 값을 가져야 다음 페이지(악성앱 설치 페이지)로 이동할 수 있는 것으로 확인되었습니다. userAgent 정보를 확인해 버전이 안 나올 경우 모바일 환경으로 유도하기 위해 qr코드가 보이는 페이지를 보여 줍니다.
악성 앱 리소스 분석
리소스 확인 시 Activities 8 , Services 3, Receivers 0, Providers 4의 컴포넌트를 사용하고, 권한은 10개을 사용함 각 권한은 인터넷, 연락처, 휴대폰정보, 미디어파일, 문자를 유출할 수 있는 권한이 존재하는 것을 확인할 수 있다.
APK 파일 정보
App Name: 원클라우드
Version Code: 6
Version Name: 1.6.1
Package Name : com.example.mydemo
MD5: 0ccee71c733015b8830d56c4ccfbe355
SHA-1: 8c8da672abd1ff52dfed393275174a2a57f831eb
SHA-256: 1d4c2f1d1fdf2ea108a6239283021a4a5d7a99c30d61ba497c91530b84aa3966
VirusTotal 백신 탐지 결과
19개의 백신에서 악성으로 탐지된다.
Security Solution | 탐지정보 |
AhnLab-V3 | Trojan/Android.Infostealer.1227129 |
Antiy-AVL | Trojan/Generic.ASMalwAD.EA2 |
Avast-Mobile | Android[Trj] |
Avira (no cloud) | ANDROID/AVE.Evo.brwkd |
BitDefenderFalx | Android.Riskware.TestKey.rA |
Cynet | Malicious (score: 99) |
DrWeb | Android.Siggen.Susp.11505 |
ESET-NOD32 | A Variant Of Android/Spy.Agent.DIL |
Fortinet | Android/Agent.DIL!tr.spy |
Detected | |
Ikarus | Trojan-Spy.AndroidOS.Agent |
K7GW | Spyware ( 005b614c1 ) |
Kaspersky | HEUR.AndroidOS.FakeApp.by |
Microsoft | Spyware/Multiverze |
Sophos | Android Xgen PUA (PUA) |
Symantec Mobile Insight | AdLibrary |
Trustlook | Android.PUA.DebugKey |
WithSecure | Malware.ANDROID/AVE.Evo.brwkd |
ZoneAlarm by Check Point | HEUR.AndroidOS.FakeApp.by |
Android Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="6" android:versionName="1.6.1" android:compileSdkVersion="32" android:compileSdkVersionCodename="12" package="com.example.mydemo" platformBuildVersionCode="32" platformBuildVersionName="12">
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="32"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application android:theme="@style/Theme.Mydemo" android:label="@string/app_name" android:icon="@mipmap/applogosho" android:name="com.example.mydemo.BaseApp" android:allowBackup="true" android:supportsRtl="true" android:fullBackupContent="@xml/backup_rules" android:networkSecurityConfig="@xml/network_security_config" android:appComponentFactory="androidx.core.app.CoreComponentFactory">
<activity android:name="com.example.mydemo.LoginActivity" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name="com.example.mydemo.MainActivity"/>
<activity android:name="com.example.mydemo.ContactActivity"/>
<activity android:name="com.example.mydemo.AlbumActivity"/>
<activity android:name="com.example.mydemo.UploadActivity"/>
<service android:name="com.example.mydemo.servise.UploadService" android:exported="true">
<intent-filter android:priority="1000">
<action android:name="com.example.mydemo.UploadService"/>
</intent-filter>
</service>
<provider android:name="com.luck.picture.lib.basic.PictureFileProvider" android:exported="false" android:authorities="com.example.mydemo.luckProvider" android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/ps_file_paths"/>
</provider>
<service android:name="com.luck.picture.lib.service.ForegroundService" android:enabled="true" android:foregroundServiceType="location"/>
<activity android:theme="@style/Base.Theme.NoActionBar" android:name="com.luck.picture.lib.basic.PictureSelectorSupporterActivity" android:configChanges="screenSize|orientation|keyboardHidden"/>
<activity android:theme="@style/Picture.Theme.Translucent" android:name="com.luck.picture.lib.basic.PictureSelectorTransparentActivity" android:configChanges="screenSize|orientation|keyboardHidden"/>
<meta-data android:name="huawei_module_scankit_local" android:value="1030100"/>
<meta-data android:name="huawei_module_scankit_sdk_version" android:value="scan:1.1.3.301"/>
<meta-data android:name="com.huawei.hms.client.service.name:scan" android:value="scan:1.1.3.301"/>
<meta-data android:name="com.huawei.hms.min_api_level:scan:huawei_module_scankit" android:value="1"/>
<meta-data android:name="com.huawei.hms.min_api_level:scan:hmscore" android:value="1"/>
<activity android:name="com.huawei.hms.hmsscankit.ScanKitActivity" android:screenOrientation="portrait"/>
<provider android:name="androidx.startup.InitializationProvider" android:exported="false" android:authorities="com.example.mydemo.androidx-startup">
<meta-data android:name="androidx.emoji2.text.EmojiCompatInitializer" android:value="androidx.startup"/>
<meta-data android:name="androidx.lifecycle.ProcessLifecycleInitializer" android:value="androidx.startup"/>
</provider>
<meta-data android:name="com.huawei.hms.client.service.name:ml-computer-camera-inner" android:value="ml-computer-camera-inner:1.0.3.340"/>
<meta-data android:name="com.huawei.hms.client.service.name:ml-computer-ha-inner" android:value="ml-computer-ha-inner:1.0.3.340"/>
<meta-data android:name="com.huawei.hms.client.service.name:dynamic-api" android:value="dynamic-api:1.0.13.303"/>
<meta-data android:name="com.huawei.hms.min_api_level:dynamic-api:huawei_module_dynamicloader" android:value="2"/>
<provider android:name="com.huawei.agconnect.core.provider.AGConnectInitializeProvider" android:exported="false" android:authorities="com.example.mydemo.AGCInitializeProvider"/>
<service android:name="com.huawei.agconnect.core.ServiceDiscovery" android:exported="false"/>
<meta-data android:name="com.huawei.hms.client.service.name:ml-computer-vision-base" android:value="ml-computer-vision-base:1.0.0.301"/>
<provider android:name="com.huawei.hms.mlsdk.common.Provider.MLInitializerProvider" android:exported="false" android:authorities="com.example.mydemo.MLInitializerProvider"/>
</application>
</manifest>
Android Permission
권한 | 설명 | 위험성 |
android.permission.INTERNET | 애플리케이션이 인터넷에 액세스할 수 있도록 허용합니다. | 낮음 - 인터넷 연결 자체는 위험하지 않지만, 다른 민감한 데이터와 결합될 경우 데이터 유출의 가능성이 있습니다. |
android.permission.READ_CONTACTS | 사용자의 연락처 데이터를 읽을 수 있습니다. | 높음 - 개인적인 연락처 정보가 외부로 유출될 수 있으며, 피싱 및 스팸에 악용될 수 있습니다. |
android.permission.READ_PHONE_STATE | 전화 상태(전화번호, 네트워크 정보 등)를 읽을 수 있습니다. | 중간 - 사용자의 전화번호와 네트워크 상태 정보가 유출될 수 있으며, 프라이버시 침해가 발생할 수 있습니다. |
android.permission.READ_PHONE_NUMBERS | 사용자의 전화번호를 읽을 수 있습니다. | 중간 - 사용자의 전화번호가 외부로 유출될 수 있으며, 이를 통해 사용자를 식별하거나 스팸에 사용될 수 있습니다. |
android.permission.READ_EXTERNAL_STORAGE | 외부 저장소에 저장된 파일을 읽을 수 있습니다. | 높음 - 사용자의 사진, 문서 등 개인 파일이 유출될 수 있으며, 중요한 데이터가 노출될 위험이 있습니다. |
android.permission.READ_MEDIA_IMAGES | 사용자의 이미지 파일에 액세스할 수 있습니다. | 중간 - 개인 사진이나 스크린샷 등의 이미지 파일이 유출될 수 있습니다. |
android.permission.READ_MEDIA_AUDIO | 사용자의 오디오 파일에 액세스할 수 있습니다. | 중간 - 사용자의 음성 녹음 파일이나 음악 파일 등이 유출될 수 있습니다. |
android.permission.READ_MEDIA_VIDEO | 사용자의 비디오 파일에 액세스할 수 있습니다. | 중간 - 개인 비디오 파일이 유출될 수 있습니다. |
android.permission.READ_SMS | 사용자의 SMS 메시지를 읽을 수 있습니다. | 높음 - 개인적인 메시지 내용이 유출될 수 있으며, 이를 통해 피싱, 스팸, 사기 등이 발생할 수 있습니다. |
android.permission.ACCESS_NETWORK_STATE | 네트워크 연결 상태(예: Wi-Fi, 모바일 네트워크)를 읽을 수 있습니다. | 낮음 - 네트워크 상태 정보 자체는 큰 위험이 없지만, 다른 데이터와 결합될 경우 위험이 증가할 수 있습니다. |
Activities 8 , Services 3, Receivers 0, Providers 4와 15개의 권한을 사용하는 것을 알 수 있습니다.
코드 분석
처음 앱 실행 시 인증 코드를 입력하는 화면이 보인다. 몸캠피싱 공격자가 주는 인증번호를 받아 입력하면 C&C 서버와 통신하여 검증 절차를 거치고 성공하게 되면 다음 행위로 넘어가는것으로 확인되며, 인증에 성공 하게 되면 권한설정 요구하고 권한 체크가 되면 정보 유출을 시작한다. 유출 정보는 sms, 주소록, 갤러리 정보와 기기 정보가 유출된다. 피해자에게 협박하기 위해 연락처와 사진, 영상, sms 정보 등을 수집하는 것으로 보인다.
1. 인증 화면
앱 실행 시 기존에 인증한 사용자인지 sharedPreferences 특정 값을 확인하여 검증 false 경우 인증 화면이 보여준다.
2. 인증 코드 검증
초대 코드를 입력하여 C&C 서버와 통신해 인증 코드 검증 성공시 업로드 화면으로 이동
3. 앱권한 요구 및 정보 유출
권한 체크가 확인되면 SMS, 주소록, 앨범, 기기정보를 유출한다.
4. 정보 유출
하드코딩된 C&C 서버 주소로 수집된 정보 유출
IOC
피싱 페이지 : https://www[.]cloud1one[.]com/
경유 페이지 :https://pgpfs[.]pfilbmje[.]com/api/c/x5qgtwsy
악성앱 다운 페이지 : https://pgsns[.]hedkzeio[.]com/x5qgtwsy
유포지 : https://zz[.]ppa58d[.]cyou/resource/1719015307618481526.apk?sign=9b9a6220b2706a9e005714a065d9b8f5&t=1719140231
정보 유출지 : http://104[.]233[.]167[.]116/prod-api/
MD5: 0ccee71c733015b8830d56c4ccfbe355
SHA-1: 8c8da672abd1ff52dfed393275174a2a57f831eb
SHA-256: 1d4c2f1d1fdf2ea108a6239283021a4a5d7a99c30d61ba497c91530b84aa3966
'play > 분석' 카테고리의 다른 글
[악성 앱] 국민건강보험 사칭 악성앱 분석 (23.12.03) (4) | 2023.12.11 |
---|---|
[악성 앱] 부고장 사칭 스미싱 악성앱 분석 (23.11.26) (17) | 2023.12.02 |
[악성 앱] 정부24 사칭 스미싱 악성앱 분석 (23.11.09) (9) | 2023.11.29 |
[악성 앱] 국민건강보험 사칭 스미싱 악성앱 분석 (23.11.01) (0) | 2023.11.05 |
[악성 앱] 국민건강보험 사칭 스미싱 악성앱 분석 (23.09.04) (2) | 2023.09.04 |