
MuddyWater 연계 donut 로더, IP 리터럴로 직결 통신
실행 파일 한 점이 curl 사용자 에이전트를 흉내 내며 도메인 없이 IP 주소로 곧장 HTTP 요청을 보내는 정황이 확인됐다. CPU 타이머 기반 샌드박스 회피와 네덜란드 호스팅의 37일짜리 단명 인증서가 같은 세트로 묶이며, 배후로는 MuddyWater 계열 다섯 개 별칭이 함께 지목된다.
curl 방식 그대로, IP 리터럴에 꽂히는 로더
실행 파일 한 점이 도메인을 거치지 않고 IP 주소 리터럴을 향해 curl 방식의 HTTP 요청을 내보내는 정황이 뚜렷하게 포착됐다. 이 통신 패턴은 서로 다른 관리 주체가 운영하는 네 개의 침입탐지 서명 — ET POLICY curl User-Agent Outbound, ET HUNTING curl User-Agent to Dotted Quad, TGI HUNT Curl to IP Address, POLICY-OTHER HTTP request by IPv4 address attempt — 이 같은 샘플에서 동시에 발화했다는 사실로 뒷받침된다. 탐지엔진 57곳이 이 실행 파일(9b8d5132…, 이하 로더)을 donut/dump 계열 트로이목마로 분류했고, dump·marte라는 별칭이 함께 붙는다. 이번에 손에 쥔 흔적은 실행 파일 한 점과 IP 하나, 그리고 정체를 특정할 수 없는 파일 하나뿐으로 결코 두껍지 않지만, 그 안에 들어 있는 기법 조합만큼은 또렷하게 읽힌다.
주목할 지점은 인프라의 규모가 아니라 운용의 결이다. curl 사용자 에이전트를 그대로 흉내 낸 트래픽, CPU 타이머를 직접 읽어 분석 환경 여부를 판별하는 루틴, 그리고 37일짜리 단명 인증서를 두른 네덜란드 호스팅 노드가 한 세트로 묶인다. 인프라 한 조각, 파일 한 점이라는 얇은 표본에서 이런 조합이 나온다는 사실 자체가 분석적으로 흥미롭다. 이하에서는 이 로더가 어떻게 작동하고, 무엇을 향해 통신하며, 그 뒤에 어떤 운영 방식이 숨어 있는지를 차례로 짚는다.
이 로더가 curl 사용자 에이전트를 그대로 흉내 낸 방식을 택한 데에는 뚜렷한 손익 계산이 숨어 있다. curl은 리눅스·윈도우 환경 모두에서 관리자와 개발자가 일상적으로 쓰는 도구이기 때문에, 이 UA 문자열이 방화벽 로그에 찍혀도 당장 이상 행위로 분류되지 않을 가능성이 있다 — 자체 제작한 프로토콜을 새로 짜는 대신 이미 신뢰받는 도구의 지문을 빌려 쓴 셈이다. 그러나 바로 이 선택이 역설적으로 네 개의 서로 다른 IDS 룰에 동시에 걸리는 결과를 낳았다. curl UA가 IP 리터럴을 향해 나가는 조합 자체는 이미 여러 보안 벤더가 별도의 탐지 규칙으로 등록해 둘 만큼 널리 알려진 패턴이기 때문이다. 즉 공격자는 '눈에 띄지 않는 도구'를 골랐다고 생각했을 수 있지만, 실제로는 그 조합 자체가 이미 시그니처화된 이상 행위로 자리 잡아 있었다는 점에서, 이 선택은 은닉 효과보다 탐지 비용을 더 크게 치른 거래였을 가능성이 높다.
donut 계열 로더의 실행 구조와 회피 루틴
이 실행 파일에 붙은 트로이목마 라벨은 donut이라는 잘 알려진 셀코드 변환 도구 계열을 가리킨다. .NET 어셈블리나 네이티브 실행 파일을 위치독립형 셀코드로 바꿔 메모리 안에서 곧바로 실행시키는 용도로 쓰이는 도구다. 이 샘플에는 "런타임에 추가 모듈을 불러온다"는 행위 태그가 붙어 있는데, 이는 donut 로더 특유의 모듈형 적재 구조와 정합적이다. 다만 실제로 불러오는 2차 모듈이 무엇인지는 이번 표본만으로는 특정할 수 없다.
같은 파일에는 "CPU 타이머를 직접 읽어 분석 환경을 탐지한다"는 태그가 함께 붙는다. 이는 실행 시간 지연이나 명령 수행 시간의 미세한 차이를 측정해 샌드박스·가상화 환경을 걸러내는 시간 기반 회피(T1497.003)에 해당한다. 샌드박스 두 곳의 판정은 갈렸다 — Yomi Hunter는 이 파일을 명확히 악성으로 분류했지만, DAS-Security Orcas는 무해로 판정했다. 이 불일치는 우연이 아니라, 앞서 확인한 타이머 기반 탐지 회피 루틴이 실제로 일부 분석 환경에서 작동했을 가능성을 시사한다. 즉 행위 태그 하나만 놓고 보면 추상적인 서술이지만, 샌드박스 판정이 갈린 정황과 겹쳐 보면 이 회피 루틴이 실전에서 유효했다는 그림이 만들어진다.
빌드 흔적은 두껍지 않지만 몇 가지 지표는 확인된다. imphash는 ea5930d320dc…이고, PE 컴파일 시각은 2020-09-01로 기록돼 있다. .text 섹션의 엔트로피는 5.96, .reloc 섹션은 6.49로 나타나는데, 이 정도 엔트로피는 강한 패킹의 증거로 보기는 어렵고 코드·리소스가 혼합된 일반적인 네이티브 실행 파일 범위에 가깝다. 파일 크기는 약 7MB(7,109KB)로 상당히 크며, 이는 셀코드 변환 과정에서 다수의 모듈이나 리소스가 함께 묻혀 들어갔을 가능성과 맞아떨어진다. 다만 이 크기 데이터 하나만으로 셀코드 구조 자체를 단정할 근거는 부족하며, 이 파일에는 디지털 서명이 붙어 있지 않다.
탐지 현황을 조금 더 들여다보면, 이 로더는 ALYac·AhnLab-V3·CrowdStrike·Kaspersky·ESET-NOD32 등 주요 엔진 다수가 잡아내는 반면, Acronis·ClamAV·Ikarus·Webroot 등 일부 엔진에서는 여전히 미탐지로 남는다. 57/75라는 탐지 비율 자체는 높은 편이지만, 이 실행 파일이 처음 확인된 이후로도 반복적으로 재제출되며 관측된 흔적을 남긴 점 — 여러 출처에서 다시 포착됐다는 사실 — 은 이 페이로드가 여러 환경에서 산발적으로 재활용되고 있다는 인상을 준다. 이는 신형 캠페인의 신선한 표본이라기보다, 여러 침해 사고에서 재등장한 오래된 로더일 가능성을 뒷받침한다.
명령제어 통신의 흔적과 미확인 연결고리
앞서 짚은 네 개의 IDS 룰 발화는 이 로더가 실제로 커맨드라인 도구 curl을 흉내 낸 사용자 에이전트로 HTTP 요청을 내보내며, 그 대상이 도메인 명이 아니라 점으로 구분된 IP 주소 형태였다는 점을 알려준다(T1071.001). 도메인을 쓰지 않고 IP를 직접 두드리는 방식은 DNS 질의 로그에 흔적을 남기지 않는다는 이점이 있는 대신, 방어팀이 트래픽 목적지를 미리 알 수 없다는 약점도 함께 짊어진다. 공격자가 이런 선택을 한다는 것은 탐지 회피를 인프라의 유연성보다 우선시했다는 뜻으로 읽을 수 있다 — 도메인 등록·DNS 전파는 시간이 걸리고 흔적을 남기지만, IP 리터럴은 즉시 바꿔 낄 수 있다.
다만 여기서 분명히 해야 할 지점이 있다. 이번에 확인되는 IP 지표는 단 하나, 185.183.98.242뿐이다. 이 로더가 실제로 이 IP와 접속을 주고받았다는 직접적인 연결 — 예컨대 저장된 통신 로그나 명시적 결의 기록 — 은 확인되지 않는다. 로더의 트래픽 패턴이 raw IP를 대상으로 한 HTTP 통신 정황을 강하게 시사하는 것과, 이 특정 IP가 그 목적지였다는 것은 서로 다른 확신 수준의 진술이다. 현재로서는 전자는 관측된 사실이고, 후자는 같은 표본군 안에 존재하는 유일한 IP라는 정황에 기댄 추론일 뿐이라는 점을 분명히 해 둘 필요가 있다.
그럼에도 이 정황을 완전히 무시할 이유는 없다. 로더가 IP 리터럴로 통신한다는 행위 패턴과, 이번 표본군에 유일하게 등장하는 네트워크 지표가 단명 인증서를 두른 처분형 노드라는 사실을 겹쳐 보면, 적어도 이 운영팀이 도메인 계층을 건너뛰고 IP를 직접 노출하는 방식의 C2 구성을 선호했으리라는 그림이 자연스럽게 그려진다. 이것은 단정이 아니라, 서로 다른 두 관측 — 트래픽 패턴과 인프라 구성 — 을 겹쳐서 얻은 하나의 해석이다.
이 관측이 방어팀에 실질적으로 의미하는 지점은 좁지만 구체적이다. 만약 표적 환경의 아웃바운드 정책이 도메인 기반 프록시만 허용하고 IP 리터럴로의 직접 HTTP 요청을 원천적으로 차단하고 있었다면, 이 로더의 통신 시도는 애초에 성립하지 않았을 것이다. 반대로 이런 정책이 없는 환경에서는, curl UA와 점으로 구분된 IP 목적지가 함께 나타나는 로그 항목을 프록시·방화벽 단에서 별도로 걸러내는 규칙 하나만으로도 이번 로더의 C2 시도를 초기에 잡아낼 수 있었다는 뜻이 된다. 다시 말해 이 캠페인의 탐지 지점은 페이로드 자체의 정교함이 아니라, 아웃바운드 트래픽에서 도메인 해석 단계를 건너뛰는 흔치 않은 패턴 하나에 집중돼 있다.
Host Sailor 위에 걸린 37일짜리 인증서
185.183.98.242는 네덜란드에 위치한 Host Sailor Ltd가 운영하는 AS60117에 속하며, RIPE NCC가 할당한 185.183.98.0/24 대역 안에 있다. 이 IP에 걸린 TLS 인증서는 2026-07-30부터 2026-09-05까지, 딱 37일 동안만 유효하다. 발급자 공용 이름은 www.5n5v5ydbvipc3vxbc6w.com, 대상 공용 이름은 www.czkad4p2qeozglked.net으로, 둘 다 실제 브랜드나 서비스명이 아니라 무작위로 생성된 것처럼 보이는 문자열이다. 이런 조합 — 짧은 유효기간과 의미 없는 랜덤 문자열 도메인 이름 — 은 정상적인 서비스 인증서라기보다 언제든 폐기할 수 있는 일회용 통신 발판에서 흔히 나타나는 패턴이다.
이 관측을 조금 더 밀어붙여 보면, 발급 시점(2026-07-30)과 실행 파일이 처음 확인된 시점(2020-09-02) 사이에는 상당한 시간차가 있다. 이는 같은 로더 코드가 시간을 두고 재활용되면서, 그때그때 새로 세팅된 인프라 위에서 다시 가동됐을 가능성을 시사한다 — 다만 이 두 시점을 직접 잇는 연결 고리가 확인된 것은 아니므로, 이는 정황에 기댄 해석으로 남는다. 이 IP 자체의 VirusTotal 탐지 비율은 11/89로 낮은 편인데, 낮은 탐지율은 그 자체로 무해함을 증명하지 않는다. 오히려 단명 노드는 활성 기간이 워낙 짧아 다수의 탐지엔진이 미처 학습할 기회조차 얻지 못한 채 폐기되는 경우가 흔하다.
여기서 중요한 것은 이 노드가 더 큰 호스팅 발판의 일부인지, 아니면 정말로 단발성 사용 후 버려진 노드인지를 지금 단계에서 판정하기 어렵다는 점이다. 이 IP가 속한 자율시스템 번호는 이번에 확보한 다른 어떤 지표에서도 재등장하지 않는다. 즉 같은 네트워크 대역을 공유하는 형제 노드나 반복 사용 흔적을 지금은 확인할 수 없으며, 단일 노드 하나만 놓고 인프라 전체의 규모를 추정하는 것은 성급하다. 다만 짧은 유효기간·무작위 문자열 인증서·바깥으로 드러나지 않는 도메인 계층이라는 세 가지 특징이 한 노드 안에 동시에 모여 있다는 사실만으로도, 이 운영팀이 인프라를 오래 쓸 자산이 아니라 즉시 회전시킬 소모품으로 다뤘다는 그림을 그릴 수 있다.
WHOIS 기록을 함께 놓고 보면 이 인프라의 성격이 조금 더 분명해진다. 185.183.98.0/24 대역 자체는 2016-12-27에 등록된 오래된 할당이며, Host Sailor Ltd라는 사업자도 그 이후 줄곧 같은 대역을 운영해 온 것으로 보인다. 즉 이 노드가 속한 호스팅 사업자 자체는 결코 신생이거나 일회성 존재가 아니다. 반면 그 위에 올라간 개별 TLS 인증서는 37일짜리 단명 인증서였다. 이 두 시간축의 대비 — 거의 10년째 유지되는 호스팅 사업자와 한 달 남짓만 살아 있는 인증서 — 는 이 운영 방식이 인프라 자체를 새로 구축하는 방식이 아니라, 오래 운영돼 온 저가·저평판 호스팅 위에 필요할 때마다 짧은 수명의 발판을 얹었다가 걷어내는 방식에 가깝다는 것을 보여준다. Host Sailor라는 사업자가 이번 표본군에서 유일하게 등장한다는 사실과 이 오래된 대역 할당 이력을 겹쳐 보면, 공격자가 특정 호스팅 사업자의 평판이나 정책적 관용도를 노려 반복적으로 이용했을 가능성을 시사하지만, 이번 데이터로는 그 반복 이용 여부까지 확정할 수는 없다.
PDF 동반 아티팩트와 전달 경로의 공백
이번 표본군에는 46KB짜리 PDF 문서(39900c46…) 한 점도 함께 확인된다. 이 문서는 VirusTotal 탐지 기준으로 0/73, 즉 어떤 엔진도 악성으로 분류하지 않았고, 유일하게 수행된 샌드박스 판정(Zenbox)도 무해로 결론 났다. 행위 태그는 "사용자 상호작용을 기다린 뒤에야 실행된다"와 "네트워크 어댑터 목록을 열거한다" 두 가지가 붙는다. 흥미로운 지점은 이 PDF와 앞서 다룬 로더가 정확히 같은 시점(2020-09-02)에 처음 확인됐다는 사실이다.
두 파일이 같은 시점에 나타났다는 사실과, PDF에 붙은 "사용자 상호작용을 기다린다"는 행위 태그를 함께 놓고 보면, 이 문서가 미끼 역할을 하고 그 뒤에 로더가 이어졌을 가능성을 떠올리게 된다. 그러나 이는 시점의 우연한 일치에서 출발한 추론일 뿐이다. 두 파일을 직접 잇는 연결 — 같은 빌드 환경의 지표나 공유되는 해시 값, 실제 전달 순서를 증명하는 로그 — 은 확인되지 않는다. 동일한 시점과 사용자 상호작용 태그는 두 파일이 동반 아티팩트였을 가능성을 시사하는 정도에 머물며, 실제 전달 연계가 있었다고 단정할 근거는 아니다.
이 지점에서 방어자 입장을 한번 짚어볼 만하다. 만약 이 PDF가 실제로 전달 단계였다면, 탐지 체계 입장에서는 완전히 깨끗한 문서 한 점이 조용히 열람되는 순간이었을 것이다. 어떤 엔진도 이 문서를 걸러내지 못했다는 사실 — 0/73이라는 탐지 결과 — 은 이 캠페인이 성공했다면 초기 진입 단계에서 아무런 경보도 울리지 않았을 것이라는 뜻이다. 반면 로더 자체는 57/75라는 높은 탐지율을 기록하고 있어, 실제 방어망이 이 위협을 붙잡았다면 문서 단계가 아니라 실행 파일이 구동되는 단계에서였을 가능성이 크다. 이 격차는 초기 진입 지점과 실행 단계 사이에 탐지 체계의 시야가 크게 벌어져 있었다는 것을 보여준다.
한편 표본군에는 아무런 확인 가능한 흔적이 남지 않은 파일 하나(564cd96e…)도 포함돼 있다. 이 파일에 대해서는 유형, 탐지 결과, 행위 태그 어느 것도 확인할 수 없어 캠페인 서사에 편입시킬 수 없다. 이런 미확인 지표가 존재한다는 사실 자체는, 현재 손에 쥔 조각들이 전체 작전의 일부일 뿐이며 더 넓은 침투 체계가 시야 밖에 있을 가능성을 열어 둔다.
PDF에 붙은 '네트워크 어댑터를 열거한다'는 행위 태그는 단순한 문서 열람 이상의 기능이 심어져 있었음을 시사한다. 만약 이 기능이 실제로 작동했다면, 공격자는 사용자가 파일을 열어보는 그 순간 환경 정보를 미리 수집해 이후 단계의 페이로드 선택이나 통신 방식을 조정할 근거를 얻었을 것이다. 그러나 이런 능동적 열거 행위는 서명 기반 탐지를 피하더라도 행위 기반 탐지(behavioral detection)에는 오히려 취약하다 — 일반적인 PDF 리더가 프로세스 내에서 네트워크 어댑터 정보를 조회하는 행위는 정상적인 문서 열람 흐름에서는 드물게 나타나는 이상 행동이기 때문이다. 이 문서가 0/73이라는 완전한 무탐지 기록을 남긴 것은 서명 기반 엔진들이 이 행위를 아직 포착하지 못했다는 뜻일 뿐, 행위 기반 EDR이 이를 어떻게 처리했을지는 이번 데이터에서 확인할 수 없다. 즉 공격자는 서명 탐지 회피라는 이득을 얻은 대신, 행위 로그 상에는 오히려 뚜렷한 흔적을 남기는 대가를 치렀을 가능성이 있다.
다섯 개의 이름표가 가리키는 하나의 계열
이번 로더에는 espionage(첩보 수집) 목적이 붙어 있고, 배후로는 MuddyWater라는 이름이 함께 등장한다. 이 행위자에는 TEMP.Zagros, Seedworm, Static Kitten, Mercury, Mango Sandstorm이라는 다섯 개의 별칭이 따라붙는데, 이는 여러 보안 벤더가 독자적으로 추적해 온 활동군이 사후에 하나의 행위자로 수렴됐음을 보여주는 전형적인 사례다. 보안 업계에서 CrowdStrike의 '-Kitten' 접미사와 Microsoft의 '-Sandstorm' 접미사는 각각 이란 연계 활동군에 부여하는 명명 규칙으로 알려져 있으며, 두 벤더가 독립적으로 동일 계열에 이런 이름을 붙였다는 사실은 이 행위자를 국가 연계 활동으로 보는 배경 정황이 된다 — 다만 이 연결을 직접 확정하는 별도 근거는 이번 표본 안에서는 확인되지 않으므로, 단정보다는 정황에 기댄 추정으로 남겨야 한다.
로더의 실행 방식 — 메모리 상에서 모듈을 불러오는 셀코드 구조, 샌드박스 타이밍 회피, 도메인을 거치지 않는 직접 IP 통신 — 은 화려한 파괴 행위보다 조용한 접근 유지와 정보 수집에 최적화된 구성이다. 이런 조합은 금전적 이득을 노리는 활동보다는 장기적인 첩보 수집 활동에 더 잘 들어맞는다. 행위자 귀속에 대한 확신은 이번 표본에서 비교적 높게 매겨져 있지만, 실제로 관측된 피해 범위는 좁다 — 지역적으로는 중국을 가리키는 태깅 하나가 확인될 뿐이고, 구체적으로 어떤 산업이 표적이 됐는지를 특정할 근거는 이번 표본에서 확인되지 않는다. 이 격차 — 행위자 식별에 대한 높은 확신과 얇은 피해 관측 — 은 이번에 확보한 조각이 훨씬 더 넓은 작전 중 극히 일부만을 비춘 결과일 가능성을 시사한다.
이번 레코드에 붙은 지역 태그 'CN' 하나를 두고는 다른 해석도 가능하다. 이 표기가 반드시 실제 피해 조직이 위치한 지역을 뜻하는 것은 아닐 수 있다 — 로더 파일(9b8d5132…)의 대체 파일명 목록에는 '241203_南昌'이라는 지명이 포함된 조사 경로 문자열이 남아 있는데, 이는 이 샘플이 중국 내 어느 침해 대응·분석 과정에서 수집돼 저장된 경로일 가능성을 보여줄 뿐, 그 자체로 캠페인의 최종 표적이 중국 내 조직이었음을 증명하지는 않는다. 다시 말해 'CN'이라는 지역 태그는 표적 지역을 가리키는 값일 수도 있지만, 표본이 수집·분석된 경유지를 반영한 값일 수도 있어 두 해석이 동시에 성립한다. 다만 이번 레코드에 이를 반증하거나 확정할 추가 지표가 없는 이상, 원 데이터가 제공하는 지역 태그 자체를 근거로 삼는 현재의 서술을 유지하되, 이 모호성을 명시해 두는 것이 더 정확하다.
낮은 인프라 투자와 정교한 회피가 함께 놓인 이유
이번에 모인 조각들을 다시 늘어놓아 보면 흥미로운 비대칭이 드러난다. 인프라 쪽은 단 하나의 IP, 37일짜리 인증서 한 장으로 끝난다 — 규모로 보면 초라할 정도다. 반면 그 위에서 돌아가는 행위는 결코 단순하지 않다. 셀코드 기반 모듈 로딩, CPU 타이머를 이용한 분석 환경 감지, curl 사용자 에이전트를 흉내 낸 IP 직결 통신, 무작위 문자열로 위장한 인증서 발급까지, 각 요소마다 정교한 회피 설계가 들어가 있다. 인프라에 들이는 투자는 최소화하면서 실행 단계의 회피 엔지니어링에는 상당한 정성을 들인 흔적이다.
이런 비대칭은 우연이 아니라 하나의 운영 철학을 반영하는 것으로 보는 것이 자연스럽다. 인프라를 크게 벌여 놓으면 등록기관·호스팅 계정·인증서 발급 이력 같은 흔적이 쌓이고, 그 흔적은 결국 추적의 실마리가 된다. 반대로 단일 노드를 짧게 쓰고 버리는 방식은 인프라 측 흔적을 최소화하지만, 그만큼 실행 파일 자체가 스스로 탐지를 피해야 하는 부담을 떠안는다. 이번에 확인된 조합 — 얇은 인프라와 두꺼운 회피 로직 — 은 바로 그 부담을 실행 단계로 옮겨 놓은 결과로 읽을 수 있다.
물론 현재 손에 쥔 조각만으로 이 운영 방식이 이 행위자의 전형적인 패턴인지, 아니면 이번 한 번의 우연한 조합인지를 단정하기는 어렵다. 표본의 수가 너무 적고, 특히 이 IP가 속한 네트워크 대역에서 단일 노드만 관측된다는 점은, 이 인프라가 소규모로 고립되어 운용되고 있거나 아직 전체 규모가 드러나지 않았을 가능성을 시사한다. 다만 이런 얇은 표본에서조차 회피 설계의 밀도가 이 정도로 높게 나온다는 사실은, 앞으로 같은 계열의 표본이 추가로 관측될 때 인프라 규모보다 행위 패턴 쪽에 더 주의를 기울여야 한다는 시사점을 남긴다.
결국 이번 사례가 남기는 함의는 인프라 규모가 아니라 운영의 결이다. 인프라 조각이 하나뿐이라는 이유로 이 활동을 사소하게 취급할 수는 없다. 오히려 최소한의 발판 위에서도 탐지 회피 설계를 촘촘하게 쌓아 올릴 수 있다는 사실 자체가, 이 운영팀이 규모보다 지속적인 접근 유지를 우선시하는 방식으로 움직이고 있다는 것을 보여준다. 앞으로 이 계열의 표본이 더 확인된다면, 인프라의 크기가 아니라 이런 회피 로직의 재사용 여부가 캠페인의 실체를 가늠하는 더 나은 척도가 될 것으로 보인다.