Jia Yu Chan

에디스를 쫓다: 캡차 캠페인에 사용되는 새로운 Rust 기반 InfoStealer

Elastic Security Labs에서 새로운 캡차 기반 캠페인에 사용되는 경량 상품 인포스틸러인 에디스틸러에 대해 안내합니다.

45분 읽기Malware 분석
에디스를 쫓다: 캡차 캠페인에 사용되는 새로운 Rust 기반 InfoStealer

서문

Elastic Security Labs는 가짜 캡차 캠페인을 통해 배포되는 새로운 Rust 기반 인포스틸러를 발견했습니다. 이 멀웨어는 공격자가 제어하는 여러 웹 자산에서 호스팅됩니다. 이 캠페인은 사용자를 속여 악성 파워쉘 스크립트를 실행하도록 유도하는 거짓 캡차 확인 페이지를 활용하여 궁극적으로 인포스틸러를 배포하고 자격 증명, 브라우저 정보, 암호화폐 지갑 세부 정보 등의 민감한 데이터를 수집합니다. 이 멀웨어를 EDDIESTEALER라고 부릅니다.

멀웨어 개발에 Rust를 채택하는 것은 기존 분석 워크플로 및 위협 탐지 엔진에 대한 은폐성, 안정성 및 복원력을 강화하기 위해 최신 언어 기능을 활용하려는 위협 행위자들의 추세가 증가하고 있음을 반영합니다. Rust로 작성된 단순해 보이는 인포스틸러는 제로 비용 추상화, Rust의 타입 시스템, 컴파일러 최적화, 메모리 안전 바이너리 분석에 내재된 어려움 등의 요인으로 인해 C/C++에 비해 더 많은 분석 노력이 필요한 경우가 많습니다.

핵심 사항

  • 가짜 캡차 캠페인으로 에디스틸러가 로드됩니다.
  • 에디스틸러는 Windows 호스트를 노리는 새로 발견된 Rust 인포스틸러입니다.
  • 에디스틸러는 C2 서버로부터 타깃 데이터를 식별하는 작업 목록을 수신합니다.

초기 액세스

개요

가짜 캡차는 합법적인 캡차 시스템의 모양과 기능을 모방한 악성 구조로, 인간 사용자와 자동화된 봇을 구별하는 데 사용됩니다. 합법적인 캡챠와 달리 가짜 캡챠는 멀웨어의 게이트웨이 역할을 하며, 소셜 엔지니어링을 활용하여 사용자를 속이는 데 사용됩니다. 이러한 메시지는 종종 "인간임을 확인합니다" 또는 "나는 로봇이 아닙니다" 와 같은 메시지로 나타나며, 손상된 웹사이트나 피싱 캠페인에 자연스럽게 녹아들게 됩니다. 2024년 말에도 비슷한 캠페인이 호스트펄스를 배포하는 것을 발견했습니다.

에디스틸러가 배포되기까지의 원격 분석 결과, 초기 벡터는 "나는 로봇이 아닙니다"라는 가짜 확인 화면을 표시하는 난독화된 React 기반 JavaScript 페이로드를 배포하는 손상된 웹사이트로 밝혀졌습니다.

Google의 reCAPTCHA 인증 인터페이스를 모방한 이 악성 코드는 document.execCommand("copy") 방법을 사용하여 PowerShell 명령을 사용자의 클립보드에 복사한 다음, Windows + R(Windows 실행 대화 상자 열기)을 누른 다음 Ctrl + V를 눌러 클립보드 내용을 붙여넣고 마지막으로 Enter 키를 눌러 악성 PowerShell 명령을 실행하도록 지시합니다.

이 명령은 공격자가 제어하는 도메인 hxxps://llll.fit/version/ 에서 2단계 페이로드(gverify.js)를 조용히 다운로드하여 사용자의 Downloads 폴더에 저장합니다.

마지막으로 멀웨어는 숨겨진 창에서 cscript 을 사용하여 gverify.js 을 실행합니다.

gverify.js 는 오픈 소스 도구를 사용하여 난독화 해제할 수 있는 또 다른 난독화된 JavaScript 페이로드입니다. 이 기능은 매우 간단합니다. hxxps://llll.fit/io 에서 실행 파일(EDDIESTEALER)을 가져와서 사용자의 Downloads 폴더에 12자의 의사 임의 파일 이름으로 파일을 저장하는 것입니다.

