상세 컨텐츠

본문 제목

스틸러·RAT·랜섬웨어를 결합한 복합 위협 악성코드 분석 - MoscowTeam_Steal

악성코드 분석 리포트

by 알약4 2026. 5. 20. 15:42

본문

[이미지] 생성형 AI 제작

 

 

최근 스틸러(Stealer), 원격 제어(RAT), 랜섬웨어(Ransomware) 기능을 하나의 바이너리에 통합한 복합형 악성코드가 발견되었습니다. 

 

해당 악성파일 내부에는 "MoscowTeam_Steal"이라는 자체 워터마크가 포함되어 있으며, 아직 공개된 위협 인텔리전스 데이터베이스에 등록되지 않은 미공개 맞춤형(Custom) 악성코드로 확인되었습니다. 

 

감염된 PC의 계정 정보 및 암호화폐 지갑 탈취부터 파일 암호화까지 자동으로 수행하는 정교한 공격 구조를 갖추고 있어 각별한 주의가 필요합니다.

 

공격 흐름

 

전체 공격은 드로퍼 실행 → 데이터 탈취 → 봇넷 등록 및 파일 암호화 순서로 자동 진행되며, 실행 후 시스템 정보 탈취와 암호화가 모두 완료됩니다.

 

1) 드로퍼 실행 - 파일리스 로딩 (Fileless Loading)

악성코드는 최초 실행파일(드로퍼)과 내부 PE(봇)로 구성된 2단계 아키텍처를 사용하여 실제 악성 기능을 내부에 ChaCha20-IETF 2계층 암호화 + Base64로 이중으로 암호화하여 저장하고 있습니다.

실행 시 내부 PE를  메모리에서 복호화한 뒤 리플렉티브 PE 로딩(Reflective PE Loading) 방식으로 디스크에 파일을 남기지 않고 직접 실행합니다.

💡 참고하세요

리플렉티브 로딩(Reflective Loading) 이란?

일반적으로 프로그램을 실행하려면 디스크에 파일이 저장되어야 합니다. 리플렉티브 로딩은 이 과정을 우회하여 파일을 디스크에 저장하지 않고 메모리에서 직접 실행하는 기법입니다. 디스크에 흔적을 남기지 않아 파일 기반 보안 탐지를 어렵게 만듭니다. 

 

2) 스틸러 실행 - 데이타 탈취

내부 PE가 실행되면 감염PC에 대한 데이터 수집이 즉시 시작되며, 브라우저 자격증명, 암호화폐 지갑, 메신저 데이터가 수집되어 C2 서버로 전송됩니다.

 

분류 탈취 대상
브라우저 Microsoft Edge, Chrome, Chromium, Torch, Elements Browser, Firefox, SeaMonkey
암호화폐 지갑 Bitcoin Core, Litecoin, Dogecoin, DashCore, Ethereum, Monero, Exodus, Electrum, Electrum-LTC, Guarda, Atomic, Coinomi, WalletWasabi, TrustWallet
메신저 Discord, DiscordCanary, DiscordPTB, Lightcord, Signal, Element, Telegram
시스템 정보 전체 화면 스크린샷, 클립보드, CPU·OS·도메인 정보
기타 FileZilla(FTP), Steam, Windows 자격증명 관리자

[표 1] 수집되는 정보 

 

지갑  탈취 경로 (전체 경로)
Bitcoin Core %APPDATA%\Bitcoin\wallets
Litecoin %APPDATA%\Litecoin\wallets
Dogecoin %APPDATA%\Dogecoin\wallets
DashCore %APPDATA%\DashCore\wallets
Ethereum %APPDATA%\Ethereum\keystore
Monero %USERPROFILE%\Documents\Monero\wallets
Exodus %APPDATA%\Exodus\exodus.wallet
Electrum %APPDATA%\Electrum\wallets
Electrum-LTC %APPDATA%\Electrum-LTC\wallets
Guarda %APPDATA%\Guarda\Local Storage\leveldb
Atomic %APPDATA%\atomic\Local Storage\leveldb
Coinomi %APPDATA%\Coinomi\wallets
WalletWasabi %APPDATA%\WalletWasabi\Client\Wallets
TrustWallet %APPDATA%\Trust Wallet

