북한 사파리 캠페인, RAT 배포
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
이 기사는 라자루스 그룹의 유명한 Chollima 단위와 연결된 Mach-O Man이라는 새로운 macOS 멀웨어 프레임워크를 설명합니다. 이 멀웨어는 손상된 텔레그램 계정과 피해자가 클릭픽스 명령을 장치에서 실행하도록 유도하는 가짜 회의 초대를 통해 배포됩니다. 툴킷에는 호스트 세부 정보를 수집하고, 지속성을 유지하고, 자격 증명 및 브라우저 데이터를 훔치기 위한 여러 Mach-O 바이너리가 포함되어 있으며, 탈취는 텔레그램을 통해 이루어집니다. 이 캠페인은 주로 암호화폐 거래소 및 금융 부문의 기타 조직에 초점을 맞추고 있습니다.
조사
연구원들은 스테이징 바이너리 teamsSDK.bin 을 악성 명령 시퀀스를 통해 다운로드하고 실행함을 확인했습니다. 추가 컴포넌트로는 D1yCPUyk.bin, minst2.bin 및 macrasv2가 있으며, 시스템을 열거하고, 지속성을 위한 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[“Action – T1204.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[“Tool – Name: curl
Description: commandu2011line utility to transfer data from or to a server”]
class tool_curl tool
file_teamsSDK_bin[“File – Name: 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[“Malware – Name: 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[“File – Name: 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[“Tool – Name: 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[“Action – T1082 System Information Discovery
Collects CPU ID, hostname, user, installed apps”]
class action_discovery_system_info action
action_discovery_software[“Action – T1518 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[“Action – T1659 Content Injection
Unauthenticated /info endpoint permits arbitrary file upload”]
class action_content_injection action
action_dynamic_resolution[“Action – T1568 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” 배포 형태를 반영합니다.
-
공격 서사 및 명령어:
- macOS 호스트에 이미 발판을 마련한 공격자는 스테이징 위치(
/tmp/stage)에서 쓰기 가능한 디렉토리(/usr/local/bin). - 으로 네 개의 Mach-O Man 바이너리를 복사합니다. 바이너리는 실행 가능하게 만들어져 초기화, 정찰, 지속성, 자격 증명 절도 단계를 모방하여 순차적으로 실행됩니다.
- 지속성은
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 EOF sudo launchctl load -w /Library/LaunchDaemons/com.macho.minst2.plist # Step 5 – Execute the credential-theft/exfil component /usr/local/bin/macho/macrasv2 &Label com.macho.minst2 ProgramArguments /usr/local/bin/macho/minst2.bin RunAtLoad - macOS 호스트에 이미 발판을 마련한 공격자는 스테이징 위치(
-
회귀 테스트 스크립트: (위의 단계를 재현하는 자체 포함 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" EOF launchctl load -w "$PLIST" # --- EXECUTE CREDENTIAL THEFT COMPONENT ----------------------- "$BIN_DIR/macrasv2" & echo "Simulation executed – wait a few seconds for telemetry to appear."Label com.macho.minst2 ProgramArguments /usr/local/bin/macho/minst2.bin RunAtLoad -
클린업 명령:
#!/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."