EDDIESTEALER

개요

에디스틸러는 새로운 러스트 기반 상품 인포스틸러입니다. 악의적인 의도를 알 수 있는 대부분의 문자열은 암호화되어 있습니다. 이 멀웨어에는 행동 핑거프린팅에 대한 강력한 안티 샌드박스/VM 보호 기능이 없습니다. 그러나 최신 변종은 샌드박스/VM 검사가 서버 측에서 발생할 수 있음을 시사합니다. 비교적 간단한 기능으로, 특정 데이터를 대상으로 하는 구성의 일부로 C2 서버로부터 작업 목록을 수신하고 지정한 경우 실행 후 자동 삭제할 수 있습니다.

제거된 기호

에디스틸러 샘플에는 Rust의 기본 컴파일 옵션을 사용한 것으로 보이는 함수 심볼이 제거되어 있어 정적 분석 전에 심볼 복원이 필요했습니다. 저희는 특정 Rust/컴파일러/종속성 버전을 기반으로 Rust 표준 라이브러리 및 크레이트에 대한 서명을 생성하는 rustbinsign 을 사용했습니다. rustbinsignhashbrownrustc-demangle 만 감지하여 외부 상자가 거의 사용되지 않았음을 시사했지만, tinyjsontungstenite 과 같은 최신 변종에서는 상자를 식별하지 못했습니다. 이는 명확한 문자열 아티팩트가 없기 때문에 발생했습니다. 고유 문자열을 찾아 GitHub에서 리포지토리를 검색하여 상자를 수동으로 식별한 다음 download_sign 모드를 사용하여 해당 상자에 대한 서명을 다운로드, 컴파일 및 빌드할 수 있습니다. 사용 중인 상자의 정확한 버전을 모르는 경우 약간 번거롭습니다. 그러나 표준 라이브러리와 런타임 심볼을 복원하는 것만으로도 정적 분석 프로세스를 발전시킬 수 있습니다.

문자열 난독화

에디스틸러는 대부분의 문자열을 간단한 XOR 암호를 통해 암호화합니다. 복호화에는 두 단계가 포함됩니다. 먼저 여러 키 파생 함수 중 하나를 호출하여 XOR 키를 파생한 다음, 문자열을 사용하는 함수 내에서 인라인으로 복호화를 수행합니다.

다음 예시에서 sub_140020fd0 은 키 파생 함수이고 data_14005ada8 은 암호화된 블롭의 주소입니다.

각 복호화 루틴은 고유한 키 파생 함수를 사용합니다. 이 함수는 일관되게 2진수 내의 주소와 4바이트 상수 값이라는 두 가지 인수를 받습니다. 그런 다음 이러한 인수에 대해 몇 가지 기본 연산을 수행하여 XOR 키가 있는 주소를 계산합니다.

바이너리 닌자에는 User-Informed Data Flow (UIDF)라는 편리한 기능이 있어 변수를 알려진 값으로 설정하여 상수 전파 분석을 트리거하고 식을 단순화하는 데 사용할 수 있습니다. 그렇지 않으면 Unicorn과 같은 CPU 에뮬레이터와 스크립트 가능한 바이너리 분석 도구를 함께 사용하는 것도 배치 분석에 유용할 수 있습니다.

모듈 이름, C2 도메인 및 포트(샘플의 고유 식별자)에 대한 암호화된 문자열과 같이 한 번만 해독되지만 런타임 중에 여러 번 참조되는 공유 리소스의 스레드 안전, 지연 초기화에 대한 일반적인 패턴이 있습니다. 각 특정 게터 함수는 리소스에 대한 상태 플래그를 확인하고 초기화되지 않은 경우 공유 저수준 동기화 함수를 호출합니다. 이 동기화 루틴은 원자 연산과 OS 대기 프리미티브(WaitOnAddress/WakeByAddressAll)를 사용하여 하나의 스레드만 실제 초기화 로직을 실행하도록 하며, 이는 dyn Trait 객체의 vtable에서 함수 포인터를 통해 간접적으로 호출됩니다.

API 난독화

