上古神器Pwnkit提权检测:如何排除它的踪迹,守护系统安全(CVE-2021-4034)
上古神器Pwnkit提权检测:如何排除它的踪迹,守护系统安全(CVE-2021-4034)
原创 爱坤 爱坤sec 2025-03-29 16:24
什么是 pkexec
?
Linux 中有个工具叫 pkexec
,它的作用是允许普通用户以管理员(root)身份运行命令。这就像是你找到了一个有管理员权限的钥匙,能打开很多权限受
限的大门。
不过,pkexec
需要一个前提:你必须通过验证,像是输入密码什么的。但问题就在这里,pwnkit
这个漏洞就是利用了 pkexec
的一个弱点。
漏洞的原理
假设 pkexec
就是一个派对的门卫,他负责决定谁可以进门,谁不能。但是,门卫有一个问题——他在检查你的“身份证”时,忽略了一个关键环节。他没注意到你的身份证上的某些信息是错误的,这给了你一个小漏洞,可以趁机混进去。
而这个小漏洞,就是 pwnkit
利用的。具体来说,漏洞发生的地方是,pkexec
会依赖一个名为 SHELL
的环境变量来决定你想用什么命令行工具来运行命令。正常情况下,它会检查一下你指定的 SHELL
变量是否合法,比如 /bin/bash
这样的路径,但 pwnkit
漏洞让这个检查变得脆弱,攻击者可以用一些特殊的方式修改这个 SHELL
变量。
攻击过程
(1)环境变量的修改
:攻击者通过修改环境变量,特别是 SHELL
变量,指定了一个不存在的路径。比如,它设置 SHELL=/lol/i/do/not/exists
(你可以理解为写了一个乱七八糟的名字,门卫竟然没看出来)。****
(2)加载恶意代码
:然后,攻击者指定了一个本地路径 GCONV_PATH=./pwnkit.so
,这个路径其实是攻击者自己放置的恶意共享库(也就是伪装的工具箱)。它会被加载并执行,从而触发漏洞,允许攻击者获得 root 权限。****
(3)提权成功
:由于 pkexec
对环境变量的检查不严格,攻击者就能借机利用漏洞,绕过验证,以管理员身份执行命令。这样,攻击者就像是偷偷拿到了系统的管理员权限钥匙,轻松地就成为了 root 用户。
简单来说,pwnkit
就是通过修改一些环境变量,伪装成合法的请求,绕过了 pkexec
的安全检查,从而获得了 root 权限。就像是找到了一扇门后门,轻松进入了一个本来应该是封闭的区域。
如何查看是否可以通过Pwnkit神器进行提权
1.直接查看pkexec版本来确定
pkexec --version
如果版本小于0.113,那就大概率会被影响
如何你的机器的pkexec是符合要求的,又怀疑被人留下了奇怪的痕迹,那怎么判断是否是通过Pwnkit进行提权的
1.首先看日志
检查 /var/log/auth.log
认证日志
pkexec运行时会在 /var/log/auth.log
(Ubuntu/Debian)或 /var/log/secure
(CentOS)留下认证记录。你可以使用以下命令查找可疑行为:
sudo grep 'pkexec' /var/log/auth.log
日志表示已经通过使用Pwnkit神器进行提权了
Mar 29 07:00:44 ubuntu pkexec[4491]: ubuntu: The value for the SHELL variable was not found the /etc/shells file [USER=root] [TTY=/dev/pts/0] [CWD=/tmp/CVE-2021-4034-main] [COMMAND=GCONV_PATH=./pwnkit.so:. PATH=GCONV_PATH=. SHELL=/lol/i/do/not/exists CHARSET=PWNKIT GIO_USE_VFS=]
pkexec 以 root 身份执行了(USER=root)。
CWD=/tmp/CVE-2021-4034-main,说明攻击者在 /tmp/CVE-2021-4034-main 目录运行了 PwnKit 的 PoC。
GCONV_PATH=./pwnkit.so:.,这和 PwnKit 利用手法完全一致,说明攻击者尝试利用恶意 GCONV 模块进行提权。
SHELL=/lol/i/do/not/exists,这是 PwnKit 漏洞常见的 SHELL 变量伪造方式,用于绕过 pkexec 的参数校验。
多次重复执行,从 07:00:44 到 07:17:28,说明攻击者可能在不断尝试获取 root shell。
检查服务日志
journalctl | grep pkexec
这条日志表明 pkexec
正在执行,且试图运行一个不在 /etc/shells
文件中的 SHELL /lol/i/do/not/exists
。这表明攻击者可能已经修改了环境变量,以利用 pwnkit
漏洞进行提权。
Mar 29 07:00:44 ubuntu pkexec[4491]: ubuntu: The value for the SHELL variable was not found the /etc/shells file [USER=root] [TTY=/dev/pts/0] [CWD=/tmp/CVE-2021-4034-main] [COMMAND=GCONV_PATH=./pwnkit.so:. PATH=GCONV_PATH=. SHELL=/lol/i/do/not/exists CHARSET=PWNKIT GIO_USE_VFS=]
从日志来看,pkexec
被多次执行,且每次执行时都带有一些特殊的环境变量,这些变量表明攻击者可能正在尝试利用 pwnkit
漏洞进行提权。具体来说,以下几点值得注意:
环境变量分析:
SHELL=/lol/i/do/not/exists: SHELL 变量指向一个不存在的路径,这是攻击者利用漏洞的一种方式,可能在为提权操作准备特定环境。
GCONV_PATH=./pwnkit.so: 指定了一个本地的共享库 pwnkit.so,这通常与 pwnkit 漏洞的利用方法相关,可能是攻击者尝试加载自己的恶意代码。
CHARSET=PWNKIT: 设置字符集为 PWNKIT,这也是漏洞利用的一部分。
GIO_USE_VFS=: 可能是尝试影响 GIO 库的行为,进一步操控权限。
如果这是正常的操作日志,应该不会有如此频繁的尝试,尤其是带有异常环境变量的。
我们来检查是否提权成功了
查看 UID/GID:
检查 pkexec
执行时的 UID 是否为 root(UID 0),如果是,说明提权成功
ps aux | grep pkexec
查看 /proc
目录下的进程:如果 pkexec 成功提权,可能会有一个以 root 身份运行的进程。你可以查看该进程的信息。
ps -ef | grep pkexec
2.怎么判断辣个男人还在线
这里我直接列出所有的活动的shell
ps aux | grep 'bash\|sh\|zsh\|pkexec'
这里可以看到有一个id为1028的远程终端,并且运行该进程的用户为root
我们这里查看进程的详细详细
# ls -l /proc/1028/exe
lrwxrwxrwx 1 root root 0 Mar 29 07:36 /proc/1028/exe -> /usr/bin/dash
# cat /proc/1028/cmdline
/bin/sh
#
我们发现这个进程连接到 /usr/bin/dash
,而不是默认的 /bin/bash
,说明这个 shell 可能是在攻击者利用某个漏洞时创建的,而非正常操作。
我们来查看是谁在使用这个sh?
使用命令
ps -fp 1028
我们发现其父id是ubuntu用户的,我们通过auth日志发现,我们的ubuntu用户是通过ssh登录的
grep 'ubuntu' /var/log/auth.log