
Rusty Stealer 리버스 엔지니어링: 고급 키로깅, 실시간 화면 스트리밍, 그리고 지속성을 유지하기 위한 공격적인 방어 회피(Windows Defender 종료 및 서비스 하이재킹) 기능을 갖춘 Rust 기반 RAT.
Ghidra에서 Rusty Stealer 샘플을 최초로 리버스 엔지니어링한 결과, Rust로 컴파일된 전용 키로거 모듈이 드러났습니다. 디컴파일된 뷰는 악성코드가 키코드를 확인하고 이를 특정 동작에 매핑하여 사용자 입력에 후킹하는 모습을 명확히 보여줍니다. 이는 해당 스틸러가 자격 증명, 채팅, 민감한 사용자 데이터를 수집하기 위해 키 입력을 적극적으로 기록함을 확인시켜 줍니다.
키로거 로직 (의사 C 뷰): FUN_140020ffe(&Var29, pHVar44, "key_press", 9) – "key_press" 이벤트 문자열을 동적으로 확인합니다. 특정 키에 대한 조건 검사: "Enter", "Escape", "Esc", "Tab", "Backspace", "Back". *HKEY__ pHVar37 = ... – 레지스트리 핸들 확인 (키보드 레이아웃 또는 지속성 읽기 가능성 있음) 어셈블리 뷰 (디스어셈블리): LEA R8, [local_4a8] / MOV qword ptr [R8], RAX – 키 이벤트 구조체를 메모리에 로드합니다. CALL FUN_140020ffe – 주요 키 처리 함수입니다. JZ LAB_14000f309 – 키 코드에 따른 조건부 점프 (특정 키 확인).
적극적인 키 입력 캡처: "Enter", "Tab", "Backspace" 등에 대한 명시적 검사는 악성코드가 비밀번호와 메시지를 재구성하기 위해 특수 키를 포함한 모든 키 입력을 기록함을 입증합니다. 레지스트리 상호작용: HKEY__ 핸들은 키로거가 시스템 구성을 읽거나 로그를 레지스트리에 저장할 수 있음을 시사합니다. 자격 증명 수집: "key_press" 이벤트를 창 제목과 함께 기록함으로써(이후 단계에서 확인됨) 공격자는 키 입력을 특정 애플리케이션(예: 브라우저, 뱅킹 앱)에 매핑할 수 있습니다.

Rusty Stealer의 두 번째 Ghidra 디컴파일 뷰는 이 악성코드를 표준 정보 탈취 도구를 넘어 RAT(원격 접근 트로이 목마) 영역으로 끌어올리는 기능을 드러냅니다. 이 악성코드는 파일과 키 입력을 탈취하는 것 외에도 공격자가 피해자의 데스크톱을 실시간으로 시각적으로 모니터링할 수 있도록 화면 캡처 및 라이브 스트리밍 루틴을 포함합니다.
화면 캡처 로직: FUN_140020ffe(..., "screen_stream", 0xd) – 화면 스트리밍 모듈을 명시적으로 초기화합니다. FUN_14000d9eb7("fps", 3, ...) – 라이브 스트림의 프레임 레이트(FPS)를 설정하며, CPU 사용량과 비디오 품질의 균형을 맞추기 위한 것으로 보입니다. FUN_14000c87a(..., "done", 4) / FUN_14000c87a(..., "streaming", 9) – 스트리밍 시작/중지 작업의 상태 표시자입니다. 메모리 및 버퍼 관리: if (uVar69 < 5) { uVar47 = uVar69; } – 화면 프레임에 대한 내부 버퍼링 로직입니다. 어셈블리 참조 (교차 참조): LEA R8, [s_screen_stream_14001592a] – 비교를 위해 "screen_stream" 문자열을 메모리에 로드합니다. CALL FUN_140020ffe – 스트리밍 로직의 주요 핸들러입니다.
실시간 감시: "screen_stream" 및 "fps" 문자열은 이 악성코드가 피해자의 화면을 라이브 스트리밍할 수 있음을 입증합니다. 이는 단순한 스틸러가 아닌 본격적인 RAT(njRAT 또는 Quasar 등)의 특징입니다. 데이터 유출 (시각적): 키로거는 텍스트를 수집하지만, 화면 스트리밍은 뱅킹 세션, 암호화폐 지갑, 비공개 메시지를 시각적으로 캡처하여 암호화를 완전히 우회합니다. 리소스 최적화: 특정 FPS(예: 3 FPS)를 설정한다는 것은 이 악성코드가 높은 CPU 사용량으로 사용자에게 알리지 않고 백그라운드에서 조용히 실행되도록 설계되었음을 의미합니다.