에디스텔러는 대부분의 API 호출에 사용자 지정 WinAPI 조회 메커니즘을 활용합니다. 대상 모듈과 함수의 이름을 해독하는 것으로 시작합니다. 해결을 시도하기 전에 로컬로 유지 관리되는 해시테이블을 확인하여 함수 이름과 주소가 이미 해결되었는지 확인합니다. 찾을 수 없는 경우 사용자 정의 LoadLibrary 래퍼를 사용하여 필요한 모듈을 프로세스의 주소 공간에 동적으로 로드하고 잘 알려진 GetProcAddress 구현을 호출하여 내보낸 함수의 주소를 검색합니다. 그런 다음 API 이름과 주소가 해시테이블에 삽입되어 향후 조회를 최적화합니다.

뮤텍스 생성

에디스틸러는 뮤텍스를 생성하여 특정 시간에 하나의 멀웨어 인스턴스만 실행되도록 하는 것으로 시작합니다. 뮤텍스 이름은 해독된 UUID 문자열 431e2e0e-c87b-45ac-9fdb-26b7e24f0d39 (샘플당 고유)이며, 나중에 C2 서버와 처음 접촉하는 동안 한 번 더 참조됩니다.

샌드박스 탐지

EDDIESTEALER는 빠른 검사를 수행하여 총 물리적 메모리 양이 ~4.0 이상인지 평가합니다. GB를 약한 샌드박스 탐지 메커니즘으로 사용합니다. 검사에 실패하면 디스크에서 스스로 삭제됩니다.

자동 삭제

LATRODECTUS에서 관찰된 유사한 자체 삭제 기술을 기반으로, EDDIESTEALER는 파일 잠금을 우회하기 위해 NTFS 대체 데이터 스트림 이름 변경을 통해 스스로 삭제할 수 있습니다.

이 악성 코드는 GetModuleFileName 를 사용하여 실행 파일의 전체 경로를 얻고 CreateFileW ( jy::ds::OpenHandle 로 래핑됨)을 사용하여 적절한 액세스 권한으로 실행 파일에 대한 핸들을 엽니다. 그런 다음 새 스트림 이름이 포함된 FILE_RENAME_INFO 구조가 SetFileInformationByHandle 으로 전달되어 기본 스트림 $DATA 의 이름이 :metadata 으로 변경됩니다. 파일 핸들을 닫았다가 다시 열고 이번에는 FILE_DISPOSITION_INFO.DeleteFile 플래그가 TRUE 로 설정된 핸들에서 SetFileInformationByHandle 을 사용하여 닫기 핸들" 플래그에서 "삭제가 활성화되도록 합니다.

추가 구성 요청

초기 구성 데이터는 바이너리 내에 암호화된 문자열로 저장됩니다. 암호 해독이 완료되면 이 데이터는 URI 패턴에 따라 요청을 구성하는 데 사용됩니다: <C2_ip_or_domain>/<resource_path>/<UUID>. resource_pathapi/handler 으로 지정됩니다. 앞서 뮤텍스 생성에 사용된 UUID 은 빌드 추적을 위한 고유 식별자로 사용됩니다.

그런 다음 EDDIESTEALER는 구성된 URI로 HTTP GET 요청을 전송하여 C2 서버와 통신하여 멀웨어가 실행할 작업 목록이 포함된 2단계 구성을 검색합니다.

2단계 구성 데이터는 AES CBC로 암호화되고 Base64로 인코딩됩니다. 메시지에서 콜론(:) 앞에 Base64로 인코딩된 IV가 앞에 붙습니다.

Base64(IV):Base64(AESEncrypt(data))

서버-클라이언트 간 메시지 암호 해독을 위한 AES 키는 UTF-8 인코딩으로 암호화되지 않은 상태로 .rdata 섹션에 저장됩니다. 게터 함수를 통해 검색됩니다.

이 샘플의 암호 해독된 구성에는 JSON 형식의 다음이 포함되어 있습니다:

  • 세션 ID
  • 작업 목록(대상 데이터)
  • 클라이언트-서버 메시지 암호화를 위한 AES 키
  • 자동 삭제 플래그
{
    "session": "<unique_session_id>",
    "tasks": [
        {
            "id": "<unique_task_id>",
            "prepare": [],
            "pattern": {
                "path": "<file_system_path>",
                "recursive": <true/false>,
                "filters": [
                    {
                        "path_filter": <null/string>,
                        "name": "<file_or_directory_name_pattern>",
                        "entry_type": "<FILE/DIR>"
                    },
                    ...
                ]
            },
            "additional": [
                {
                    "command": "<optional_command>",
                    "payload": {
                        "<command_specific_config>": <value>
                    }
                },
                ...
            ]
        },
        ...
    ],
    "network": {
        "encryption_key": "<AES_encryption_key>"
    },
    "self_delete": <true/false>
}

이 특정 샘플과 분석 중 서버로부터 받은 작업을 기반으로 한 파일 시스템 기반 유출 대상 목록은 다음과 같습니다:

  • 암호화폐 지갑
  • 브라우저
  • 비밀번호 관리자
  • FTP 클라이언트
  • 메시징 애플리케이션
암호화폐 지갑대상 경로 필터
무기고%appdata%\\Armory\\*.wallet
비트코인%appdata%\\Bitcoin\\wallets\\*
월렛와사비%appdata%\\WalletWasabi\\Client\\Wallets\\*
다이달로스 메인넷%appdata%\\Daedalus Mainnet\\wallets\\*
Coinomi%localappdata%\\Coinomi\\Coinomi\\wallets\\*
Electrum%appdata%\\Electrum\\wallets\\*
Exodus%appdata%\\Exodus\\exodus.wallet\\*
DashCore%appdata%\\DashCore\\wallets\\*
전자 현금%appdata%\\ElectronCash\\wallets\\*
일렉트럼-DASH%appdata%\\Electrum-DASH\\wallets\\*
Guarda%appdata%\\Guarda\\IndexedDB
Atomic%appdata%\\atomic\\Local Storage
브라우저대상 경로 필터
Microsoft Edge%localappdata%\\Microsoft\\Edge\\User Data\\
[Web Data,History,Bookmarks,Local Extension Settings\\...]
Brave%localappdata%\\BraveSoftware\\Brave-Browser\\User Data\\
[Web Data,History,Bookmarks,Local Extension Settings\\...]
Google Chrome%localappdata%\\Google\\Chrome\\User Data\\
[Web Data,History,Bookmarks,Local Extension Settings\\...]
Mozilla Firefox%appdata%\\Mozilla\\Firefox\\Profiles\\
[key4.db,places.sqlite,logins.json,cookies.sqlite,formhistory.sqlite,webappsstore.sqlite,*+++*]
비밀번호 관리자대상 경로 필터
비트워든%appdata%\\Bitwarden\\data.json
1Password%localappdata%\\1Password\\
[1password.sqlite,1password_resources.sqlite]
KeePass%userprofile%\\Documents\\*.kdbx
FTP 클라이언트대상 경로 필터
FileZilla%appdata%\\FileZilla\\recentservers.xml
FTP 관리자 라이트%localappdata%\\DeskShare Data\\FTP Manager Lite\\2.0\\FTPManagerLiteSettings.db
FTPbox%appdata%\\FTPbox\\profiles.conf
FTP 커맨더 디럭스%ProgramFiles(x86)%\\FTP Commander Deluxe\\FTPLIST.TXT
자동 FTP 관리자%localappdata%\\DeskShare Data\\Auto FTP Manager\\AutoFTPManagerSettings.db
3D-FTP%programdata%\\SiteDesigner\\3D-FTP\\sites.ini
FTPGetter%appdata%\\FTPGetter\\servers.xml
총 사령관%appdata%\\GHISLER\\wcx_ftp.ini
메시징 앱대상 경로 필터
텔레그램 데스크톱%appdata%\\Telegram Desktop\\tdata\\*

대상 브라우저 확장 프로그램 목록은 여기에서 확인할 수 있습니다.

이러한 타겟은 C2 운영자가 구성할 수 있으므로 변경될 수 있습니다.

그런 다음 EDDIESTEALER는 CreateFileW, GetFileSizeEx, ReadFile, CloseHandle 와 같은 표준 kernel32.dll 함수를 사용하여 대상 파일을 읽습니다.

후속 C2 트래픽

작업을 성공적으로 검색한 후 EDDIESTEALER는 시스템 프로파일링을 수행하여 감염된 시스템에 대한 몇 가지 정보를 수집합니다:

  • 실행 파일 위치 (GetModuleFileNameW)
  • 로캘 ID (GetUserDefaultLangID)
  • 사용자 이름 (GetUserNameW)
  • 물리적 메모리 총량 (GlobalMemoryStatusEx)
  • OS 버전 (RtlGetVersion)

