SOC Prime Bias: Medium

16 4월 2026 16:46

북한 사파리 캠페인, RAT 배포

Author Photo
Ruslan Mikhalov SOC Prime에서 위협 연구 책임자 linkedin icon 팔로우
북한 사파리 캠페인, RAT 배포
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

이 기사는 라자루스 그룹의 유명한 Chollima 단위와 연결된 Mach-O Man이라는 새로운 macOS 멀웨어 프레임워크를 설명합니다. 이 멀웨어는 손상된 텔레그램 계정과 피해자가 클릭픽스 명령을 장치에서 실행하도록 유도하는 가짜 회의 초대를 통해 배포됩니다. 툴킷에는 호스트 세부 정보를 수집하고, 지속성을 유지하고, 자격 증명 및 브라우저 데이터를 훔치기 위한 여러 Mach-O 바이너리가 포함되어 있으며, 탈취는 텔레그램을 통해 이루어집니다. 이 캠페인은 주로 암호화폐 거래소 및 금융 부문의 기타 조직에 초점을 맞추고 있습니다.

조사

연구원들은 스테이징 바이너리 teamsSDK.bin 을 악성 명령 시퀀스를 통해 다운로드하고 실행함을 확인했습니다. 추가 컴포넌트로는 D1yCPUyk.bin, minst2.binmacrasv2가 있으며, 시스템을 열거하고, 지속성을 위한 LaunchAgent를 생성하고, 브라우저 확장 기능, 키체인 데이터, 쿠키를 수집하는 데 사용되었습니다. 명령 및 제어 통신은 인증되지 않은 /info 엔드포인트를 노출하고 텔레그램 봇 API 토큰을 유출하는 Go 기반 HTTP 서버에 의존했습니다. 조사관들은 또한 C2 호스트에 노출된 RDP, WinRM, Chrome 원격 데스크톱과 같은 원격 액세스 서비스를 발견했습니다.

완화 조치

사용자는 원치 않는 회의 링크와의 상호 작용을 피하고, 예상치 못한 대화 중에 제안된 모든 터미널 명령어의 정당성을 확인해야 합니다. 조직은 승인되지 않은 LaunchAgents를 모니터링하고, macOS 바이너리에 신뢰할 수 있는 코드 서명을 요구하며, 알려지지 않은 파일의 실행을 제한해야 합니다. 네트워크 방어는 의심스러운 Go 기반 HTTP 서버로의 아웃바운드 연결을 차단해야 하며 Go-http-client 사용자 에이전트를 사용하는 트래픽을 플래그해야 합니다. 텔레그램 봇 토큰은 노출로부터 보호되어야 하며, 원격 데스크톱 서비스는 최소 권한 접근 제어로 잠겨야 합니다.

대응 조치

보안 팀은 알 수 없는 .bin 파일의 실행을 감지하고 com.onedrive.launcher이름의 LaunchAgents 생성 모니터링을 수행해야 합니다. 또한 Go-http-client 사용자 에이전트를 사용하여 의심스러운 인프라로의 아웃바운드 연결에 대한 경고가 활성화되어야 하며, /info 엔드포인트로의 반복적인 POST 요청에서도 경고가 트리거되어야 합니다. 방어자는 알 수 없는 봇 토큰과 연결된 예상치 않은 텔레그램 API 활동을 주시해야 합니다. 모든 악성 바이너리를 식별하고 제거하기 위한 전체 호스트 포렌식이 수행되어야 하며, 타협되었을 가능성이 있는 계정의 자격 증명 재설정이 수행되어야 합니다.

“graph TB %% Class Definitions Section classDef action fill:#99ccff classDef tool fill:#cccccc classDef malware fill:#ffcc99 classDef process fill:#e6ffe6 classDef file fill:#ffe6cc classDef service fill:#e6e6ff %% Node Definitions initial_access_user_execution[“ActionT1204.001 User Execution
Victim clicks a malicious u201cfixu201d link in a Telegram meeting that runs a curl command”] class initial_access_user_execution action tool_curl[“ToolName: curl
Description: commandu2011line utility to transfer data from or to a server”] class tool_curl tool file_teamsSDK_bin[“FileName: teamsSDK.bin (Machu2011O)
Description: Stager binary downloaded and executed”] class file_teamsSDK_bin file process_curl_download[“Process – curl download and execute teamsSDK.bin”] class process_curl_download process malware_teamsSDK[“MalwareName: teamsSDK
Description: contacts C2 after execution”] class malware_teamsSDK malware service_go_http[“Service – Go based HTTP server
Port: 80/443
Endpoint: /info (unauthenticated)”] class service_go_http service process_c2_communication[“Process – Communicates with C2 via HTTP POST to /info”] class process_c2_communication process file_minst2_bin[“FileName: minst2.bin”] class file_minst2_bin file process_install_launchagent[“Process – Installs LaunchAgent plist for persistence”] class process_install_launchagent process malware_fake_onedrive[“Malware – Fake u201cOneDriveu201d binary launched at login”] class malware_fake_onedrive malware tool_macrasv2[“ToolName: macrasv2
Description: extracts Keychain entries, browser passwords, cookies, extensions”] class tool_macrasv2 tool process_keychain_extraction[“Process – Extracts macOS Keychain and browser data”] class process_keychain_extraction process action_discovery_system_info[“ActionT1082 System Information Discovery
Collects CPU ID, hostname, user, installed apps”] class action_discovery_system_info action action_discovery_software[“ActionT1518 Software Discovery
Enumerates installed browsers and extensions”] class action_discovery_software action service_telegram_bot[“Service – Telegram Bot API
Purpose: Receive exfiltrated credentials”] class service_telegram_bot service process_exfiltration[“Process – Sends collected data to Telegram bot”] class process_exfiltration process action_content_injection[“ActionT1659 Content Injection
Unauthenticated /info endpoint permits arbitrary file upload”] class action_content_injection action action_dynamic_resolution[“ActionT1568 Dynamic Resolution
Resolves C2 domain at runtime”] class action_dynamic_resolution action %% Connections initial_access_user_execution –>|uses| tool_curl tool_curl –>|downloads| file_teamsSDK_bin file_teamsSDK_bin –>|executed by| process_curl_download process_curl_download –>|runs| malware_teamsSDK malware_teamsSDK –>|communicates with| service_go_http service_go_http –>|receives data via| process_c2_communication process_c2_communication –>|triggers| file_minst2_bin file_minst2_bin –>|installs| process_install_launchagent process_install_launchagent –>|creates| malware_fake_onedrive malware_fake_onedrive –>|executes at login| action_discovery_system_info action_discovery_system_info –>|leads to| action_discovery_software action_discovery_software –>|provides data to| tool_macrasv2 tool_macrasv2 –>|performs| process_keychain_extraction process_keychain_extraction –>|gives data to| process_exfiltration process_exfiltration –>|sends to| service_telegram_bot malware_teamsSDK –>|enables| action_content_injection action_content_injection –>|allows| file_minst2_bin malware_teamsSDK –>|enables| action_dynamic_resolution action_dynamic_resolution –>|resolves| service_go_http “

공격 흐름

시뮬레이션 실행

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

