C0XMO: 교차 플랫폼 전파를 가진 새로운 Gafgyt 변종
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 및 도메인은 방화벽에서 차단되어야 하며, 침해된 장치는 포렌식 검토 및 완전한 정리를 위해 격리되어야 합니다.
graph TB %% Class definitions classDef technique fill:#ffcc99 classDef action fill:#99ff99 classDef malware fill:#ff9999 classDef tool fill:#ccccff classDef process fill:#ffdd66 %% Nodes tech_scanning[“<b>기술</b> – <b>T1595.002 능동 스캐닝</b><br/><b>설명</b>: 열린 포트와 취약한 서비스를 찾기 위해 IP 범위를 스캔합니다.”] class tech_scanning technique tech_exploit_upnp[“<b>기술</b> – <b>T1546.017 이벤트 기반 실행: Udev 규칙</b><br/><b>설명</b>: CVE-2021-27137 UPnP 취약점을 악용하는 조작된 UDP M-SEARCH를 통해 코드 실행을 유발합니다.”] class tech_exploit_upnp technique tech_exploit_other[“<b>기술</b> – <b>T1210 원격 서비스 악용</b><br/><b>설명</b>: CVE-2015-2051 및 CVE-2022-35914와 같은 추가 HTTP/UPnP 취약점을 악용합니다.”] class tech_exploit_other technique tech_hijack_exec[“<b>기술</b> – <b>T1574.005 실행 흐름 하이재킹: 실행 가능한 설치 파일 권한 취약점</b><br/><b>설명</b>: 실행 권한이 있는 악성 ELF 바이너리를 숨겨진 위치에 배치합니다.”] class tech_hijack_exec technique tech_persistence_cron[“<b>기술</b> – <b>T1053.003 예약 작업/작업: Cron</b><br/><b>설명</b>: 15분마다 페이로드를 실행하는 cron 작업을 생성합니다.”] class tech_persistence_cron technique tech_shell_mod[“<b>기술</b> – <b>T1546.004 이벤트 기반 실행: Unix 셸 구성 수정</b><br/><b>설명</b>: ~/.bashrc, ~/.profile 및 ~/.bash_profile에 명령을 추가합니다.”] class tech_shell_mod technique tech_compromise_binary[“<b>기술</b> – <b>T1554 호스트 소프트웨어 바이너리 손상</b><br/><b>설명</b>: 제어를 유지하기 위해 숨겨진 위치에 바이너리를 설치하거나 교체합니다.”] class tech_compromise_binary technique tech_bruteforce[“<b>기술</b> – <b>T1110 무차별 대입 공격</b><br/><b>설명</b>: Telnet 및 SSH를 대상으로 자격 증명 추측 공격을 수행합니다.”] class tech_bruteforce technique tech_forced_auth[“<b>기술</b> – <b>T1187 강제 인증</b><br/><b>설명</b>: 기본 또는 취약한 자격 증명을 이용하여 접근 권한을 획득합니다.”] class tech_forced_auth technique tech_remote_ssh[“<b>기술</b> – <b>T1021.004 원격 서비스: SSH</b><br/><b>설명</b>: 탈취한 자격 증명을 사용하여 SSH/Telnet을 통해 추가 장치에 로그인합니다.”] class tech_remote_ssh technique tech_indicator_removal[“<b>기술</b> – <b>T1070.009 흔적 제거: 지속성 삭제</b><br/><b>설명</b>: 경쟁 악성코드 바이너리와 지속성 메커니즘을 종료하고 삭제합니다.”] class tech_indicator_removal technique tech_exclusive_control[“<b>기술</b> – <b>T1668 독점적 제어</b><br/><b>설명</b>: 단독 제어를 유지하기 위해 경쟁 봇넷의 파일과 cron 작업을 제거합니다.”] class tech_exclusive_control technique tech_nonstandard_port[“<b>기술</b> – <b>T1571 비표준 포트</b><br/><b>설명</b>: 사용자 지정 프로토콜을 사용하여 TCP 포트 15527을 통해 C2와 통신합니다.”] class tech_nonstandard_port technique malware_c0xmo[“<b>악성코드</b> – C0XMO<br/><b>역할</b>: 스캐닝, 악용 및 지속성을 수행하는 봇넷 페이로드.”] class malware_c0xmo malware process_upnp_exploit[“<b>프로세스</b> – 조작된 UDP M-SEARCH 전송”] class process_upnp_exploit process process_elf_deploy[“<b>프로세스</b> – ELF 바이너리를 /tmp/.sys, /var/tmp/.sys, /dev/shm/.sys 에 배포”] class process_elf_deploy process process_cron_setup[“<b>프로세스</b> – 15분마다 실행되는 cron 항목 작성”] class process_cron_setup process process_shell_mod[“<b>프로세스</b> – 셸 rc 파일에 페이로드 호출 추가”] class process_shell_mod process process_brute[“<b>프로세스</b> – IP 스캔 및 Telnet/SSH 무차별 대입 공격 수행”] class process_brute process process_c2[“<b>프로세스</b> – 포트 15527에서 C2 채널 유지”] class process_c2 process %% Connections tech_scanning –>|이어짐| tech_exploit_upnp tech_scanning –>|추가로_유발| tech_exploit_other tech_exploit_upnp –>|실행| process_upnp_exploit process_upnp_exploit –>|배포| malware_c0xmo malware_c0xmo –>|배치| tech_hijack_exec tech_hijack_exec –>|결과적으로_생성| process_elf_deploy process_elf_deploy –>|가능하게_함| tech_compromise_binary tech_compromise_binary –>|지원| tech_persistence_cron tech_compromise_binary –>|지원| tech_shell_mod tech_persistence_cron –>|생성| process_cron_setup tech_shell_mod –>|생성| process_shell_mod malware_c0xmo –>|수행| tech_bruteforce malware_c0xmo –>|수행| tech_forced_auth tech_bruteforce –>|가능하게_함| process_brute tech_forced_auth –>|가능하게_함| process_brute process_brute –>|자격_증명_획득| tech_remote_ssh tech_remote_ssh –>|다른_호스트로_확산| malware_c0xmo malware_c0xmo –>|경쟁_제거에_사용| tech_indicator_removal malware_c0xmo –>|독점적_제어_유지에_사용| tech_exclusive_control malware_c0xmo –>|C2와_통신| tech_nonstandard_port tech_nonstandard_port –>|사용| process_c2
공격 플로우
탐지
직접 실행을 위한 크론탭 사용 가능성 (cmdline를 통해)
보기
표준 도구를 통한 원격 파일 업로드 / 다운로드 (cmdline를 통해)
보기
리눅스 호스트에 숨김 파일 생성됨 (file_event 통해)
보기
IOCs (HashSha256)를 탐지: 새 Gafgyt 변종 C0XMO의 크로스 플랫폼 전파
보기
IOCs (SourceIP)를 탐지: 새 Gafgyt 변종 C0XMO의 크로스 플랫폼 전파
보기
IOCs (DestinationIP)를 탐지: 새 Gafgyt 변종 C0XMO의 크로스 플랫폼 전파
보기
C0XMO 봇넷 C2 통신 탐지 [방화벽]
보기
C0XMO Gafgyt 변종 페이로드 다운로드 탐지 [리눅스 프로세스 생성]
보기
C0XMO 악성코드 파일 작업 탐지 [리눅스 파일 이벤트]
보기
C0XMO 프로세스 스캔 및 지속성 검사 [리눅스 프로세스 생성]
보기
시뮬레이션 실행
필수 조건: 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