클라이언트 간 메시지에 대해 동일한 데이터 형식(Base64(IV):Base64(AESEncrypt(data)))에 따라 초기 호스트 정보는 추가 구성에서 검색한 키를 사용하여 AES 암호화되고 HTTP POST 요청을 통해 <C2_ip_or_domain>/<resource_path>/info/<session_id> 으로 전송됩니다. 이후 완료된 각 작업에 대해 수집된 데이터도 암호화되어 각 작업이 완료된 직후 별도의 POST 요청으로 <C2_ip_or_domain>/<resource_path><session_id>/<task_id> 으로 전송됩니다. 이 방법론은 여러 개의 작업별 POST 요청으로 특징지어지는 뚜렷한 C2 트래픽 패턴을 생성합니다. 이 멀웨어 제품군은 주로 C2 통신에 HTTPS 대신 HTTP를 사용하기 때문에 이 패턴은 특히 쉽게 식별할 수 있습니다.

분석 결과, 패닉 메타데이터 문자열로 해독되는 암호화된 문자열을 발견하여 다음과 같은 내부 Rust 소스 파일 경로를 공개했습니다:

  • apps\bin\src\services\chromium_hound.rs
  • apps\bin\src\services\system.rs
  • apps\bin\src\structs\search_pattern.rs
  • apps\bin\src\structs\search_entry.rs

C2 서버로 전송되는 오류 메시지에는 오류가 발생한 정확한 소스 파일, 줄 번호, 열 번호 등 이러한 문자열이 포함되어 있어 멀웨어 개발자가 디버깅 피드백을 내장할 수 있다는 사실을 발견했습니다.

크롬 관련 기능

애플리케이션 바운드 암호화 도입 이후 멀웨어 개발자들은 이 보호 기능을 우회하여 쿠키와 같은 암호화되지 않은 민감한 데이터에 액세스할 수 있는 대체 방법을 찾아냈습니다. 크롬카츠는 멀웨어를 구현한 오픈 소스 솔루션 중 가장 호평을 받고 있는 솔루션 중 하나입니다. 멀웨어 개발자들이 Rust에서 이를 다시 구현한 것입니다.

아래는 %localappdata%\<browser_specific_path>\\User Data\\Last Version 에서 버전 정보를 검색한 후 쿠키카츠와 유사한 브라우저 버전 확인 로직의 스니펫입니다.

쿠키몬스터 인스턴스를 탐지하기 위한 쿠키카츠 서명 패턴:

쿠키몬스터 인스턴스 탐지를 위한 CredentialKatz 서명 패턴:

다음은 쿠키카츠의 FindPattern, PatchBaseAddress 을 복사하여 붙여넣은 로직의 정확한 예시입니다.

개발자들은 타겟팅한 크롬 브라우저가 실행되고 있지 않은 경우를 처리하기 위해 수정 사항을 도입했습니다. 비활성 상태인 경우 EDDIESTEALER는 명령줄 인수를 사용하여 새 브라우저 인스턴스를 생성합니다 --window-position=-3000,-3000 https://google.com. 이렇게 하면 새 창이 화면에서 멀리 떨어져서 사용자에게 보이지 않게 됩니다. 목표는 멀웨어가 필요한 하위 프로세스( --utility-sub-type=network.mojom.NetworkService 플래그로 식별되는 네트워크 서비스 프로세스)의 메모리(ReadProcessMemory)를 계속 읽을 수 있도록 하는 것입니다. 이 브라우저 프로세스 상호 작용에 대한 자세한 설명은 MaaS 인포스틸러에 대한 이전 연구를 참조하세요.

이형 상품과의 차이점

분석 후, 추가 기능을 갖춘 최신 샘플이 확인되었습니다.

이제 피해 컴퓨터에서 수집되는 정보에는 다음이 포함됩니다:

  • Running processes
  • GPU 정보
  • CPU 코어 수
  • CPU 이름
  • CPU 공급업체

C2 통신 패턴이 약간 변경되었습니다. 이제 멀웨어는 해독된 구성을 요청하기 전에 호스트 시스템 정보를 서버로 선제적으로 전송합니다. 피해 컴퓨터가 C2 서버에 연결할 수 있었지만 빈 작업 목록을 받은 몇 가지 사례는 개발자가 클라이언트 환경을 프로파일링하고 샌드박스 또는 분석 시스템이 감지되면 기본 구성을 보류하기 위해 서버 측 검사를 도입한 회피 전략을 암시합니다.

