SOC Prime Bias: 중간

09 Dec 2025 15:46 UTC

캐슬 RAT 클라이언트 멀웨어: 전술, 기법 및 거래기법

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon 팔로우
캐슬 RAT 클라이언트 멀웨어: 전술, 기법 및 거래기법
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

CastleRAT는 처음 2025년 3월에 관찰된 원격 액세스 트로이 목마로, Python 및 컴파일된 C 변형으로 제공됩니다. 시스템 메타데이터, 키 입력 기록, 클립보드 내용, 스크린샷 및 미디어 장치 세부 정보를 수집한 후 RC4 암호화를 사용하여 이 정보를 C2 서버로 유출합니다. 이 맬웨어는 추가적인 페이로드를 가져와서 rundll32를 통해 실행하고 예약된 작업 및 UAC 우회 방법을 통해 지속성을 구축할 수 있습니다.

조사

Splunk 위협 연구팀은 Python 및 C 구현을 리버스 엔지니어링하여 시스템 탐색, 키로깅, 화면 캡처, 오디오/비디오 장치 열거, 데드 드랍 리졸버 및 권한 상승을 위한 핸들 중복 등 MITRE ATT&CK 기술에 그들의 행동을 매핑했습니다. 이 연구는 CastleRAT이 정식 Windows 바이너리(rundll32 및 ComputerDefaults.exe)에 의존하며, 공용 IP 주소를 얻기 위해 www.ip-api.com을 사용한다는 점에 중점을 두었습니다.

완화

방어자는 알 수 없는 도메인으로의 의심스러운 외부 연결, RC4로 암호화된 트래픽 패턴 및 ordinal 기반 DLL 로드를 사용하는 rundll32 실행을 탐지해야 합니다. CastleRAT을 시작하기 위해 생성된 예약된 작업, ComputerDefaults.exe를 활용한 UAC 우회 시도 및 뮤트된 오디오 브라우저 플래그로 시작된 프로세스를 모니터링합니다. 악용된 Steam 커뮤니티 페이지를 포함하여 알려진 데드 드랍 리졸버 위치에 대한 접근을 차단합니다.

대응

CastleRAT 활동이 식별되면, 영향을 받은 호스트를 격리하고 악성 프로세스를 종료하며 관련된 모든 예약 작업이나 지속성 아티팩트를 제거합니다. 프로세스 계층, 명령줄 인수, 레지스트리 변경과 같은 포렌식 증거를 수집합니다. 추가 DLL 플러그인 및 C2 채널을 포괄적으로 추적한 후, 넓은 환경에 대한 복구 및 강화 조치를 전개합니다.

공격 흐름

시뮬레이션 실행

필수 조건: 원격 시스템 베이스라인 사전 점검이 성공해야 합니다.

합리성: 이 섹션은 탐지 규칙을 트리거하도록 설계된 적 기법(TTP)의 정확한 실행을 자세히 설명합니다. 명령어와 내러티브는 식별된 TTP를 직접 반영하고 탐지 논리가 예상하는 정확한 텔레메트리를 생성해야 합니다. 추상적이거나 관련 없는 예는 오진으로 이어질 수 있습니다.

  • 공격 내러티브 및 명령어:

    1. 단계 1 – CastleRAT 바이너리 배포: 공격자가 CastleRAT.exe 를 피해자의 %APPDATA% 디렉토리에 복사하여 사용자 데이터와 조화시킵니다.
    2. 단계 2 – 키로깅 실행: 작은 C# 메모리 내 로더를 사용하여 공격자는 SetWindowsHookEx 를 호출하여 낮은 수준의 키보드 훅을 설치하며, 이는 Sysmon이 프로세스 생성 이벤트의 CallTrace에 API를 기록하도록 만듭니다.
    3. 단계 3 – 권한 상승: 같은 로더가 DuplicateHandle 을 호출하여 권한이 높은 시스템 프로세스(예: lsass.exe)로부터 핸들을 중복하여 맬웨어가 SYSTEM 권한으로 실행되도록 합니다. 두 API 호출은 동일한 Sysmon CallTrace에 나타나며, 탐지 규칙의 기준을 충족합니다.
  • 회기 테스트 스크립트:

    # -------------------------------------------------
    # CastleRAT 시뮬레이션 – SetWindowsHookEx 및 DuplicateHandle 트리거
    # -------------------------------------------------
    $castlePath = "$env:APPDATACastleRAT.exe"
    
    # 1. 실제 페이로드를 로드하는 최소한의 스텁 드롭(여기서는 시뮬레이션됨)
    $payload = @"
    using System;
    using System.Runtime.InteropServices;
    public class Loader {
        [DllImport("user32.dll")]
        public static extern IntPtr SetWindowsHookEx(int idHook, IntPtr lpfn, IntPtr hMod, uint dwThreadId);
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool DuplicateHandle(IntPtr hSourceProcessHandle,
                                                  IntPtr hSourceHandle,
                                                  IntPtr hTargetProcessHandle,
                                                  out IntPtr lpTargetHandle,
                                                  uint dwDesiredAccess,
                                                  bool bInheritHandle,
                                                  uint dwOptions);
        public static void Execute() {
            // Install a low‑level keyboard hook (WH_KEYBOARD_LL = 13)
            SetWindowsHookEx(13, IntPtr.Zero, IntPtr.Zero, 0);
            // Duplicate a handle from the current process (simulated)
            IntPtr dupHandle;
            DuplicateHandle((IntPtr)-1, (IntPtr)0x1234, (IntPtr)-1, out dupHandle, 0, false, 0);
        }
    }

“@

# Compile the C# code on‑the‑fly
Add-Type -TypeDefinition $payload -Language CSharp

# Copy the current PowerShell process (acts as CastleRAT.exe) to the target path
Copy-Item -Path $PSCommandPath -Destination $castlePath -Force

# Execute the malicious payload
[Loader]::Execute()

# Keep the process alive briefly to ensure Sysmon logs the call stack
Start-Sleep -Seconds 5
  • 정리 명령어:

    # 가상 CastleRAT 바이너리 제거
    Remove-Item -Path "$env:APPDATACastleRAT.exe" -Force
    
    # 모든 훅 언로드 (필요 없지만 포괄성을 위해 포함)
    # 위에서 사용한 NULL 콜백과 함께 설정된 SetWindowsHookEx 호출에 대한 명시적 언로드가 필요 없음.