서문
이 문서에서는 저희가 식별한 주요 Windows 멀웨어 탈취기 제품군에 대한 분석과 운영 방법론, 최근 업데이트 및 구성에 대해 설명합니다. 각 가족의 운영 방식을 이해하면 그 영향력의 규모를 더 잘 파악할 수 있고 그에 따라 방어를 강화할 수 있습니다. 또한, 저희 고유의 원격 분석을 통해 널리 퍼져 있는 멀웨어 도용자 그룹과 관련된 현재 볼륨에 대한 인사이트를 제공합니다.
이러한 종류의 은밀한 위협을 완화하려면 심층 방어 원칙에 따른 다각적인 접근 방식이 필요합니다. 또한 조직이 선제적으로 방어할 수 있도록 지원하는 ES|QL 헌팅 쿼리 및 Yara 규칙의 사용을 비롯한 다양한 탐지 기법에 대해서도 설명합니다.
원격 분석 개요
이 문서에 소개된 원격 분석 데이터는 내부 및 외부 소스에서 수집한 인사이트를 포괄하여 위협 활동에 대한 포괄적인 이해를 제공합니다.
특히, 2022 에서 2023 년까지 야생에서 가장 널리 퍼진 멀웨어로 레드라인이 부상했으며, 그 뒤를 에이전트 테슬라, 비다르, 스틸크가 바짝 뒤쫓고 있습니다. 이 시기는 STEALC가 야생에 데뷔한 시기로, 위협 환경이 진화하고 있음을 보여줍니다.
이후 기간인 2023 에서 2024 년까지 에이전트 테슬라 활동이 눈에 띄게 급증했으며, 그 뒤를 이어 레드라인, 스틸크, 비다르가 뒤를 이어 멀웨어 유포 및 배포의 변화하는 추세를 반영했습니다.
Elastic 원격 분석 데이터 5월 2023 - 2024년 5월
일반적인 멀웨어 유병률의 변동에도 불구하고 에이전트 테슬라는 꾸준히 주요 위협으로 자리를 지키고 있습니다. 이러한 지속적인 지배력은 상대적으로 낮은 가격대와 다양한 위협 행위자, 특히 제한된 리소스나 전문 지식으로 활동하는 공격자들에게 어필할 수 있는 매력적인 기능 등 여러 가지 요인에 기인합니다.
주목할 만한 점은 메타스틸러가 레드라인에 기반을 두고 있기 때문에 특정 메타스틸러 샘플이 실수로 레드라인의 범주에 속할 수 있다는 점입니다.
상위 도용자 개요
레드라인(레드라인 스틸러)
레드라인은 2020년에 이메일을 초기 배포 방법으로 활용하여 위협 환경에 데뷔했으며, 서비스형 멀웨어(MaaS) 모델로 운영되므로 다양한 위협 행위자가 접근할 수 있습니다. 저렴한 가격과 지하 포럼에서 사용할 수 있다는 점이 사이버 범죄자들 사이에서 인기를 끌게 된 이유입니다.
레드라인의 최신 작전에는 이메일 피싱, 합법적으로 보이는 애플리케이션을 호스팅하는 악성 웹사이트, 소셜 엔지니어링 전술 등 다양한 감염 경로가 포함되어 있습니다. 저희 연구원들은 최근 vx-underground에서 보고한 프리랜서 플랫폼 Fiverr의 엔지니어를 대상으로 한 캠페인을 분석한 샘플을 분석했습니다. 이 수법은 의심하지 않는 프리랜서를 통해 기업이 피해를 입을 수 있는 심각한 위험을 초래할 수 있습니다.
REDLINE은 .NET 프레임워크를 기반으로 구축되어 이식성과 구현 용이성을 제공합니다. 중요한 시스템 정보를 수집하고 민감한 데이터를 추출하기 위한 다양한 기능을 갖추고 있습니다:
- 시스템 정보 수집:
- 사용자 이름, 언어, 표준 시간대와 같은 필수 시스템 세부 정보를 수집합니다.
- 프로세서 및 그래픽 카드 정보를 포함한 하드웨어 세부 정보를 검색합니다.
- 실행 중인 프로세스를 모니터링하고 설치된 브라우저를 식별합니다.
- 데이터 추출:
- 브라우저 데이터 저장소를 대상으로 저장된 비밀번호, 신용카드 정보, 쿠키 및 자동 입력 항목을 추출합니다.
- 무단 액세스를 위한 VPN 로그인 자격 증명 확보
- Discord 및 Telegram과 같은 플랫폼에서 사용자 자격 증명 및 채팅 기록을 기록합니다.
- 암호화폐 지갑을 식별하고 탈취하여 잠재적으로 귀중한 디지털 자산을 손상시킬 수 있습니다:
REDLINE은 문자열 난독화 기술을 사용하여 런타임에 문자 배열에서 동적으로 문자열을 구성함으로써 야라와 같은 문자열을 기반으로 한 분석을 방해하고 탐지를 회피합니다:
이 구성은 네 개의 공용 필드를 포함하는 정적 클래스 내에 구조화되어 있습니다: IP, ID, Message, 그리고 XOR 키입니다. IP 및 ID 필드 내용은 XOR 암호화를 사용하여 암호화한 다음 아래 그림과 같이 base64로 인코딩합니다:
METASTEALER
메타스틸러는 2022년에 등장했으며, 처음에는 레드라인의 파생물로 광고되었으나 추가 기능을 갖춘 것으로 알려졌습니다. 멀웨어 분석가들은 최근 CERT가 이전에 오렌지 폴스카로 보고했던 로블록스(Roblox)를 가장한 캠페인 내에서 메타스틸러 샘플을 발견했습니다.
메타스틸러는 주로 .NET 프레임워크를 사용하여 개발되었기 때문에 Windows 환경과의 호환성이 뛰어나고 구현이 용이합니다. 특정 버전은 멀웨어의 제어 흐름을 모호하게 하고 탐지 또는 분석을 더 어렵게 만드는 등 난독화 방법을 사용합니다.
이 메타스틸러 샘플은 AGILE.NET 난독화기, 특히 프록시 호출 난독화 방법을 활용합니다. 이 기법은 추가적인 추상화 계층을 도입하여 원래 함수의 직접 호출을 숨기는 데 사용됩니다. AGILE.NET은 함수를 직접 호출하는 대신 프록시 메서드를 생성한 다음 원래 함수를 호출합니다. 이렇게 복잡성이 증가하면 코드 분석가가 작업 순서를 파악하기가 더 어려워집니다.
위의 코드를 보면 Delegate11.smethod_0 메서드가 초기화되지 않은 Delegate11.delegate11_0 을 호출하는 것을 볼 수 있는데, 분석가가 실제로 어떤 메서드가 실행될지 알 수 없기 때문에 정적 분석 중에 모호성이 생깁니다.
런타임에 멀웨어는 델리게이트를 초기화합니다. Delegate11 클래스의 생성자에서 Class4.smethod_13 메서드를 호출하여 토큰 값의 사전을 구성하며, 각 키는 델리게이트의 토큰 값(예: 0x040002DE)을 나타내고 해당 값은 실행할 원래 메서드의 토큰을 나타냅니다. 이 사전은 바이너리에 저장된 바이트 시퀀스로 구성되므로 런타임 중에 메서드 호출을 동적으로 확인할 수 있습니다.
그런 다음 델리게이트에 대한 동적 메서드를 생성하고 smethod_0 함수를 사용하여 실행합니다.
C2 IP 주소 및 포트와 같은 구성의 모든 중요한 문자열은 암호화됩니다. 이 멀웨어에는 실행 시작 시 모든 문자열을 한 번에 해독하기 위해 호출되는 Strings 클래스가 있으며, 이 클래스는 Base64 인코딩, XOR 복호화 및 AES CBC 복호화의 조합을 포함하는 프로세스입니다.
처음에 AES KEY 및 AES IV 과 같은 AES 매개변수는 복호화 과정을 거칩니다. 제공된 예제에서 AES KEY 및 AES IV 은 먼저 base64로 디코딩됩니다. 그 후 미리 정해진 XOR 키를 사용하여 XOR 복호화 과정을 거친 다음 두 번의 연속적인 Base64 디코딩 단계를 거칩니다.
Strings 클래스는 AES CBC를 사용하여 해독된 후 역복호화된 다음 Strings.Array 목록에 추가되는 바이트 배열을 보유합니다. 나중에 멀웨어가 특정 문자열을 필요로 할 때 이 목록을 색인화하여 해당 문자열에 액세스합니다. 예: String.get(6).
STEALC
세코이아( 2023 )가 2월에 발견한 스틸러 분야의 최근 주요 업체는 STEALC 계열입니다. 이 멀웨어는 지난 1월 언더그라운드 포럼( 2023 )에서 처음 알려졌으며, 개발자는 VIDAR, RACOON 및 REDLINE과 같은 기존 제품군에 대한 주요 종속성을 언급했습니다. 이 기간 동안 저희 팀은 매일 새로운 STEALC 샘플이 사이버 범죄자들에게 인기 있고 채택되고 있다는 징후를 관찰했습니다.
STEALC는 C로 구현되며 데이터 탈취 기능을 활성화하기 전에 동적 가져오기, 문자열 난독화, 다양한 분석 방지 검사 등의 기능을 포함하고 있습니다. 바이너리와 핵심 기능을 보호하기 위해 STEALC는 각 샘플에 내장된 하드코딩 키를 사용하여 Base64 + RC4 조합을 사용하여 문자열을 암호화합니다.
STEALC 내에는 분석 방지/샌드박스 방지 검사에 사용되는 6 별도의 기능이 있습니다. 프로세서 수에 따라 활성 프로세서 수가 2 미만인 경우 STEALC는 스스로 종료됩니다.
STEALC는 대량의 메모리를 할당하기 위해 좀 더 모호한 Windows API(VirtualAllocExNuma)를 사용하여 샌드박스/에뮬레이션 테스트를 수행합니다. API가 구현되지 않으면 프로세스가 종료됩니다.
이 악성 코드는 GlobalMemoryStatusEx 에서 값을 읽어 또 다른 샌드박스 검사를 수행합니다. 물리적 메모리의 수집된 속성에 대해 바이트 시프트 후 값이 0x457 보다 작으면 샘플이 종료됩니다.
언어 식별자가 다음 LangID 중 하나와 일치하면 멀웨어가 실행을 중지합니다:
- 러시아어_러시아 (
0x419) - 우크라이나_우크라이나 (
0x422) - 벨라루스어_벨라루스 (
0x423) - 카자흐어_카자흐스탄 (
0x43f) - 우즈벡_라틴어__우즈베키스탄 (
0x443)
STEALC는 또한 마이크로소프트 디펜더 에뮬레이션 검사를 통합하고 있으며, 저희는 LOBSHOT에서 볼 수 있는 것과 같은 많은 스텔러에서 이를 관찰했습니다. Microsoft Defender의 에뮬레이션 레이어 내에서 사용자 이름 JohnDoe 및 컴퓨터 이름 HAL9TH 의 다음 하드 코딩된 값이 일치하면 STEALC가 종료됩니다.
STEALC와 함께 제공되는 가장 영향력 있는 분석 방지 검사 중 하나는 만료일입니다. 이 고유 값은 멀웨어의 구성에 배치되어 빌더가 설정한 특정 날짜 이후에는 스틸러가 실행되지 않도록 합니다. 이를 통해 멀웨어는 캠페인에서 더 짧은 처리 시간을 사용하고 샌드박스 환경에서 실행을 제한하여 낮은 프로필을 유지할 수 있습니다.
STEALC - 실행 흐름
초기 실행 후 STEALC는 머신의 초기 하드웨어 ID를 전송하고 C2 서버로부터 구성을 수신합니다:
f960cc969e79d7b100652712b439978f789705156b5a554db3acca13cb298050efa268fb|done|tested.file|1|1|1|1|1|1|1|1|
이 요청 후에는 대상 브라우저 및 대상 브라우저 확장 프로그램의 업데이트된 목록을 받기 위해 여러 차례 요청을 보냅니다. 아래는 민감한 데이터가 저장되는 대상 디렉터리 경로가 포함된 브라우저 구성의 예입니다.
Google Chrome|\Google\Chrome\User Data|chrome|chrome.exe|Google Chrome Canary|\Google\Chrome SxS\User Data|chrome|chrome.exe|Chromium|\Chromium\User Data|chrome|chrome.exe|Amigo|\Amigo\User Data|chrome|0|Torch|\Torch\User Data|chrome|0|Vivaldi|\Vivaldi\User Data|chrome|vivaldi.exe|Comodo Dragon|\Comodo\Dragon\User Data|chrome|0|EpicPrivacyBrowser|\Epic Privacy Browser\User Data|chrome|0|CocCoc|\CocCoc\Browser\User Data|chrome|0|Brave|\BraveSoftware\Brave-Browser\User Data|chrome|brave.exe|Cent Browser|\CentBrowser\User Data|chrome|0|7Star|\7Star\7Star\User Data|chrome|0|Chedot Browser|\Chedot\User Data|chrome|0|Microsoft Edge|\Microsoft\Edge\User Data|chrome|msedge.exe|360 Browser|\360Browser\Browser\User Data|chrome|0|QQBrowser|\Tencent\QQBrowser\User Data|chrome|0|CryptoTab|\CryptoTab Browser\User Data|chrome|browser.exe|Opera Stable|\Opera Software|opera|opera.exe|Opera GX Stable|\Opera Software|opera|opera.exe|Mozilla Firefox|\Mozilla\Firefox\Profiles|firefox|0|Pale Moon|\Moonchild Productions\Pale Moon\Profiles|firefox|0|Opera Crypto Stable|\Opera Software|opera|opera.exe|Thunderbird|\Thunderbird\Profiles|firefox|0|
이 시점에서 STEALC는 광범위한 피해자 정보를 수집합니다. 그런 다음 이 정보는 형식이 지정되고 Base64로 인코딩된 다음 양식 데이터 필드를 사용하여 POST 요청을 통해 C2 서버로 전송됩니다.
- 하드웨어 ID
- Windows OS 제품 정보
- 프로세서/램 정보
- 사용자 이름/컴퓨터 이름
- 현지 시스템 시간/시간대/피해자의 로캘
- 키보드 레이아웃
- 배터리 확인(노트북 사용 여부 확인에 사용)
- 데스크톱 해상도, 디스플레이 정보
- 설치된 프로그램, 실행 중인 프로세스
훔치기 구성 요소의 경우, STEALC는 수신된 구성을 활용하여 다음과 같은 다양하고 중요한 정보를 수집합니다:
- Browser cookies
- 로그인 데이터
- 웹 데이터
- 역사
- 암호화폐 지갑
STEALC는 다음과 같은 다양한 구성 옵션도 제공합니다:
- 텔레그램 데이터
- 불화
- Tox
- 피진
- Steam
- Outlook 이메일
| 레드라인 스틸러 | 메타 스틸러 | Stealc | |
|---|---|---|---|
| 야생에서 처음 발견 | 2020 | 2022 | 2023 |
| 소스 언어 | C# | C# | C |
| 평균 크기(포장되지 않은 상태) | 253 KB | 278 KB | 107 KB |
| 문자열 난독화? Algo? | 예 | 예 | 예(사용자 지정 RC4 + base64) |
탐지
이러한 위협에 대해 아래에 나열된 탐지 기능을 Elastic Security에서 완전히 활용하려면 Elastic Defend와 Windows를 통합하는 것이 필수적입니다.
- 서명되지 않은 바이너리를 통한 웹서비스 연결
- 서명된 바이너리 프록시를 통한 웹서비스 연결
- 마운트된 가상 디스크의 의심스러운 DNS 쿼리
- 웹 브라우저 자격 증명 저장소에 대한 의심스러운 액세스
- 서명되지 않은 프로세스를 통한 웹 브라우저 자격 증명 액세스
- 의심스러운 메모리에서 브라우저 자격 증명 액세스
- 웹 브라우저 파일에 대한 액세스 시도 실패
- 비정상적인 프로세스를 통한 웹 브라우저 자격 증명 액세스
ES|QL queries
다음 사냥 및 탐지 쿼리 목록을 사용하여 도용자 활동을 탐지할 수 있습니다:
-
신뢰할 수 없거나 서명되지 않은 실행파일이 텔레그램 또는 디스코드 도메인에 DNS 요청을 하는 경우, 명령 및 제어 통신 시도를 나타낼 수 있는 것을 식별합니다.
from logs-endpoint* | where (process.code_signature.trusted == false or process.code_signature.exists == false) | where dns.question.name in ("api.telegram.com", "cdn.discordapp.com", "discordapp.com", "discord.com","discord.gg","cdn.discordapp.com") | stats executable_count = count(*) by process.executable, process.name, dns.question.name | sort executable_count desc -
Windows 시스템에 저장된 암호화폐 지갑 파일 및 구성을 대상으로 하는 의심스러운 활동을 감지합니다.
from logs-endpoint.events.file-* | where @timestamp > now() - 14 days | where host.os.type == "windows" and event.category == "file" and event.action == "open" and ( file.path rlike """C:\\Users\\.+\\AppData\\Roaming\\.+\\(Bitcoin|Ethereum|Electrum|Zcash|Monero|Wallet|Litecoin|Dogecoin|Coinbase|Exodus|Jaxx|MyEtherWallet|MetaMask)\\.*""" or file.path rlike """C:\\ProgramData\\.+\\(Bitcoin|Ethereum|Electrum|Zcash|Monero|Wallet|Litecoin|Dogecoin|Coinbase|Exodus|Jaxx|MyEtherWallet|MetaMask)\\.*""" ) | keep process.executable, process.name, host.id, file.path, file.name | stats number_hosts = count_distinct(host.id), unique_files = count_distinct(file.name) by process.executable | where number_hosts == 1 and unique_files >= 3 | sort number_hosts desc -
쿠키, 로그인 데이터, 검색 기록 등 민감한 브라우저 데이터에 대한 액세스를 모니터링하여 정보 도용 멀웨어 활동을 나타낼 수 있습니다.
from logs-endpoint.events.file-*, logs-windows.sysmon_operational-default-* | where @timestamp > now() - 14 days | where host.os.type == "windows" and event.category == "file" and event.action in ("open", "modification") and ( file.path rlike "C:\\\\Users\\\\.+\\\\AppData\\\\Local\\\\(Google\\\\Chrome\\\\User Data\\\\.*|Google\\\\Chrome SxS\\\\User Data\\\\.*|Chromium\\\\User Data\\\\.*|Amigo\\\\User Data\\\\.*|Torch\\\\User Data\\\\.*|Vivaldi\\\\User Data\\\\.*|Comodo\\\\Dragon\\\\User Data\\\\.*|Epic Privacy Browser\\\\User Data\\\\.*|CocCoc\\\\Browser\\\\User Data\\\\.*|BraveSoftware\\\\Brave-Browser\\\\User Data\\\\.*|CentBrowser\\\\User Data\\\\.*|7Star\\\\7Star\\\\User Data\\\\.*|Chedot\\\\User Data\\\\.*|Microsoft\\\\Edge\\\\User Data\\\\.*|360Browser\\\\Browser\\\\User Data\\\\.*|Tencent\\\\QQBrowser\\\\User Data\\\\.*|CryptoTab Browser\\\\User Data\\\\.*|Opera Software\\\\Opera Stable\\\\.*|Opera Software\\\\Opera GX Stable\\\\.*)\\\\(Default|Profile \\\\d+)\\\\(Cookies|Login Data|Web Data|History|Bookmarks|Preferences|Visited Links|Network Action Predictor|Top Sites|Favicons|Shortcuts)" or file.path rlike "C:\\\\Users\\\\.+\\\\AppData\\\\Roaming\\\\Mozilla\\\\Firefox\\\\Profiles\\\\.*\\\\(cookies.sqlite|logins.json|places.sqlite|key4.db|cert9.db)" or file.path rlike "C:\\\\Users\\\\.+\\\\AppData\\\\Roaming\\\\Moonchild Productions\\\\Pale Moon\\\\Profiles\\\\.*\\\\(cookies.sqlite|logins.json|places.sqlite|key3.db|cert8.db)" or file.path rlike "C:\\\\Users\\\\.+\\\\AppData\\\\Roaming\\\\Thunderbird\\\\Profiles\\\\.*\\\\(cookies.sqlite|logins.json|key4.db|cert9.db)" ) | keep process.executable, process.name, event.action, host.id, host.name, file.path, file.name | eval process_path = replace(process.executable, "([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}|ns[a-z][A-Z0-9]{3,4}\\.tmp|DX[A-Z0-9]{3,4}\\.tmp|7z[A-Z0-9]{3,5}\\.tmp|[0-9\\.\\-_]{3,})", "") | eval process_path = replace(process_path, "[cC]:\\\\[uU][sS][eE][rR][sS]\\\\[a-zA-Z0-9\\.\\-_\\$~ ]+\\\\", "C:\\\\users\\\\user\\\\") | eval normalized_file_path = replace(file.path, "[cC]:\\\\[uU][sS][eE][rR][sS]\\\\[a-zA-Z0-9\\.\\-_\\$~ ]+\\\\", "C:\\\\users\\\\user\\\\") | stats number_hosts = count_distinct(host.id) by process.executable, process.name, event.action, normalized_file_path, file.name, host.name | where number_hosts == 1 | sort number_hosts desc
YARA 규칙
결론
결론적으로, 이러한 멀웨어 위협은 기업과 개인 모두에게 심각한 위험을 초래한다는 점을 인식하는 것이 중요합니다. 가격이 저렴하기 때문에 정교한 사이버 범죄자뿐만 아니라 소액 범죄자나 스크립트를 작성하는 어린이들도 쉽게 접근할 수 있습니다. 이러한 접근성은 기술적 전문 지식이 부족한 개인도 악성 소프트웨어를 배포할 수 있는 사이버 범죄의 민주화를 강조합니다.
Elastic의 포괄적인 보안 기능 제품군은 조직과 개인이 맬웨어 공격을 효과적으로 방어하는 데 필요한 도구를 제공합니다. 지능형 위협 탐지부터 실시간 모니터링 및 대응 기능까지.