클라이언트 간 통신을 위한 암호화 키는 더 이상 C2 서버에서 동적으로 수신되지 않고, 이제 바이너리로 하드코딩됩니다. 클라이언트가 서버와 클라이언트 간 메시지를 해독하는 데 사용하는 키도 하드코딩된 상태로 유지됩니다.

최신 컴파일된 샘플에서는 함수 인라인 확장이 광범위하게 사용되는데, 사용자 정의 함수와 표준 라이브러리 및 크레이트에서 가져온 많은 함수가 호출자에 직접 인라인되는 경우가 많아 함수가 커지고 사용자 코드를 분리하기 어려워집니다. 이 동작은 LLVM의 인라이너를 사용한 결과일 가능성이 높습니다. 일부 함수는 인라인이 없는 상태로 남아 있지만, 인라인이 널리 퍼져 있으면 분석이 더욱 복잡해집니다.

Chrome의 비밀번호 관리자의 모든 항목을 가져오기 위해 EDDIESTEALER는 --remote-debugging-port=<port_num> 플래그를 사용하여 새로운 Chrome 프로세스를 생성하고 로컬 웹소켓 인터페이스를 통해 Chrome의 개발자 도구 프로토콜을 활성화하여 자격 증명 도용 루틴을 시작합니다. 이를 통해 멀웨어는 눈에 보이는 사용자 상호 작용 없이 헤드리스 방식으로 브라우저와 상호 작용할 수 있습니다.

Chrome을 실행한 후 멀웨어는 http://localhost:<port>/json/version 을 쿼리하여 webSocketDebuggerUrl 을 검색하고, 이 웹소켓을 통해 브라우저 인스턴스와 상호 작용할 수 있는 엔드포인트를 제공합니다.

이 연결을 사용하여 chrome://password-manager/passwords 매개변수와 함께 Target.createTarget 명령을 실행하여 Chrome이 새 탭에서 내부 비밀번호 관리자를 열도록 지시합니다. 이 내부 페이지는 DOM이나 개발자 도구에 직접 콘텐츠를 노출하지는 않지만, 이 페이지를 열면 Chrome이 저장된 자격 증명을 해독하여 메모리에 로드합니다. 이 동작은 브라우저에서 자격 증명이 로드된 후 일반 텍스트 자격 증명을 추출하기 위해 Chrome 프로세스 메모리를 스캔하는 CredentialKatz 유사 코드를 통해 후속 단계에서 EDDIESTEALER에 의해 악용됩니다.

해독된 문자열을 기반으로 os_crypt, encrypted_key, CryptUnprotectData, local_state_pattern, login_data_pattern, EDDIESTEALER 변형은 이전 버전과 호환되는 것으로 보이며 여전히 DPAPI 암호화를 사용하는 Chrome 버전을 지원합니다.

바이러스 토탈에서 코드 및 인프라 유사성을 통해 EDDIESTEALER의 추가 샘플( 15 )을 확인했습니다. 관찰 테이블에는 발견된 샘플, 연관된 C2 IP 주소/도메인, EDDIESTEALER를 호스팅하는 인프라 목록이 포함됩니다.

몇 가지 분석 팁

추적

제어 흐름을 더 잘 이해하고 대규모 코드 블록에서 간접 점프 또는 호출의 정확한 목적지를 정확히 파악하기 위해 바이너리 추적 기술을 활용할 수 있습니다. TinyTracer 같은 도구는 API 추적을 캡처하고 .tag 파일을 생성하여 선택한 API 호출을 어셈블리의 실행 줄에 매핑하여 기록할 수 있습니다. Rust의 표준 라이브러리 함수는 내부적으로 WinAPI를 호출하며, 표준 라이브러리의 추상화를 우회하여 WinAPI 함수를 직접 호출하는 코드도 캡처합니다. 그런 다음 태그 파일을 디컴파일러 도구로 가져와 IFL 와 같은 플러그인을 사용하여 코드 블록을 자동으로 마크업할 수 있습니다.

코드 세분화를 위한 패닉 메타데이터

패닉 메타데이터 (포함된 소스 파일 경로(.rs 파일), 줄 번호, 패닉 위치와 관련된 열 번호)는 바이너리의 여러 부분을 세분화하고 이해하는 데 유용한 단서를 제공합니다. 그러나 이는 해당 메타데이터가 바이너리에서 제거되지 않은 경우에만 해당됩니다. apps\bin\src\services\chromium.rs, apps\bin\src\structs\additional_task.rs 또는 사용자 지정 프로젝트의 일부처럼 보이는 경로는 일반적으로 애플리케이션의 고유한 로직을 가리킵니다. library<core/alloc/std>\src\ 로 시작하는 경로는 Rust 표준 라이브러리의 코드를 나타냅니다. hashbrown-0.15.2\src\raw\mod.rs 같은 상자 이름과 버전이 포함된 경로는 외부 라이브러리를 가리킵니다.

멀웨어 프로젝트에 어느 정도 체계화된 코드베이스가 있는 경우 패닉 문자열의 파일 경로가 논리 모듈에 직접 매핑될 수 있습니다. 예를 들어, 복호화된 문자열 apps\bin\src\utils\json.rs:48:39sub_140011b4c 에서 참조됩니다.

함수에 대한 수신 호출의 호출 트리를 살펴보면 많은 호출이 sub_14002699d 으로 거슬러 올라갑니다. 이 함수(sub_14002699d)는 JSON 형식으로 알려진 추가 구성 데이터를 해독한 직후에 알려진 C2 통신 루틴(jy::C2::RetrieveAndDecryptConfig) 내에서 호출됩니다.

json.rs 경로와 호출 컨텍스트를 바탕으로 추측해 보면 sub_14002699d 이 JSON 데이터 파싱을 담당한다고 볼 수 있습니다. 함수 호출을 통해 이를 확인할 수 있습니다. 물론 함수 호출에 대한 참조로 전달되는 스택 구조체를 검사하면 이제 구문 분석된 구성 필드로 채워진 힙 주소를 가리킵니다.

표준 라이브러리 및 오픈소스 타사 크레이트의 경우 파일 경로, 줄 번호, (사용 가능한 경우) rustc 커밋 해시 또는 크레이트 버전을 통해 정확한 소스 코드를 온라인으로 조회할 수 있습니다.

스택 슬롯 재사용

최적화 기능 중 하나는 타임라인이 겹치지 않는 변수/스택 구조에 스택 슬롯을 재사용하는 것입니다. 동시에 '라이브'가 아닌 변수는 동일한 스택 메모리 위치를 공유할 수 있으므로 전체 스택 프레임 크기를 줄일 수 있습니다. 기본적으로 변수는 값이 할당되는 순간부터 해당 값에 액세스할 수 있는 마지막 지점까지 라이브 상태입니다. 이렇게 하면 동일한 메모리 오프셋이 다른 지점에서 다른 유형이나 값을 보유할 수 있으므로 디컴파일된 출력이 혼란스러워집니다.

이를 처리하기 위해 함수 내에서 동일한 메모리 오프셋을 공유하는 모든 가능한 유형을 포괄하는 유니온을 정의할 수 있습니다.

Rust 오류 처리 및 열거형

Rust 열거형은 여러 변형이 있는 유형을 정의하는 태그가 지정된 공용체로, 각각 선택적으로 데이터를 보유하므로 성공 또는 실패와 같은 상태를 모델링하는 데 이상적입니다. 이형 상품은 판별자(태그)로 식별됩니다.

오류 처리 코드는 바이너리 전체에서 볼 수 있으며, 디컴파일된 코드의 상당 부분을 차지합니다. 오류 처리를 위한 Rust의 기본 메커니즘은 Result<T, E> 일반 열거형입니다. 두 가지 변형이 있습니다: Ok(T) 성공을 나타내며 T 유형의 값을 포함하는 Err(E) 과 실패를 나타내며 E 유형의 오류 값을 포함하는 의 두 가지 변형이 있습니다.

아래 예제 코드 조각에서는 0x8000000000000000 판별값을 사용하여 CreateFileW API를 처리한 결과를 구분합니다. CreateFileW 가 성공적으로 확인되면 reuse 변수 유형에 API 함수 포인터가 포함되고 else 브랜치가 실행됩니다. 그렇지 않으면 if 브랜치가 실행되어 reuse 에서 arg1 로 오류 정보 문자열을 할당합니다.

다른 일반적인 러스트 유형이 메모리에서 어떻게 보이는지에 대한 자세한 내용은 이 치트 시트와 신디 샤오의 이 놀라운 강연을 확인하세요!

멀웨어 및 MITRE ATT&CK

Elastic은 위협이 엔터프라이즈 네트워크에 대해 사용하는 일반적인 전술, 기술 및 절차를 문서화하기 위해 MITRE ATT& CK 프레임워크를 사용합니다.