Rusty Stealer의 세 번째 디컴파일된 뷰는 매우 공격적인 방어 회피 및 세션 하이재킹 루틴을 드러냅니다. 이 악성코드는 Windows Defender를 종료하고 활성 네트워크/스트리밍 세션을 하이재킹하는(트래픽을 가로채거나 보안 모니터링을 방해할 가능성이 있음) 특정 함수를 포함합니다. 이는 Rusty Stealer가 데이터를 탈취할 뿐만 아니라 보안 도구를 적극적으로 무력화하도록 설계되었음을 확인시켜 줍니다.
Windows Defender 종료: FUN_140020ffe(..., "kill_defender", 0xd) – Defender 프로세스를 종료하기 위해 문자열을 동적으로 확인합니다. FUN_14001add55() – Defender 서비스나 프로세스를 강제로 중지하는 실행 루틴으로 보입니다. 스트림 하이재킹: FUN_140020ffe(..., "hijack_stream", 0xc) – 활성 스트림(네트워크 트래픽 또는 화면 공유)을 하이재킹하는 로직을 확인합니다. 메모리 조작 및 실행: MOVUPS xmmword ptr [R12] / MOVUPS xmmword ptr [RDX + local_550] – 빠른 메모리 복사(셸코드 또는 스트림 버퍼 준비로 보임)에 사용되는 SIMD 명령어입니다. CALL FUN_14000d55() – 하이재킹 또는 종료 루틴을 실행합니다.
Defender 무력화: kill_defender는 이 스틸러가 Windows의 내장 보안을 적극적으로 겨냥한다는 것을 입증합니다. 성공할 경우 실시간 보호를 비활성화하여 나머지 악성코드(키로거, 화면 스트리머)가 방해 없이 작동할 수 있게 합니다. 세션 하이재킹: hijack_stream은 악성코드가 활성 네트워크 스트림을 가로채거나 탈취할 수 있음을 시사합니다. 이는 실시간 세션 쿠키 탈취, 은행 거래 가로채기, 원격 관리 도구 방해 등에 사용될 수 있습니다. 설계상의 회피: error_pinned의 존재는 악성코드가 핵심 프로세스를 종료할 수 없는 방어 환경을 예상하고 있음을 보여줍니다. 아마도 재시도하거나 기법을 전환할 것입니다.

Rusty Stealer의 네 번째 디컴파일된 뷰는 시스템 정찰 모듈을 드러냅니다. 데이터를 탈취하거나 파일을 유출하기 전에, 악성코드는 호스트 이름, 사용자 이름, 운영 체제 버전, 로컬/외부 IP 주소를 포함한 피해자 머신에 대한 상세 정보를 수집합니다. 이 프로파일링 데이터는 피해자를 분류하고 공격의 다음 단계를 맞춤화하기 위해 C2 서버로 전송되는 것으로 보입니다.
시스템 프로파일링 문자열:
"hostname" – 피해자의 컴퓨터 이름을 가져옵니다. "username" – 로그인한 사용자 계정을 가져옵니다. "os_ver" – 정확한 Windows 버전과 빌드를 캡처합니다. "local_ip" – 피해자의 내부 네트워크 IP 주소를 식별합니다. "external_ip" – 공인 IP 주소를 확인합니다(외부 API를 통해 이루어질 가능성이 높음). "stream_id" – 화면 스트리밍 세션에 대한 고유 식별자를 생성합니다.
디컴파일된 로직:
FUN_1400084d2(uStack_570, "hostname", 8, ...) – 호스트 이름을 구조체에 저장합니다.
FUN_1400084d2(uStack_570, "username", 8, ...) – 사용자 이름을 저장합니다.
FUN_1400084d2(uStack_570, "os_ver", 6, ...) – OS 버전을 저장합니다.
FUN_1400084d2(uStack_570, "local_ip", 8, ...) / "external_ip" – 네트워크 식별자를 저장합니다.
메모리 구조체: HKEY__ *local_588 / CONCAT71(local_588, 0x7f, 1) – 레지스트리 관련 포인터 처리(시스템 식별자를 읽는 것으로 보임). FUN_140010ce1(..., local_3e8, ...) – 프로파일링 데이터의 최종 조립입니다.
피해자 분류: os_ver와 external_ip를 수집하면 공격자가 피해자를 필터링할 수 있습니다(예: 특정 국가, 기업 네트워크, 또는 특정 익스플로잇에 취약한 Windows 버전을 대상으로 지정). 지리적 위치 및 추적: external_ip 필드를 통해 공격자는 피해자의 지리적 위치를 파악하고 ISP를 확인할 수 있습니다. 세션 관리: stream_id는 프로파일링 데이터를 활성 화면 스트리밍 세션과 연결하여 공격자가 어떤 피해자를 보고 있는지 알 수 있게 합니다.