[표 2] 암호화폐 지갑 탈취 대상 (총 14종)

 

 

3) 봇넷 등록 및 파일 암호화

데이터 탈취가 완료되면 내부 PE는 봇넷 채널(/api/beacon)을 통해 C2 서버에 하트비트를 전송합니다.

C2 서버는 이에 응답하여 encrypt.dll파일을 내려보내며, 다운로드된 DLL 파일을 내부 PE 자신이 실행된 동일 프로세스 메모리에 로드합니다. 

💡 참고하세요

하트비트(Heartbeat)란?
감염된 피해자 PC가 C2 서버에 주기적으로 전송하는 생존 신호 및 상태 보고 패킷입니다. 공격자는 이를 통해 감염 호스트의 온라인 여부를 실시간으로 파악하고, 추가 명령 및 페이로드를 전달합니다.

하트비트 전송 시 감염PC 시스템 정보가 다음과 같은 JSON 형식으로 C2 서버에 전달되며, 이를 통해 공격자는 감염 호스트를 개별 식별하고 관리합니다.

{

  "lid": "********",              // 봇 고유 식별자

  "hostname": "DESKTOP-*******",  // 피해자 PC 이름

  "username": "*****",            // 피해자 계정명

  "arch": "x64",                  // 시스템 아키텍처

  "ver": "1.0"                    // 악성코드 버전

}

로드된 encrypt.dll파일은 C2로부터 RSA 공개키를 수신한 후 즉시 파일 암호화를 실행하고 감염PC 상세정보를 C2에 등록한 뒤 encrypt_exe.exe 파일을 추가 다운로드하여 실행합니다.

encrypt_exe.exe 파일은 별도 프로세스로 실행되어 암호화를 수행합니다.

 

encrypt.dll파일은 C2로부터 RSA 공개키를 수신해야만 암호화를 진행할 수 있지만 이후 실행되는 encrypt_exe.exe는 바이너리 내부에 RSA 키 풀(14개)이 내장되어 있어, C2 연결이나 운영자 승인 없이 실행 즉시 암호화를 독립적으로 개시합니다. 

 

파일명 역할 생성 주체
최초 실행파일(드로퍼) 내부 PE를 메모리에서 복호화 후 파일리스 실행 공격자 제작
내부 PE (봇) 스틸러 + RAT/봇넷 복합 엔진 공격자 제작
encrypt.dll 파일 암호화 - C2에서 RSA 키 수신 후 즉각 실행 내부 PE가 C2에서 다운로드
encrypt_exe.exe 파일 암호화 - 실행 즉시 내장 RSA 키로 암호화 (C2·운영자 승인 불필요), 14개 RSA 키 사전 내장 encrypt.dll이 C2에서 다운로드
System.exe encrypt_exe.exe를 다른 이름으로 저장한 것 - 재부팅 지속성용 encrypt.dll이 생성

[표 3] 악성코드 동작 시 생성되는 파일 정보

 

주체 행위
내부 PE 피해자 최초 등록, 설정 블롭 수신
내부 PE 시스템정보, 브라우저 데이터 등 탈취 데이터 전송
내부 PE 데이터 탈취 완료 신호 전송
내부 PE 봇넷 하트비트 등록
내부 PE encrypt.dll 다운로드
encrypt.dll VSS 서비스 중단 + 파일 암호화 시작 (.erkm)
encrypt.dll 피해자 상세 정보 C2 등록
encrypt.dll encrypt_exe.exe 다운로드 및 실행
encrypt_exe.exe 내장 RSA키로 파일 암호화 즉시 개시

[표 4] 전체 공격 흐름

 

 

파일 암호화 행위

 

1) 암호화 전 사전 작업

파일 암호화에 앞서 피해자가 백업으로 복구할 수 없도록 복구 수단을 원천 차단합니다.

  • 볼륨 섀도 복사본(VSS) 비활성화: StopService(vss) 호출로 즉시 중단
  • 데이터베이스·보안 서비스 종료: sql,memtas,mepocs,sophos,veeam, backup 서비스 강제 중단
  • 관련 프로세스 강제 종료: sqlservr.exe, oracle.exe, ocssd.exe, dbsnmp.exe, synctime.exe, agntsvc.exe, isqlplussvc.exe, xfssvccon.exe 총 8개 프로세스 종료 

2) 암호화 대상 확장자 (총 28종)

 

분류 대상 확장자
문서 .doc .docx .xlsx .xls .pptx .pdf .txt .csv .rtf
이미지 .jpg .jpeg .png .gif .bmp .psd
데이터베이스 .sql .db .mdb .accdb
압축/아카이브 .zip .rar .7z
CAD .dwg .dxf
가상머신 .vmdk .vmx .ova
백업 .bak

[표 5] 암호화 대상 확장자

 

암호화된 파일에는 .erkm 확장자가 추가됩니다. (예: report.docxreport.docx.erkm

 

[그림 1] 암호화된 파일 리스트


3) 암호화 제외 경로
시스템이 완전히 작동 불능 상태가 되는 것을 방지하기 위해 아래 경로는 암호화 대상에서 제외됩니다. 

Windows, Program Files, Program Files (x86), ProgramData, AppData, $Recycle.Bin,

System Volume Information, boot 

 

4) 드라이브 전체 열거 방식
A: ~ Z: 전체 논리 드라이브를 열거한 뒤, 각 드라이브 루트에서 FindFirstFileExW / FindNextFileW 함수로 하위 폴더를 재귀 탐색합니다. 
제외 목록에 해당하지 않는 폴더에서 암호화 대상 확장자 파일이 발견되면 즉시 암호화를 수행하며, 이 방식에 따라 감염 PC에 연결된 외장 드라이브, USB, 네트워크 드라이브까지 암호화 대상에 포함될 수 있습니다. 

 

5) 원본 파일 3단계 와이프 - 안티포렌식
암호화 후 원본 파일을 단순히 삭제하는 것에 그치지 않고, 원본 파일 자체를 포함하여 총 3번의 디스크 덮어쓰기를 수행하는 방식으로 포렌식 복구 도구를 이용한 파일 복원까지 차단합니다. 

 

.erkm 파일 생성 (암호화 데이터 저장)

원본 파일 삭제

원본 경로에 빈 파일 생성 → 삭제  (1차 덮어쓰기)

원본 경로에 재생성 → 최종 삭제   (2차 덮어쓰기)

 

6) 랜섬노트 

해당 랜섬웨어는 암호화 완료 후 기존 랜섬웨어처럼 .txt 형태의 랜섬노트를 생성하는 것이 아닌, GUI 팝업 형태로 표시됩니다.

랜섬노트 내 몸값 금액과 비트코인 수신 주소는 C2 서버로부터 실시간으로 채워져, 암호화 수행시마다 다르게 안내됩니다.

 

[그림 2] 랜섬노트 GUI 팝업 화면

 

지속성 설정

 

악성코드는 서로 다른 컴포넌트가 서로 다른 시점에 2개의 독립된 레지스트리 Run 키를 생성하여, 재부팅 이후에도 악성 행위가 자동으로 재개되도록 설계되어 있습니다.

 

지속성1 - 스틸러 / RAT 기능
최초 실행 직후 드로퍼 자신을 정상 시스템 파일처럼 위장된 경로에 복사하고, 레지스트리에 자동 실행 항목을 등록합니다.

[파일 생성]  %APPDATA%\Microsoft\WinSvc\svchost.exe
[파일 복사]  드로퍼(자기 자신) → svchost.exe
[속성 변경]  svchost.exe → HIDDEN | SYSTEM  (탐색기 숨김 처리)
[레지스트리] HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\WinSvcHost
= %APPDATA%\Microsoft\WinSvc\svchost.exe

 

지속성2 - 랜섬웨어 기능

encrypt.dll 파일이 C2로부터 encrypt_exe.exe 파일을 내려받으면서 이를 System.exe 라는 이름으로 저장하고, 별도의 Run 키를 등록합니다.