전술

기술

기술은 공격자가 행동을 수행하여 전술적 목표를 달성하는 방법을 나타냅니다.

탐지

YARA

Elastic Security는 이 연구와 관련하여 다음과 같은 YARA 규칙을 만들었습니다:

행동 예방 규칙

관찰

이 연구에서는 다음과 같은 관찰 가능성에 대해 논의했습니다.

관측 가능합니다.유형이름참조
47409e09afa05fcc9c9eff2c08baca3084d923c8d82159005dbae2029e1959d0SHA-256MvUlUwagHeZd.exeEDDIESTEALER
162a8521f6156070b9a97b488ee902ac0c395714aba970a688d54305cb3e163fSHA-256:metadata (copy)EDDIESTEALER
f8b4e2ca107c4a91e180a17a845e1d7daac388bd1bb4708c222cda0eff793e7aSHA-256AegZs85U6COc.exeEDDIESTEALER
53f803179304e4fa957146507c9f936b38da21c2a3af4f9ea002a7f35f5bc23dSHA-256:metadata (copy)EDDIESTEALER
20eeae4222ff11e306fded294bebea7d3e5c5c2d8c5724792abf56997f30aaf9SHA-256PETt3Wz4DXEL.exeEDDIESTEALER
1bdc2455f32d740502e001fce51dbf2494c00f4dcadd772ea551ed231c35b9a2SHA-256Tk7n1al5m9Qc.exeEDDIESTEALER
d905ceb30816788de5ad6fa4fe108a202182dd579075c6c95b0fb26ed5520daaSHA-256YykbZ173Ysnd.exeEDDIESTEALER
b8b379ba5aff7e4ef2838517930bf20d83a1cfec5f7b284f9ee783518cb989a7SHA-2562025-04-03_20745dc4d048f67e0b62aca33be80283_akira_cobalt-strike_satacomEDDIESTEALER
f6536045ab63849c57859bbff9e6615180055c268b89c613dfed2db1f1a370f2SHA-2562025-03-23_6cc654225172ef70a189788746cbb445_akira_cobalt-strikeEDDIESTEALER
d318a70d7f4158e3fe5f38f23a241787359c55d352cb4b26a4bd007fd44d5b80SHA-2562025-03-22_c8c3e658881593d798da07a1b80f250c_akira_cobalt-strikeEDDIESTEALER
73b9259fecc2a4d0eeb0afef4f542642c26af46aa8f0ce2552241ee5507ec37fSHA-2562025-03-22_4776ff459c881a5b876da396f7324c64_akira_cobalt-strikeEDDIESTEALER
2bef71355b37c4d9cd976e0c6450bfed5f62d8ab2cf096a4f3b77f6c0cb77a3bSHA-256TWO[1].fileEDDIESTEALER
218ec38e8d749ae7a6d53e0d4d58e3acf459687c7a34f5697908aec6a2d7274dSHA-256EDDIESTEALER
5330cf6a8f4f297b9726f37f47cffac38070560cbac37a8e561e00c19e995f42SHA-256verifcheck.exeEDDIESTEALER
acae8a4d92d24b7e7cb20c0c13fd07c8ab6ed8c5f9969504a905287df1af179bSHA-2563zeG4jGjFkOy.exeEDDIESTEALER
0f5717b98e2b44964c4a5dfec4126fc35f5504f7f8dec386c0e0b0229e3482e7SHA-256verification.exeEDDIESTEALER
e8942805238f1ead8304cfdcf3d6076fa0cdf57533a5fae36380074a90d642e4SHA-256g_verify.js에디스틸러 로더
7930d6469461af84d3c47c8e40b3d6d33f169283df42d2f58206f43d42d4c9f4SHA-256verif.js에디스틸러 로더
45.144.53[.]145IPv4-addr에디스틸러 C2
84.200.154[.]47IPv4-addr에디스틸러 C2
shiglimugli[.]xyz도메인 이름에디스틸러 C2
xxxivi[.]com도메인 이름EDDIESTEALER C2 및 중간 인프라
llll[.]fit도메인 이름에디스틸러 중간 인프라
plasetplastik[.]com도메인 이름에디스틸러 중간 인프라
militrex[.]wiki도메인 이름에디스틸러 중간 인프라

참고 자료

위의 조사에서 참조한 내용은 다음과 같습니다: