SOC Prime Bias: 심각

05 Jun 2026 15:40 UTC

C0XMO: 교차 플랫폼 전파를 가진 새로운 Gafgyt 변종

Author Photo
SOC Prime Team linkedin icon 팔로우
C0XMO: 교차 플랫폼 전파를 가진 새로운 Gafgyt 변종
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

요약

FortiGuard Labs는 C0XMO라는 새로운 Gafgyt 봇넷 변종을 확인했으며, 이는 DD-WRT 라우터의 버퍼 오버플로 취약점을 악용하여 전파됩니다. 이 취약점은 CVE-2021-27137로 추적됩니다. 이 악성코드는 다양한 CPU 아키텍처에서 감염을 확산하기 위해 별도의 Python 기반 스캐너를 사용하며, 약한 자격 증명 공격, 여러 가지 DDoS 기능 및 경쟁하는 악성코드를 제거하는 루틴에도 의존합니다. 감염 후에는 숨김 파일, 크론 작업, 셸 프로필 변경을 통해 지속성을 유지한 후 명령 및 제어 서버에 연결합니다. 이 보고서에는 노출된 IoT 장치를 운영하는 조직을 위한 지침과 방어에 대한 지표가 포함되어 있습니다.

조사

분석 결과 C0XMO가 DD-WRT UPnP 서비스에서 CVE-2021-27137 를 악용하여 초기 접근을 확보한 후, 217.160.125.125:15527에서 Python 스캐너를 가져옵니다. 이 스캐너는 텔넷 및 SSH 강제 공격을 수행하고, 여러 HTTP 기반 exploit 요청을 실행하며, 대상 환경에 따라 아키텍처 별 바이너리를 배포합니다. 지속성은 /tmp, /var/tmp, /dev/shm과 같은 위치에 숨김 파일을 배치하고, 사용자 홈 디렉토리, 크론 작업 엔트리 및 셸 프로파일 수정을 통해 유지됩니다. 그 후 악성코드는 85.215.131.70 의 C2 인프라와 맞춤형 핸드셰이크 시퀀스를 사용하여 통신합니다.

완화 방안

조직은 DD-WRT 펌웨어를 changeset 45723 보다 최신 릴리스로 업그레이드하고 관련 CVE의 수정을 적용해야 합니다. 불필요한 원격 서비스 (UPnP, Telnet 및 SSH 등)는 인터넷에 노출된 장치에서 가능하면 비활성화해야 합니다. 모든 엣지 장치에 대해 강력하고 고유한 자격 증명 사용을 강제하여야 하며, 노출된 서비스는 정기적으로 검토되어야 합니다. 식별된 IP 주소, 포트 및 악성 명령 패턴에 대해 네트워크 기반 탐지를 배치해야 합니다.

대응

방어자는 알려진 C2 인프라와 스캐너 다운로드 포트에 대한 연결을 모니터링해야 합니다. 숨겨진 파일 이름 .sys, 15분마다 실행되는 크론 변경 및 스캐너 스크립트 실행에 대한 경고가 설정되어야 합니다. 식별된 악성 IP 및 도메인은 방화벽에서 차단되어야 하며, 침해된 장치는 포렌식 검토 및 완전한 정리를 위해 격리되어야 합니다.

공격 플로우

시뮬레이션 실행

필수 조건: Telemetry & Baseline 사전 점검이 통과해야 합니다.

근거: 이 섹션은 탐지 규칙을 트리거하기 위해 설계된 적대적인 기술 (TTP)의 구체적인 실행을 설명합니다. 명령어와 내러티브는 식별된 TTP를 구체적으로 반영하고 탐지 논리가 기대하는 정확한 텔레메트리를 생성해야 합니다.

  • 공격 내러티브 및 명령어:
    당사의 봇은 이미 서비스 실행 (T1546.007)을 통해 감염된 호스트에 설치되어, 하드코딩된 서버 217.160.125.125와 포트 15527에서 C2 핸드셰이크를 시작합니다. 연결은 TCP 소켓을 사용하여 명령을 끌어오며, 규칙의 기준과 정확히 일치합니다. 이 활동은 C0XMO 봇넷의 ‘홈으로 전화’ 행동에 일반적입니다.

  • 회귀 테스트 스크립트:

    # C0XMO C2 통신 시뮬레이션 – Sigma 규칙을 트리거합니다
    $c2Ip = "217.160.125.125"
    $c2Port = 15527
    
    # TCP 연결을 열고 최소한의 페이로드 전송 후 종료
    $client = New-Object System.Net.Sockets.TcpClient
    $client.Connect($c2Ip, $c2Port)
    
    $stream = $client.GetStream()
    $payload = [System.Text.Encoding]::ASCII.GetBytes("PING`n")
    $stream.Write($payload, 0, $payload.Length)
    
    # 실제 지연을 모방하기 위해 잠시 대기
    Start-Sleep -Seconds 2
    
    $stream.Close()
    $client.Close()
  • 정리 명령어:

    # 영속적인 변화는 없었으므로 열린 소켓이 있는지 확인하고 닫습니다
    # (스크립트는 이미 소켓을 닫습니다; 이는 안전망입니다.)
    Get-Process -Name "powershell" | Where-Object { $_.MainWindowTitle -eq "" } | Stop-Process -Force