이유: 이 섹션은 적의 기술(T1546.006 / T1587.001) 실행을 정확하게 설명하여 탐지 규칙을 발동하도록 설계되었습니다. 명령어는 Mach-O Man 바이너리의 현실적인 “living-off-the-land” 배포 형태를 반영합니다.

  • 공격 서사 및 명령어:

    1. macOS 호스트에 이미 발판을 마련한 공격자는 스테이징 위치(/tmp/stage)에서 쓰기 가능한 디렉토리(/usr/local/bin).
    2. 으로 네 개의 Mach-O Man 바이너리를 복사합니다. 바이너리는 실행 가능하게 만들어져 초기화, 정찰, 지속성, 자격 증명 절도 단계를 모방하여 순차적으로 실행됩니다.
    3. 지속성은 minst2.bin.
    # Step 1 – Stage the binaries (simulated by copying from a test assets folder)
    mkdir -p /usr/local/bin/macho
    cp ./assets/teamsSDK.bin /usr/local/bin/macho/
    cp ./assets/D1YrHRTg.bin /usr/local/bin/macho/
    cp ./assets/minst2.bin   /usr/local/bin/macho/
    cp ./assets/macrasv2    /usr/local/bin/macho/
    
    # Step 2 – Make them executable
    chmod +x /usr/local/bin/macho/*.bin
    
    # Step 3 – Execute the stager and reconnaissance binaries
    /usr/local/bin/macho/teamsSDK.bin &
    /usr/local/bin/macho/D1YrHRTg.bin &
    
    # Step 4 – Install persistence (launch daemon) for minst2.bin
    cat <<'EOF' > /Library/LaunchDaemons/com.macho.minst2.plist
    
    
    
    
        Labelcom.macho.minst2
        ProgramArguments
        
            /usr/local/bin/macho/minst2.bin
        
        RunAtLoad
    
    
    EOF
    sudo launchctl load -w /Library/LaunchDaemons/com.macho.minst2.plist
    
    # Step 5 – Execute the credential-theft/exfil component
    /usr/local/bin/macho/macrasv2 &
  • 회귀 테스트 스크립트: (위의 단계를 재현하는 자체 포함 bash 스크립트)

    #!/usr/bin/env bash
    set -euo pipefail
    
    # --- VARIABLES -------------------------------------------------
    BIN_DIR="/usr/local/bin/macho"
    ASSET_DIR="$(pwd)/assets"
    PLIST="/Library/LaunchDaemons/com.macho.minst2.plist"
    
    # --- PRE-CHECK -------------------------------------------------
    if [[ $(id -u) -ne 0 ]]; then
      echo "Script requires root to install launch daemon. Re-run with sudo."
      exit 1
    fi
    
    # --- DEPLOY BINARIES -------------------------------------------
    mkdir -p "$BIN_DIR"
    for bin in teamsSDK.bin D1YrHRTg.bin minst2.bin macrasv2; do
      cp "$ASSET_DIR/$bin" "$BIN_DIR/$bin"
      chmod +x "$BIN_DIR/$bin"
    done
    
    # --- EXECUTE STAGER & RECON ------------------------------------
    "$BIN_DIR/teamsSDK.bin" &
    "$BIN_DIR/D1YrHRTg.bin" &
    
    # --- PERSISTENCE (launch daemon) -------------------------------
    cat <<'EOF' > "$PLIST"
    
    
    
    
        Labelcom.macho.minst2
        ProgramArguments
        
            /usr/local/bin/macho/minst2.bin
        
        RunAtLoad
    
    
    EOF
    launchctl load -w "$PLIST"
    
    # --- EXECUTE CREDENTIAL THEFT COMPONENT -----------------------
    "$BIN_DIR/macrasv2" &
    
    echo "Simulation executed – wait a few seconds for telemetry to appear."
  • 클린업 명령:

    #!/usr/bin/env bash
    set -euo pipefail
    
    BIN_DIR="/usr/local/bin/macho"
    PLIST="/Library/LaunchDaemons/com.macho.minst2.plist"
    
    # Unload launch daemon
    if [[ -f "$PLIST" ]]; then
      sudo launchctl unload -w "$PLIST"
      sudo rm -f "$PLIST"
    fi
    
    # Kill any lingering malicious processes
    pkill -f teamsSDK.bin || true
    pkill -f D1YrHRTg.bin || true
    pkill -f minst2.bin   || true
    pkill -f macrasv2    || true
    
    # Remove binaries
    sudo rm -rf "$BIN_DIR"
    
    echo "Cleanup complete."