[파일 저장]  /api/exe 수신 결과물 → System.exe 이름으로 저장
[레지스트리] HKCU\Software\Microsoft\Windows\CurrentVersion\Run\System
= System.exe

System.exe는 네트워크를 차단해도 암호화를 멈추지 않으므로, 감염 확인 즉시 두 프로세스를 모두 강제 종료하고 두 Run 키를 모두 삭제해야 합니다.

 

C2 통신

 

악성코드는 스틸러 채널(/s/*)과 봇넷 채널(/api/*) 두 개의 독립적인 C2 통신 채널을 사용합니다.

 

1) 스틸러 채널
피해자 등록부터 탈취 데이터 업로드까지 3개의 엔드포인트로 구성됩니다.

 

엔드포인트 역할
POST /s/gate 피해자 최초 등록, 설정 블롭(3,016B) 수신
POST /s/push 탈취 파일 업로드 (파일 유형별 헤더로 분류)
POST /s/done 탈취 완료 신호 전송

[표 6] 스틸러 채널 엔드포인트 내용

 

POST /s/gate 요청 헤더는 감염 PC를 고유하게 식별하는 머신 핑거프린트 해시(X-H)를 포함하여 전송하며, C2 서버는 이에 응답으로 피해자별 맞춤 설정 데이터(3,016바이트)를 내려보냅니다.

Content-Type: application/octet-stream
X-H: a52ca16f00cdc9cb16c92345fcebe593c279830446300bf8e8304fe4ae585d90

// 머신 핑거프린트 해시 (64자 hex) - 감염PC 고유 식별자

 

Content-Length: 18 

 

← 응답: 3,016바이트 (암호화된 피해자별 맞춤 설정 데이터) 

 

POST /s/gate 요청에는 탈취된 파일의 유형·출처를 세분화한 커스텀 헤더가 포함됩니다.

Content-Type: application/octet-stream
X-S: 유출 세션 ID
X-M: 모듈 (sys | screen | chromium | ...)
X-B: 브라우저 (Microsoft Edge | Firefox | ...)
X-F: 파일명 (sysinfo.txt | Login Data | Cookies | ...)
X-H: 전송 파일 SHA256 해시 (무결성 검증)
Content-Length: <크기>

 

← 응답: 0바이트 (200 OK) / 본문은 암호화된 바이너리 (평문 전송 없음)

 

2) 봇넷 채널

모든 요청에 X-Api-Key 인증 헤더가 포함되며, 암호화 모듈 배포부터 상태 보고까지 다양한 엔드포인트로 구성됩니다. 

 

엔드포인트 역할
POST /api/beacon 60초 주기 하트비트
GET /api/payload/{id} encrypt.dll 다운로드
POST /api/task_result 작업 결과 보고
POST /api/register 감염PC 상세 정보 등록
GET /api/exe encrypt_exe.exe 다운로드
GET /api/message/{UUID} 암호화 명세 수신
GET /api/status/{UUID} 암호화 상태 보고 (10초 주기)

[표 7] 봇넷 채널 엔드포인트 내용

 

 

3) C2 태스크 명령 구조

C2가 내려보내는 태스크 명령은 아래와 같은 JSON 형식으로 전달되며, 내부 PE에서 처리 결과를 다시 보고하는 구조입니다. 

{

  "task_id":    "<태스크 ID>",

  "type":       "kill | sleep | inject | exec | socks | scan | deploy | interval",

  "payload_id": "<페이로드 ID>"

}

 

내부 PE에서 C2로 전송하는 처리 결과 응답 템플릿은 다음과 같습니다.

{"status":"done","result":"injected"}   // DLL 인-프로세스 로딩 완료
{"status":"done","result":"hits=<n>"}   // DDoS 공격 결과 (hits 카운터 포함)
{"status":"done","result":"socks_ack"}  // SOCKS5 프록시 설정 완료
{"status":"done","result":"executed"}   // 셸 명령 실행 완료
{"status":"done","result":"failed"}     // 실패 보고

C2로부터 DDoS/공격 대상·포트·지속시간을 수신하는 파라미터 문자열(target, port, duration)도 동일 영역에서 발견되어, 악성코드가 DDoS 공격 기능도 내장되어 있는것으로 확인되었습니다.

 

탐지 회피 기법

 

이번 공격에서 악성코드는 보안 분석을 어렵게 만들기 위해 다수의 회피 기법을 사용합니다.

 

1) 안티-분석 도구 탐지 (13종)
실행 중인 프로세스 목록 중 아래의 보안 분석 도구가 탐지되면 악성 행위를 즉시 중단합니다.

 

분류
탐지 대상 프로세스
디버거 x64dbg.exe, x32dbg.exe, OllyDbg.exe
디스어셈블러 ida.exe, ida64.exe
네트워크 분석 wireshark.exe, Fiddler.exe, HTTPDebugger.exe
프로세스 모니터 procmon.exe, procexp.exe, processhacker.exe
정적 분석 pestudio.exe, dnspy.exe

[표 8] 탐지 대상 프로세스 리스트

 

2) 가상화 환경 탐지
C:\Windows\System32\drivers\ 경로의 드라이버 파일 존재 여부를 확인하며,  vmmouse.sys, vmhgfs.sys (vmware), VBoxMouse.sys, VBoxGuest.sys (VirtualBox) 파일이 탐지되면 VM·샌드박스 환경으로 판단하여 프로세스를 즉시 종료합니다.

 

악성코드 귀속 (Attribution) 분석

 

분석 과정 중 내부 PE의 특정 메모리 영역에서 ‘MoscowTeam_Steal 이라는 공격 그룹의 명시적인 식별자가 확인되었습니다. 

해당 식별자는 기존 악성코드 패밀리에는 존재하지 않았으며, 이번 공격에 사용된 C2 서버 역시 기존 IoC 데이터베이스에 등록되지 않은 신규 인프라로 파악되었습니다.
즉, 기존에 알려지지 않은 신종 공격 그룹이거나 철저히 은닉된 인프라를 사용하고 있음을 의미합니다.

 

"MoscowTeam"(Moscow:모스크바의 영어식 표현)이라는 직접적인 지역 브랜딩과, 탈취 대상 목록이 러시아어권 사이버 범죄 그룹이 제작·운영한 것으로 알려진 Meduza/Aurora Stealer 악성코드와 유사하다는 점을 종합해볼때 이번 공격의 배후에는 러시아어권을 기반으로 활동하는 숙련된 위협 행위자가 있을 것으로 추정됩니다. 

 

 

MoscowTeam_Steal은 단순한 랜섬웨어를 넘어 정보탈취(Stealer)·원격 제어(RAT)·파일 암호화(Ransomware) 기능을 단일 실행 파일에 통합한 고도화된 복합 위협입니다. 공개된 위협 인텔리전스 어디에도 등록되지 않은 미공개 커스텀 악성코드로 기존 시그니처를 활용한 초기 탐지가 어렵기 때문에 행위기반 탐지 기능을 통한 선제적 차단이 필수적입니다.

 

특히, C2 서버가 차단된 상태에서도 내장된 RSA 키를 활용해 독립적으로 파일 암호화를 지속할 수 있도록 설계되어, 단순히 네트워크 인프라를 차단하는 것만으로는 피해를 막기 어렵습니다.

암호화된 파일은 복구 키 없이 복호화가 사실상 불가능한 만큼, 중요 데이터는 오프라인이나 네트워크가 격리된 환경에 정기적으로 백업하여 랜섬웨어로 인한 피해를 예방하시기 바랍니다

 

IoC

Indicator Type Description Detection Name
0715BB98F7B5A0922ADF5E65FDB3796A MD5 최초 실행파일 Trojan.Dropper.Agent
317F892EDACCC8904EDC5E40BFB5B1BA MD5 내부PE Trojan.Agent.165888B
AF3C65019FA5567E72E07E163A1FBEAB MD5 encrypt.dll Trojan.Ransom.Moscow
18DA62D532824A7F117C21C85DE80CF7 MD5 encrypt_exe.exe Trojan.Ransom.Moscow
193.169.194[.]13:5000 IP C2  

 

 

 

관련글 더보기

댓글 영역