Pengha Talk (ml_level) 상세 분석 보고서

펭하톡 (PenghaTalk) Quantum-Nano Analysis Report

Version: v2.0 (2026-04-21 2차 인프라 발견 추가)

Analyst: [비공개], ArkLink Inc.

Date: 2026-03-25 (v1.0) / 2026-04-21 (v2.0 Section 15 추가)

Classification: CONFIDENTIAL — Security Research (Victim Relief)

Organization: ArkLink Co., Ltd. (378-88-03382)

1. Executive Summary

펭하톡(PenghaTalk)은 카카오톡 펭귄 캐릭터("펭수")를 모방한 메신저 위장 악성앱으로, wavegrid 패밀리에 속한다. 초대코드 기반 접근 통제, RuoYi 3.8.5 C2 백엔드, Cloudflare 프록시를 결합하여 연락처 전체 탈취 및 갤러리 이미지 무단 전송을 수행한다. 현재까지 40개 유효 초대코드가 발견되었으며, 이는 최소 40명의 피해자가 존재함을 의미한다. 피해자 3명(이름이름, 하암하암, 코이루)의 증거 219장이 확보되었다.

Threat Level: CRITICAL

Family: wavegrid

Kill Chain: 배포(CloudFront CDN) → 초대코드 인증 → 권한 획득 → 연락처/이미지 탈취 → C2 전송

2. Target Application — 정적 분석 기본 정보

2.1 APK Metadata

항목 · 값

**파일명** · 260324_펭하톡.apk

**파일 크기** · 20,469,851 bytes (19.52 MB)

**패키지명 (Manifest)** · com.uxybcxps.xvsyjkds

**실제 패키지명** · com.peucnfin.ubdgtwzpd

**앱 이름** · 펭하톡

**버전** · 1.22.8 (versionCode: 1228)

**minSdkVersion** · 29 (Android 10)

**targetSdkVersion** · 34 (Android 14)

**언어** · Kotlin + Java (혼합)

**빌드 도구** · apktool 2.9.3

**디버깅** · debuggable: false

2.2 Permissions (7개 핵심 + 1개 커스텀)

권한 · 위험도 · 목적

`READ_CONTACTS` · **CRITICAL** · 연락처 전체 탈취

`READ_PHONE_STATE` · HIGH · 기기/통신사 정보 수집

`READ_PHONE_NUMBERS` · HIGH · [피해자 정보 비공개] 수집

`READ_MEDIA_IMAGES` · **CRITICAL** · 갤러리 이미지 전체 탈취

`READ_MEDIA_VIDEO` · HIGH · 동영상 접근 (미사용 가능)

`READ_EXTERNAL_STORAGE` · HIGH · Android 12 이하 호환

`INTERNET` · MEDIUM · C2 통신

`DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION` · LOW · 커스텀 시그니처 권한

wavegrid 패밀리 특성: 최소 권한 세트(7개)로 최대 탈취 효과 달성. virbox_sens(4~12개), frezrik_jiagu(15개)와 대비됨.

2.3 Application Architecture

컴포넌트 · 수량 · 설명

**Activities (총)** · 337개 · Manifest 선언 기준

**실제 Activity** · ~5개 · LoginActivity, HomeActivity + 유틸리티

**더미 Activity** · ~332개 · 6개 난독화 패키지에 분산

**smali 디렉토리** · 2개 · smali/ + smali_classes2/

**Native Libraries** · libmmkv.so (4 ABI) · arm64-v8a, armeabi-v7a, x86, x86_64

2.4 더미 Activity 난독화 전략 (332개)

패키지 · 파일 수 · 용도

`bcjqyniafoqbihe` · 678 · 더미 Activity + 내부 클래스

`cpxjtxqpjjpsrkhehahb` · 633 · 더미 Activity + 내부 클래스

`dbfyurjpogqzsqnspd` · 553 · 더미 Activity + 내부 클래스

`utpibhqqkjrhkcbftodxljcyo` · 0* · smali_classes2에 존재 가능

`uowavatbgxmmlwak` · 0* · smali_classes2에 존재 가능

`zvsrjgzrntrzjkdcnmt` · 0* · smali_classes2에 존재 가능

> *smali_classes2에 추가 더미 패키지 7개 존재: tbqbrkcreminpyeexbjg, yakzfqfctayxlcwxuybltt, zynqezzefnbspewxrmawyzp 등

모든 더미 Activity 클래스명은 20~30자 랜덤 소문자 문자열로 구성되어, 정적 분석 도구의 코드 탐색을 방해한다. 이는 wavegrid 패밀리 전형적 특성으로, LOVENSE/DDU/ML 앱에서 동일 패턴이 확인된다.

3. C2 Server Intelligence

3.1 C2 Infrastructure

항목 · 값

**C2 Domain** · [비공개]

**IP Addresses** · [비공개]

**CDN/Proxy** · Cloudflare (phishing warning 활성)

**Framework** · RuoYi v3.8.5 (若依)

**System Title** · 个人网盘管理系统 (Personal Cloud Storage Management)

**API Prefix** · [비공개]

**Captcha** · 활성 (msg locale: Korean "접속오류!")

**CORS** · Vary 헤더 있으나 명시적 Allow-Origin 없음

3.2 도메인 패턴 분석

[비공개] — wavegrid 패밀리 전형적 도메인 생성 규칙:

· 영숫자 랜덤 문자열 (28자)

· .monster TLD (저가 도메인, 빠른 교체)

· Cloudflare 프록시로 실제 서버 IP 은폐

동일 패턴 확인:

· [비공개] (LOVENSE 패밀리)

· [비공개] (LOVENSE 패밀리)

· [비공개] (LOVENSE 패밀리)

3.3 확인된 취약점

V1: .html 접미사 인증 우회 (HIGH)

```

GET [비공개] → 인증 없이 접근

GET [비공개] → 인증 없이 접근

```

테스트된 키 17개:

· sys.index.skinName, sys.user.initPassword, sys.account.captchaEnabled

· sys.account.registerUser, sys.upload.path, sys.profile

· sys.oss.bucket/endpoint/accessKey/secretKey

· sys.sms.accessKey/secretKey, sys.wx.appid/secret

· sys.pay.key, sys.jwt.secret

결과: 모든 키 code:200 반환, msg:'' (비어있거나 미설정). 운영자가 기본값을 변경하지 않았거나 해당 설정을 사용하지 않는 것으로 판단.

V2: Druid 모니터링 콘솔 노출 (HIGH)

```

[비공개] → 로그인 페이지 접근 가능

```

Druid 데이터 API는 인증 필요(302 redirect). 하지만 로그인 페이지 자체가 노출되어 브루트포스 공격 벡터 존재.

V3: [비공개] API 문서 공개 노출 (MEDIUM)

```

[비공개] → 4419 bytes JSON 문서

[비공개] → [비공개] 리소스 목록

```

노출된 API 엔드포인트:

Method · Endpoint · 목적

GET · /dev-api/test/user/list · 테스트 사용자 목록

POST · /dev-api/test/user/save · 테스트 사용자 생성

PUT · /dev-api/test/user/update · 테스트 사용자 수정

GET · /dev-api/test/user/{userId} · 사용자 상세

DELETE · /dev-api/test/user/{userId} · 사용자 삭제

UserEntity 구조: userId(int), username(string), password(string), mobile(string)

> 모든 test API는 현재 401(인증 필요) 상태이나, 문서 자체가 내부 데이터 모델을 노출함.

V4: Error Oracle (LOW)

· NumberFormatException → Long/Integer 경로 파라미터 타입 노출

· Request method 'GET' not supported → POST-only 엔드포인트 식별 가능

3.4 엔드포인트 분류

인증 불필요 (GET):

· `[비공개]

· `[비공개]

· `[비공개]

· `[비공개]

· `[비공개]

· `[비공개]

인증 필요 (401):

· [비공개], [비공개]

· `[비공개]

· `[비공개]

· `[비공개]

POST 전용:

· [비공개], [비공개]

4. Data Exfiltration Structure

4.1 Kill Chain

```

[1] 피해자가 초대코드 입력

→ LoginActivity.goToNext(uuid, inviteCode)

→ POST [비공개] {name: inviteCode, cId: uuid}

[2] code:200 수신 시 HomeActivity 전환

[3] 권한 요청 → READ_CONTACTS, READ_PHONE_STATE, READ_MEDIA_IMAGES 등

[4] 연락처 수집 (StatusUtils.getContact)

→ CollectBeanDTO {name, number} 리스트 생성

→ Gson.toJson() 직렬화

[5] 연락처 전송

→ POST [비공개]

→ Body: {userName, model:"android", bjPhone, operatorName, phoneContent: JSON}

[6] 갤러리 이미지 수집 (StatusUtils.getAlbum)

→ InfoBeanDTO {displayName, path, content, date, type}

→ Luban 라이브러리로 JPEG 압축

[7] 이미지 업로드

→ multipart POST [비공개]

→ field: "file", other_field: "yuvaluejing"

```

4.2 데이터 수집 DTO

CollectBeanDTO (연락처):

```java

public class CollectBeanDTO {

public String name; // 연락처 이름

public String number; // 전화번호

}

```

InfoBeanDTO (이미지/미디어):

```java

public class InfoBeanDTO {

public String displayName; // 파일명

public String path; // 파일 경로

public String content; // 콘텐츠

public String date; // 날짜

public String type; // MIME 타입

}

```

4.3 서버 응답 구조

RpoBean (응답):

```kotlin

data class RpoBean(

val msg: String, // "접속오류!" (한국어 에러)

val code: Int // 200 = 성공

)

```

4.4 탈취 데이터 볼륨 추정

데이터 유형 · 평균 피해자 1명당 · 40명 추정

연락처 · 500~1000건 · 20,000~40,000건

이미지 · 2000~5000장 · 80,000~200,000장

전화번호 · 1건 (본인) · 40건

통신사 정보 · 1건 · 40건

5. Defense Mechanism Analysis

5.1 확인된 방어기제

방어기제 · 상태 · 분석

**에뮬레이터 탐지** · 없음 · wavegrid 패밀리 특성 — virbox_sens와 대비

**루팅 탐지** · 없음 · 별도 체크 로직 미발견

**SSL Pinning** · 없음 · `buildUnsafeOkHttpClient`로 모든 인증서 신뢰

**디버그 탐지** · 없음 · debuggable=false이나 안티디버그 로직 부재

**코드 난독화** · **활성** · 332개 더미 Activity, 랜덤 패키지명

**Cleartext Traffic** · **허용** · `cleartextTrafficPermitted="true"`

**MMKV 저장소** · 활성 · 키: INVITECODE, ISUPLOAD, UUIDVALUE, IFFIRST

5.2 SSL/TLS 보안 분석

Critical Finding: buildUnsafeOkHttpClient — 모든 SSL 인증서를 무조건 신뢰하는 TrustManager 구현.

```

HttpUtil$buildUnsafeOkHttpClient$trustAllManager$1

implements: [비공개].ssl.X509TrustManager

→ checkClientTrusted: NO-OP

→ checkServerTrusted: NO-OP

→ getAcceptedIssuers: empty array

```

이는 MITM(Man-in-the-Middle) 공격에 완전 취약하며, 네트워크 보안 설정(cleartextTrafficPermitted="true")과 결합하여 평문 통신도 허용한다.

5.3 난독화 효과 평가

· 정적 분석 방해 수준: 중간 (더미 Activity가 코드 검색을 방해하나, 실제 로직은 smali_classes2에 집중)

· 동적 분석 방해 수준: 낮음 (에뮬레이터/루팅 탐지 없음)

· 결론: 분석가가 smali_classes2의 util/, view/ 패키지를 식별하면 전체 로직 파악 가능

6. Network Protocol Analysis

6.1 통신 프로토콜

항목 · 값

**프로토콜** · HTTPS (SSL 검증 비활성)

**HTTP 클라이언트** · OkHttp3

**데이터 형식** · JSON (Gson), Multipart (이미지)

**비동기 패턴** · `postAsync`, `uploadAsync` (콜백 기반)

**이미지 압축** · Luban 라이브러리 (JPEG, 100KB 이하 목표)

6.2 API Endpoint 매핑

Method · Endpoint · 용도 · 인증

POST · `[비공개] · 초대코드 로그인 · 없음

POST · `[비공개] · 연락처 전송 · 세션 기반

POST · `[비공개] · 이미지 업로드 · 세션 기반

GET · `[비공개] · 캡챠 이미지 · 없음

POST · `[비공개] · 관리자 로그인 · 캡챠

6.3 요청/응답 구조

로그인 요청:

```json

POST [비공개]

Content-Type: application/json

{

"name": "<invite_code>",

"cId": "<uuid>"

}

```

연락처 전송 요청:

```json

POST [비공개]

Content-Type: application/json

{

> [비공개]

"model": "android",

"bjPhone": "<victim_phone_number>",

"operatorName": "<carrier_name>",

"phoneContent": "[{\"name\":\"홍길동\",\"number\":\"010-**-**\"}, ...]"

}

```

이미지 업로드 요청:

```

POST [비공개]

Content-Type: multipart/form-data

· file: <compressed_image_file>

· other_field: "yuvaluejing"

```

> [비공개]

7. Invitation Code System

7.1 초대코드 메커니즘

```

LoginActivity

└→ init(): MMKV에서 IFFIRST 확인

├→ true: 이미 로그인 → startUp() → HomeActivity

└→ false: 초대코드 입력 대기

└→ 사용자 입력 → goToNext(uuid, mCode)

└→ POST [비공개]

├→ code:200 → MMKV 저장 + HomeActivity

└→ code:!200 → 에러 표시

```

MMKV 저장 키:

· INVITECODE: 사용된 초대코드

· UUIDVALUE: 기기 고유 UUID

· IFFIRST: 최초 로그인 여부 (boolean)

· ISUPLOAD: 업로드 완료 여부

7.2 발견된 유효 초대코드 (40개)

사전 분석에서 40개 유효 초대코드가 확인됨 — 각 코드는 고유 피해자를 대표.

마스터 코드: avau (관리용 추정)

7.3 피해 규모 추정

지표 · 값

유효 초대코드 · 40개

확인된 피해자 · 3명 (이름이름, 하암하암, 코이루)

피해 증거 · 219장 (스크린샷/대화록)

추정 피해자 · 최소 40명

8. Distribution Infrastructure

8.1 배포 경로

항목 · 값

**CDN** · Amazon CloudFront

**배포 URL** · [비공개]

**배포 방식** · 직접 APK 다운로드 (사이드로딩)

**타겟** · Android 10+ (minSdk 29)

8.2 CloudFront CDN 분석

Amazon CloudFront를 배포 인프라로 활용하는 것은 wavegrid 패밀리의 진화된 배포 전략:

· 글로벌 엣지 네트워크로 빠른 다운로드

· AWS 인프라 → 도메인 차단이 어려움 (부수적 피해 우려)

· 랜덤 경로(a4hctpz1)로 URL 예측 방지

· HTTPS 기본 제공으로 신뢰감 조성

8.3 다국어 지원 (15개 언어)

앱 UI는 한국어가 주요 타겟이나, 배포 인프라는 15개 언어를 지원하여 국제적 운영 가능성을 시사. wavegrid 패밀리의 글로벌 확장 의도로 해석됨.

9. Wavegrid Family Correlation

9.1 패밀리 식별 증거

지표 · 펭하톡 · LOVENSE · ML(YLOVE)

**C2 Framework** · RuoYi 3.8.5 · RuoYi 3.8.5 · RuoYi 3.8.5

**System Title** · 个人网盘管理系统 · 个人网盘管理系统 · 个人网盘管理系统

**API Prefix** · [비공개] · [비공개] · [비공개]

**Login Endpoint** · /webapp/login · /webapp/login · /webapp/login

**Contact Exfil** · /webapp/saveAddressBook · /webapp/saveAddressBook · /webapp/saveAddressBook

**Image Upload** · /webapp/image/{code} · /webapp/image/{code} · /webapp/image/{code}

**Auth Token** · yuvaluejing · yuvaluejing · yuvaluejing

**minSdkVersion** · 29 · 29 · 29

**초대코드** · 있음 · 있음 · 있음

**MMKV** · v1.3.4 · v1.3.x · v1.3.x

**더미 Activity** · 332개 · 340개+ · 300개+

**SSL Bypass** · TrustAll · TrustAll · TrustAll

9.2 빌드 시스템 동일성

· Kotlin + Java 혼합 빌드

· OkHttp3 + Gson + Luban 동일 라이브러리 조합

· MMKV 키 이름 동일 (INVITECODE, UUIDVALUE, IFFIRST, ISUPLOAD)

· AppValue.kt에 C2 URL 하드코딩하는 동일 패턴

· HttpUtil.kt의 buildUnsafeOkHttpClient 동일 구현

· StatusUtils.java의 getContact(), getAlbum() 동일 구조

· CollectBeanDTO, InfoBeanDTO, RpoBean 동일 데이터 클래스

9.3 차이점

항목 · 펭하톡 · LOVENSE

**도메인 TLD** · .monster · .online

**Manifest 패키지** · com.uxybcxps.xvsyjkds · com.astreon.lumisphere

**실제 패키지** · com.peucnfin.ubdgtwzpd · com.astreon.lumisphere

**앱 위장** · 펭귄 메신저 · 성인 메신저

**배포** · CloudFront · 직접 URL

> 핵심 결론: 동일 빌드 시스템에서 패키지명/도메인/UI만 교체한 대량 생산형 악성앱.

10. Victim Evidence Analysis

10.1 [피해자 정보 비공개]

[피해자 정보 비공개] · 증거 유형 · 상태

**이름이름** · 스크린샷/대화록 · 증거 확보

**하암하암** · 스크린샷/대화록 · 증거 확보

**코이루** · 스크린샷/대화록 · 증거 확보

총 219장의 피해 증거 확보. 각 증거는 apk/260324_펭하톡/victim_evidence/ 디렉토리에 분류 저장.

10.2 피해 유형 분석

펭하톡의 피해 체인:

1. 스미싱/피싱 메시지 → 피해자에게 "펭하톡" 메신저 설치 유도

2. 초대코드 배포 → 각 피해자에게 고유 초대코드 전달

3. 권한 획득 → 연락처, 갤러리, 전화번호 권한 요청

4. 데이터 탈취 → C2 서버로 전체 연락처 + 전체 이미지 전송

5. 협박/사기 → 탈취된 데이터를 이용한 2차 범죄

11. Penetration Timeline (Phase 1~10)

Phase 1: 정적 분석 초기화 (2026-03-24)

· APK 디컴파일 (apktool 2.9.3)

· AndroidManifest.xml 분석 — 337개 Activity, 7개 권한

· 패키지명 이중 구조 발견 (Manifest vs 실제)

Phase 2: 더미 Activity 식별 (2026-03-24)

· 332개 더미 Activity 분류

· 6개 난독화 패키지 매핑

· 실제 로직: smali_classes2/view/ (LoginActivity, HomeActivity)

Phase 3: C2 URL 하드코딩 발견 (2026-03-24)

· AppValue.kt → [비공개]

· wavegrid 패밀리 확인 (yuvaluejing 토큰)

Phase 4: C2 서버 스캔 (2026-03-24)

· RuoYi 3.8.5 확인

· .html 인증 우회 취약점 테스트

· [비공개] API 문서 확보

Phase 5: [비공개] API 분석 (2026-03-24)

· v2 API docs 4419 bytes 수집

· test-controller 5개 엔드포인트 매핑

· UserEntity 데이터 모델 확인

Phase 6: Druid 콘솔 확인 (2026-03-24)

· /druid/login.html 접근 가능

· JSON API는 인증 필요 (302 redirect)

Phase 8: 에뮬레이터 동적 분석 (2026-03-24)

· 앱 설치 및 실행 (DeepCoding_API35)

· LoginActivity UI 캡처

· logcat 수집 (런타임 동작 확인)

· MMKV 빈 상태 확인 (초대코드 미입력)

Phase 9: 초대코드 체계 분석 (2026-03-24)

· 40개 유효 초대코드 발견

· avau 마스터 코드 식별

Phase 10: [피해자 정보 비공개] 정리 (2026-03-25)

· 3명 피해자 219장 증거 분류

· wavegrid 패밀리 상관관계 최종 확인

12. Applied Techniques & Technique Review

12.1 적용된 기법

코드 · 기법 · 결과

T001 · APK 디컴파일 (apktool) · 성공 — 전체 smali 추출

T002 · Manifest 분석 · 성공 — 337 Activity, 7 권한

T003 · smali 코드 분석 · 성공 — C2 URL, API 구조 해독

T004 · 문자열 검색 (hardcoded URL) · 성공 — AppValue.kt에서 C2 도메인

T010 · C2 서버 스캔 · 성공 — RuoYi 3.8.5, 4개 취약점

T011 · [비공개] API 수집 · 성공 — 5개 test 엔드포인트

T012 · .html 접미사 인증 우회 · 성공 — 17개 configKey 테스트

T015 · 에뮬레이터 동적 분석 · 성공 — UI 캡처, logcat

T020 · wavegrid 패밀리 패턴 매칭 · 성공 — 100% 일치

T025 · MMKV 분석 · 성공 — 빈 상태 확인

T030 · SSL/TLS 분석 · 성공 — TrustAll 취약점

T040 · 초대코드 열거 · 성공 — 40개 유효 코드

12.2 기법 점검 출력

```

기법 점검:

· 시도한 기법: T001, T002, T003, T004, T010, T011, T012, T015, T020, T025, T030, T040

· 확장된 기법: T012 (.html bypass를 17개 configKey로 확장)

· 신규 기법: 없음 (wavegrid 기존 패턴과 동일)

· 한계 발견: T012 — 모든 configKey가 비어있거나 미설정, 실질적 데이터 유출 없음

```

12.3 혁신 점검

```

혁신 점검:

· 새 아이디어/시도: .monster TLD의 Cloudflare 피싱 경고 상태에서 C2 스캔

· 결과: 성공 — Cloudflare 피싱 경고에도 불구하고 API 정상 응답

· 기법 카탈로그 반영: 해당 없음 (기존 패턴)

· 다음 앱에서 시도할 아이디어: CloudFront CDN 배포 경로 역추적

```

13. IOC (Indicators of Compromise) Master List

13.1 Domains & URLs

IOC · 유형 · 설명

`[비공개]` · C2 Domain · 메인 C2 서버

`[비공개]` · Distribution · APK 배포 CDN

`[비공개] · Distribution URL · 직접 다운로드 경로

13.2 IP Addresses

IP · Provider · 용도

[비공개] · Cloudflare · C2 프록시

[비공개] · Cloudflare · C2 프록시

13.3 Packages & Hashes

IOC · 유형

`com.uxybcxps.xvsyjkds` · Manifest Package

`com.peucnfin.ubdgtwzpd` · Real Package

APK SHA-256: (계산 필요) · File Hash

13.4 API Endpoints

Endpoint · 용도

`[비공개] · 초대코드 인증

`[비공개] · 연락처 탈취

`[비공개] · 이미지 탈취

`[비공개] · 관리자 캡챠

`[비공개] · 관리자 로그인

`[비공개] · [비공개] 문서

`[비공개] · Druid 콘솔

13.5 Hardcoded Strings

문자열 · 위치 · 용도

`yuvaluejing` · HomeActivity.smali · 이미지 업로드 인증 토큰

`INVITECODE` · AppValue.kt · MMKV 초대코드 키

`UUIDVALUE` · AppValue.kt · MMKV UUID 키

`IFFIRST` · AppValue.kt · 최초 실행 플래그

`ISUPLOAD` · AppValue.kt · 업로드 완료 플래그

`접속오류!` · C2 응답 · 한국어 에러 메시지

13.6 Libraries & Dependencies

라이브러리 · 버전 · 용도

OkHttp3 · - · HTTP 통신

Gson · - · JSON 직렬화

MMKV · v1.3.4 · 키-값 저장소

Luban · - · 이미지 압축

Kotlin Coroutines · - · 비동기 처리

AndroidX · - · UI 프레임워크

14. Conclusions & Recommendations

14.1 위협 평가

전체 위협 등급: CRITICAL

· 연락처 전체 탈취 → 2차 피싱/협박에 악용

· 갤러리 이미지 전체 탈취 → 사생활 침해, 협박 소재

· 40명 이상 [피해자 정보 비공개] → 조직적 범죄

· wavegrid 패밀리 → 대량 생산 체계, 지속적 변종 생성

14.2 [피해자 정보 비공개] 권고

1. 즉시 권한 회수: 설정 → 앱 → 펭하톡 → 권한 전체 해제

2. 앱 삭제: 즉시 삭제 후 기기 초기화 권장

3. 연락처 변경 통보: 연락처에 등록된 모든 사람에게 피싱 주의 경고

4. 금융 모니터링: 탈취된 정보를 이용한 금융 사기 주의

5. 경찰 신고: 사이버수사대에 증거 제출

14.3 C2 차단 권고

1. Cloudflare 피싱 신고 (이미 경고 상태)

2. .monster 도메인 레지스트라 신고

3. AWS CloudFront 배포 경로 차단 요청

4. KISA(한국인터넷진흥원)에 도메인/IP 차단 요청

15. v2.0 추가 — 2차 인프라 발견 (2026-04-21)

15.1 발견 계기

사용자 제공 URL 리스트 조사 중 [비공개] 항목이 "펭하톡"으로 표기됨. 기존 v1.0 보고서의 C2(.monster Cloudflare) 및 배포([비공개])와 완전히 다른 제3 인프라.

15.2 인프라 토폴로지

```

[비공개] (CNAME)

→ [비공개] (CNAME)

→ [비공개] (Moren CDN origin, 중국)

```

· SSL 인증서: Let's Encrypt R13, CN=*.[비공개] 와일드카드, 2026-03-28 신규 발급 (23일 전)

· HTTP 응답: HTTP/1.1 200 OK, Server: nginx, Content-Length: 79423, Last-Modified: 2026-04-21 10:21:04 GMT (오늘 갱신 — 살아있는 인프라)

· HSTS + QUIC/h3 활성 (modern nginx 설정)

15.3 콘텐츠 — Webpack SPA + 런타임 C2 복호화

· Bundle: webpackChunkmy_project (Vue/React 계열 SSR)

· Title: "loading"

· Axios v1.12.2 포함

· window.data_char = 암호화 설정 문자열 257자 (42개 고유 codepoint)

· window.data_ver = '1.0'

구분자 패턴 (codepoint 기반):

· ©§© (A9 A7 A9) = 필드 구분자

· ±Ð© (B1 D0 A9) = 키=값 구분자

· Ö§© (D6 A7 A9) = 레코드 구분자

SUB 0x80 heuristic 부분 복호화 시도:

```

"p)qcdell~d)1P)frjrmmg%he)')qe|x{rc%he)')o:=8xnmc{y:hh8%hgd~omyde\x7f%en\x7f)V'...

```

부분 ASCII 근사 복호화만 얻어짐 — 완전 복호화는 webpack 번들 내 복호화 함수 실행 필요 (Frida WebView hook 또는 Chrome DevTools sourcemap).

15.4 🔴 a4hctpz1 캠페인 ID 교차 앵커

동일 a4hctpz1 경로 segment가 두 완전히 다른 인프라에 공유됨:

· `[비공개] (APK 배포 CloudFront — v1.0 Section 8에서 이미 확인)

· `[비공개] (Moren CDN 중국 — v2.0 신규 발견)

이는 yuvaluejing급 교차 앵커. 운영자가 단일 캠페인 ID로 다중 인프라 운영:

· AWS CloudFront: 글로벌 APK 배포 (한국 유입 거부 어려움)

· Moren CDN: 중국/아시아 live SPA 서빙 + WeChat 사용자 라우팅

15.5 신규 기법 NW-031 등재

Webpack-Encrypted C2 Frontend (WeCF):

· APK는 SPA URL만 하드코딩 (정적 분석에 C2 노출 X)

· SPA HTML 내 window.data_char 암호화 설정 런타임 복호화

· 복호화 결과 = 실제 C2 엔드포인트

· AppValue.kt 하드코딩 방식 대비 진화된 은닉

URL 경로 시그니처 = [비공개]]{8}} (sagwp [비공개] + GalleryVault Pro Key [비공개] 교차 확인).

15.6 신규 IOC

IOC · 유형 · 비고

`[비공개]` · 도메인 · 2차 C2 프론트엔드

`*.[비공개]` · SSL 와일드카드 · 2026-03-28 Let's Encrypt

`[비공개]` · 루트 도메인 · CNAME chain 기원

`[비공개]` · CNAME 중간 · Moren CDN 경유

`[비공개]` · CDN 업체 · Moren CDN (摩仁CDN, 중국)

`[비공개]` · IP · CDN origin

15.7 v2.0 업데이트 항목

· apps.json pengha_talk.c2Server 필드: Cloudflare(.monster) + 2차 Moren CDN(sagwp) 병기

· apps.json pengha_talk.crossReferences: cloudfront_a4hctpz1_distribution 교차 항목 추가

· apps.json pengha_talk.summary: 2026-04-21 2차 인프라 발견 기록

· technique-master.js NW-031 등재 (249→250 techniques)

· data-embedded.js sync

15.8 권고

1. Frida 동적 분석: DeepCoding_API35 에뮬레이터에서 [비공개] URL을 WebView에 로드하는 APK 변종 확인

2. window.data_char 복호화 시점 JavaScript hooking 스크립트 작성

3. Moren CDN([비공개]) 추가 운영자 도메인 스윕 (CT logs)

4. KISA에 [비공개] / [비공개] 차단 요청

15.9 OPSEC 준수 (v2.0 probing)

· GET 요청 1회 (79KB HTML 취득)

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