2026년 6월, 한국 보안 기업 Genians Security Center(GSC)는 국내 표적을 노린 스피어피싱 이메일을 포착했다. 메일 제목은 "[긴급] 반복 OTP 생성 관련 보안 점검 안내"였다. 발신지는 마이크로소프트 계정팀처럼 꾸며졌지만, 첨부 ZIP 파일 안에는 LNK 파일이 숨어 있었다. 그 실행 경로 끝에는 NarwhalRAT라는 신형 원격 접속 도구가 대기하고 있었다.
2012년 이후 한국을 집중 표적으로 삼아온 APT37(ScarCruft)의 최신 공격이다. 기존 RoKRAT와 달리 NarwhalRAT는 합법적 클라우드 서비스(pCloud)를 C2 릴레이로 사용하고 30개 이상의 명령을 한국 사용자 환경에 맞춰 구현했다. 이 글에서 짚을 핵심은 세 가지다. 왜 pCloud 경유 구조가 기존 차단 규칙을 무력화하는가, RoKRAT에서 NarwhalRAT로의 진화가 방어자에게 무엇을 의미하는가, 그리고 이 그룹의 어떤 시그니처가 캠페인이 바뀌어도 그대로 남는가다.
APT37 정체
APT37은 MITRE ATT&CK에서 G0067로 분류하는 북한 연계 사이버 간첩 그룹이다. ScarCruft(카스퍼스키), InkySquid(볼렉시티), Reaper, Group123, TEMP.Reaper, Ricochet Chollima 등 여러 별칭으로 불린다. 정찰총국(RGB) 연계로 추정되지만 공식 귀속 확인은 없다.
주표적은 한국 내 탈북자, 언론인, NGO, 정부기관이다. 일본·베트남·중동으로도 작전 반경을 넓혔으나, 코드 문자열과 미끼 문서 언어가 한국어인 점은 일관되게 유지된다. 이 그룹의 분석에서 핵심은 단일 도구가 아니라 패턴이다. 도구는 RoKRAT에서 NarwhalRAT로 갈아탔지만, 표적·미끼 언어·C2 운영 방식이라는 척추는 그대로다. 우리 블로그에서 이미 다룬 APT37 Ruby Jumper USB 에어갭 캠페인과 이번 NarwhalRAT 캠페인은 표적과 기반 인프라를 공유하지만, 침투 경로와 도구가 뚜렷이 다르다.
활동 패턴과 도구 진화
APT37의 운영 시그니처는 세 가지다. 이 세 가지를 알면 새 캠페인이 등장해도 "APT37이라면 이 조합"이라는 식별 틀을 갖게 된다.
스피어피싱 초기 침투: HWP 문서(한국 표준 문서 형식)나 LNK 파일 첨부 이메일로 시작한다. 사회공학 주제는 안보 이슈, 금융 경보, 보안 알림 등 표적 업무 맥락에 맞춰 선택된다. 이번에는 마이크로소프트 OTP 경고를 골랐다. 보안 알림 자체를 미끼로 쓰는 선택은, 경계심 높은 표적일수록 "보안 점검" 메일을 열어볼 것이라는 계산이다.
클라우드 C2 활용: Dropbox(2024), pCloud(2026) 등 합법적 클라우드 서비스를 명령 채널로 쓴다. dead-drop resolver를 통해 실제 C2 주소를 동적으로 교체하므로, 1차 서버가 차단돼도 통신이 유지된다. 이 방식은 악성 트래픽을 정상 SaaS 트래픽 속에 숨긴다. 기업 대부분이 pCloud나 Dropbox 같은 클라우드 도메인을 업무용으로 허용하기 때문이다.
파이썬 기반 로더: 2025년 파이썬 백도어 계열 캠페인 이후 파이썬이 주요 로더 언어로 자리잡았다. NarwhalRAT는 이 파이썬 로더 계열의 최신 구현체로, .cat 확장자로 위장한 파이썬 바이트코드를 사용해 시그니처 기반 정적 분석기가 파이썬 실행 파일로 인식하지 못하게 한다. .cat은 본래 윈도우 보안 카탈로그 파일 확장자라, 시스템 디렉토리에서 흔히 보이는 정상 파일로 묻혀버린다.
이 진화의 핵심은 "탐지 가능한 컴파일 바이너리"에서 "탐지 표면이 분산된 스크립트 로더"로의 전환이다. RoKRAT는 PE 바이너리라 해시·시그니처로 잡혔다. NarwhalRAT는 파이썬 바이트코드를 정상 확장자로 위장하고 메모리에서만 펼치므로, 정적 분석기가 잡을 고정된 실행 파일이 줄어든다. 방어자는 파일 시그니처가 아니라 행위 체인을 봐야 잡을 수 있는 쪽으로 밀린다.
NarwhalRAT 배포 체인 상세
GSC 분석 기준 공격 흐름은 다음과 같다.
LNK 난독화: 악성 단축파일은 CMD 환경변수 부분 문자열 치환(%variable:~position,1%)으로 powershell, curl.exe 등의 문자열을 문자 단위로 재조합한다. 문자열 기반 정적 탐지를 회피하기 위한 것이다.
로더 다단계: LNK가 PowerShell을 호출하면, curl.exe를 %TEMP%uARKK20.exe로 복사한 뒤 KHjWFcsE.bat를 내려받는다. 배치 파일은 Python 3.10 임베디드 패키지를 설치하고, pythonw.exe를 userscreen.exe로 리네임해 지속성을 위한 스케줄러에 등록한다. 정상 파이썬 런타임을 직접 끌어와 쓰는 이 방식은, 악성 실행기를 따로 만들지 않고 신뢰받는 인터프리터에 악성 바이트코드만 얹는다는 점에서 탐지를 한 번 더 비껴간다.
NarwhalRAT 핵심 기능: 30개 이상의 명령 프리픽스를 구현한 원격 접속 도구다. 명령 체계는 크게 네 범주로 구성된다. 원격 명령 실행(cmd:, cmdadm: — 일반 권한과 관리자 권한 구분), 감시(startscap: 화면 캡처·startkcap: 키로깅), 저장 매체 수집(usb2local: USB 파일 복사), 마이크 녹음이다. 각 프리픽스가 권한·수집 대상·전송 방식을 분리 관리하는 구조는 단일 RAT 안에 작전별 모듈을 탑재한 설계를 보여준다. 일반 권한과 관리자 권한 명령을 처음부터 분리한 점은 표적 환경에서 권한 상승 여부에 따라 작전을 나눠 운용하려는 의도로 읽힌다.
한국 특화 설계:
- 작업 디렉토리:
%APPDATA%\naverwhale — 네이버 웨일 브라우저 이름 위장, 숨김+시스템 속성 설정
- KakaoTalk 창(
KakaoTalkEdgeWnd, KakaoTalkShadowWnd)을 창 열거 대상에서 제외해 수집 노이즈 감소
- HWP 미끼 문서와 한국 ISP 기반 C2 릴레이 서버
KakaoTalk 창을 일부러 열거에서 빼는 설계는 단순 위장 이상이다. 공격자가 한국 사용자의 화면에 무엇이 떠 있는지 미리 알고, 불필요한 수집 노이즈를 줄이도록 도구를 다듬었다는 뜻이다. 표적 환경을 직접 써본 개발자가 만든 도구라는 정황 증거다.
빌드 타임스탬프: 2026년 4월 30일 18:07:49 KST — 한국 표준시 기준 야간에 빌드된 점은 공격 캠페인 개시(2026년 6월) 불과 한 달 전까지 개발이 진행됐음을 뜻한다.
pCloud Dead-Drop C2 구조
NarwhalRAT는 C2 주소를 코드에 직접 박지 않는다. 감염 직후 악성코드는 한국 ISP 기반 1차 릴레이 서버(121.254.222.x, 218.150.78.x 대역)에 HTTP 요청을 보낸다. 릴레이 서버는 pCloud의 folderid=와 auth= 파라미터를 반환하고, 악성코드는 이를 이용해 pCloud 폴더에서 실제 명령 서버 주소와 설정값을 내려받는 방식이다.
이 이중 구조가 방어를 어렵게 하는 이유는 차단 지점이 사라지기 때문이다. 전통적 C2 차단은 악성 도메인·IP를 평판 목록에 올려 막는다. 그런데 여기서 실제 명령은 api.pcloud.com이라는 정상 클라우드 도메인에서 나온다. 평판 기반 차단은 pCloud 전체를 막지 않는 한 무력하고, pCloud를 통째로 막으면 정상 업무가 멈춘다. 결국 egress 차단·도메인 평판이라는 1차 방어선이 통째로 비껴간다.
1차 릴레이가 차단돼도 공격자는 pCloud 폴더 내 설정값만 교체하면 된다. 말웨어 재배포 없이 C2를 교체할 수 있다. APT37이 이전에 Dropbox를 C2로 쓰던 방식의 진화형이며, 탐지 우회 의도가 더 정교해졌다. Dropbox 시절에는 클라우드 자체가 명령 저장소였다. NarwhalRAT는 한국 ISP 릴레이를 한 단계 앞에 두어, 분석가가 pCloud 폴더에 도달하기 전에 릴레이라는 관문을 하나 더 통과하게 만들었다.
암호화 설정 파일은 %LOCALAPPDATA%\Microsoft\Internet Explorer\<6자리랜덤>.ent에 AES-128로 저장된다.
대표 캠페인 연대기
각 캠페인에서 APT37은 사회공학 주제와 도구를 바꾸면서도 패턴 두 가지는 유지했다. 첫째, 한국어 HWP 미끼 문서. 둘째, 합법적 클라우드 서비스 기반 C2다. NarwhalRAT 캠페인에서 pCloud dead-drop이 추가된 것은 탐지 회피를 한 단계 더 정교화한 것이다. 도구 이름은 바뀌어도 이 두 축이 유지된다는 점이 곧 "APT37이라면 이 조합"이라는 귀속 단서가 된다.
MITRE ATT&CK 매핑
| 기법 ID | 이름 | NarwhalRAT 구현 |
|---|
| T1566.001 | 스피어피싱 첨부 | MS 계정팀 사칭 이메일 |
| T1204.002 | 악성 파일 실행 | ZIP → LNK |
| T1059.001 | PowerShell | 환경변수 난독화 |
| T1140 | 파일 난독화 해제 | 문자열 부분 치환 |
| T1059.006 | Python | .cat 바이트코드 |
| T1053.005 | 스케줄러 지속성 | userscreen.exe 등록 |
| T1055 | 프로세스 인젝션 | 인메모리 PE 로드 |
| T1102.002 | 웹 서비스 C2 | pCloud dead-drop |
| T1056.001 | 키로깅 | naverwhale 저장 |
| T1113 | 화면 캡처 | startscap: 명령 |
탐지 관점
APT37 NarwhalRAT가 남길 수밖에 없는 흔적은 다음과 같다. 핵심은 파일 시그니처가 흐려진 만큼, 행위 체인과 위장의 결함이 가장 신뢰할 만한 단서가 된다는 점이다.
비정상 프로세스 트리: cmd.exe → powershell.exe(ExecutionPolicy Bypass) → curl.exe(비표준 경로 복사) → userscreen.exe(pythonw.exe 리네임) 순의 실행 체인이 EDR에 기록된다. curl.exe를 %TEMP% 아래 임의 이름으로 복사하는 동작은 정상 사용 패턴과 다르다.
스케줄러 등록: schtasks를 통한 userscreen.exe 지속성 등록(T1053.005). 등록 경로 C:\Users\Public\AccountPictures\UserInerfacePicture는 정상처럼 위장하지만 철자 오류(UserInerfacePicture)로 식별 가능하다. 공격자의 위장은 완전하지 않다. 정상 경로(UserInterfacePicture)를 흉내 냈으나 철자를 틀렸고, 이 한 글자 차이가 룰 작성의 고정점이 된다.
네트워크 패턴: api.pcloud[.]com을 향한 folderid=·auth= 파라미터 포함 HTTP 요청이 일반 트래픽에 섞인다. 한국 ISP IP 대역(121.254.222.x, 218.150.78.x)으로의 비정상 연결도 탐지 지점이다. pCloud 도메인 자체는 정상이므로, 평판이 아니라 요청 파라미터 패턴과 1차 릴레이 IP의 조합이 식별의 축이 된다.
파일 흔적: %LOCALAPPDATA%\Microsoft\Internet Explorer\ 경로의 .ent 암호화 설정 파일, %APPDATA%\naverwhale 디렉토리(숨김+시스템 속성).
Genians GSC 보고서에 공개된 IOC(naverwhale 디렉토리·pCloud API 패턴·릴레이 IP 대역)는 국내 보안팀이 방화벽·EDR·SIEM 정책에 곧바로 적용할 수 있는 형태다. NarwhalRAT는 네이버 웨일·KakaoTalk 등 한국 환경 고유 소프트웨어를 코드에 직접 참조한다. 이 캠페인의 표적이 국내 보안팀이 방어하는 바로 그 환경임을 확인시켜 주는 증거다. APT37이 pCloud라는 새 인프라를 채택한 이상, 기존 Dropbox 기반 차단 규칙만으로는 이 캠페인을 포착할 수 없다. 도메인 평판에 의존하는 차단 전략을 쓰는 국내 환경이라면, 정상 SaaS를 경유하는 이 dead-drop 방식이 정확히 그 빈틈을 노린다는 점을 전제로 탐지 축을 행위 체인 쪽으로 옮겨야 한다.
참고 자료
관련 글 더 보기
안내 및 법적 고지
AI 활용 안내
이 글은 AI(Claude)의 도움을 받아 작성되었습니다.
인용된 통계와 사례는 참고 자료에 명시된 출처에 근거하며, 설명을 위한 일부 표현은 각색되었습니다.
면책 조항
본 글은 보안 인식 제고를 위한 교육 목적으로 작성되었습니다.
언급된 공격 기법을 실제로 시도하는 행위는 「정보통신망법」, 「형법」 등에 따라
처벌받을 수 있으며, 본 블로그는 이에 대한 법적 책임을 지지 않습니다.