Rusty Stealer의 다섯 번째 디컴파일된 뷰는 Windows Service Control Manager(ADVAPI32.dll)와의 직접적인 상호작용을 통한 지속성 메커니즘을 드러냅니다. OpenServiceW 및 ControlService와 같은 API를 활용하여, 악성코드는 재부팅 후에도 살아남고 제거를 회피하기 위해 시스템 서비스를 수정, 중지 또는 재구성하려고 시도합니다.
서비스 제어 API:
ADVAPI32.DLL:OpenServiceW – 기존 서비스를 열어 구성을 수정합니다.
ADVAPI32.DLL:ControlService – 서비스에 제어 코드를 전송합니다(예: AV/EDR 서비스를 비활성화하기 위한 SERVICE_CONTROL_STOP, 또는 자체 서비스를 시작하기 위한 SERVICE_CONTROL_CONTINUE).
ADVAPI32.DLL:CloseServiceHandle – 탐지를 피하기 위해 핸들을 정리합니다.
디컴파일된 로직:
LPSERVICE_STATUS 구조체 사용 – 악성코드가 서비스를 수정하기 전에 현재 상태를 조회함을 나타냅니다.
FUN_14011c1ab – 서비스 핸들을 준비하고 서비스 제어 API를 호출하는 래퍼 함수입니다.
if (cVar3 != '\0') – 서비스가 성공적으로 열렸는지 확인하며, 그렇지 않은 경우 다른 지속성 방법으로 대체할 수 있습니다.
서비스 열거: while ((int)(longlong)...) 루프는 서비스를 반복하며, 대상(예: Windows Defender 비활성화 또는 악성 서비스 생성)을 찾기 위해 서비스를 열거하는 것으로 보입니다.
강제 지속성: 서비스를 생성하거나 수정함으로써 Rusty Stealer는 부팅할 때마다 SYSTEM 권한으로 자동 실행되도록 보장하여 수동으로 제거하기가 극히 어렵게 만듭니다. 방어 회피(서비스 종료): 중지 코드와 함께 사용되는 ControlService는 스틸러가 페이로드를 실행하기 전에 Windows Defender, EDR 에이전트 및 백업 서비스를 비활성화하는 데 자주 사용됩니다. 권한 상승: 서비스와 상호작용하려면 상승된 권한이 필요합니다. 이러한 API의 존재는 악성코드가 관리자로 실행되거나 취약점을 악용하여 SYSTEM 접근 권한을 획득함을 시사합니다. 은밀한 실행: 서비스는 백그라운드(Session 0)에서 실행되므로 사용자는 창이나 작업 관리자의 의심스러운 프로세스를 결코 볼 수 없습니다.

Ghidra를 통한 Rusty Stealer의 정적 분석은 이 악성코드가 단순한 데이터 스틸러가 아니라 Rust로 컴파일된 완전히 무장된 원격 접근 트로이 목마(RAT)임을 보여줍니다. 디컴파일된 로직과 어셈블리를 분석하여 시스템 정찰 및 자격 증명 탈취부터 능동적인 방어 회피와 지속적인 원격 제어에 이르는 완전한 공격 생명주기를 파악했습니다.
고급 키로깅: 전용 루틴이 사용자 입력(key_press, Enter, Tab)을 적극적으로 가로채어 자격 증명과 채팅을 수집합니다. 실시간 화면 스트리밍: screen_stream 및 FPS 구성의 존재는 감시 도구로 작동하여 피해자의 데스크톱을 실시간 스트리밍할 수 있는 능력을 드러냅니다. 공격적인 방어 회피: 악성코드는 Windows Defender를 종료하는 명시적 함수(kill_defender)와 함께 보안 서비스를 비활성화하고 SYSTEM 수준의 지속성을 확립하기 위한 서비스 조작 API(OpenServiceW, ControlService)를 포함합니다. 세션 하이재킹: hijack_stream 루틴은 활성 네트워크 또는 애플리케이션 스트림을 가로채어 실시간 세션을 탈취할 수 있는 능력을 시사합니다. 시스템 프로파일링: 공격을 맞춤화하고 대상을 지리적으로 특정하기 위해 피해자 텔레메트리(hostname, username, os_ver, local_ip, external_ip)를 광범위하게 수집합니다.
전체 평가: