CVE-2022-0847 Dirty Pipe linux内核提权漏洞 | POC

The Dirty Pipe

Linux kernel privilege escalation

摘要

Linux Kernel 5.8及以后版本中允许覆盖重写任意可读文件中的数据,未经授权的本地用户可以使用此漏洞写入由只读文件支持的页面缓存中的页面,可以利用此漏洞进行本地权限提升。类似于CVE-2016-5195 “Dirty Cow”。此漏洞影响 5.17-rc6 之前的 Linux 内核版本。

评分

CVSSV3 :7.8

POC已公开

影响范围

影响版本

5.8 <= Linux kernel < 5.16.11 / 5.15.25 / 5.10.102

安全版本

该漏洞已在Linux 5.16.11、5.15.25 和 5.10.102 中修复。

漏洞验证

目前存在两个可用poc,一个是原作者Max Kellermann的poc,原poc是通过覆写文件来达到提权的目的,另一个是它的改进版,通过覆盖SUID程序来达到提权的目的。

(1)通过覆盖SUID程序进行提权poc验证

SUID (Set User ID) 是文件的一种权限,允许用户以其所有者的权限执行文件。Linux 二进制文件可以拥有这种类型的权限集有很多原因。例如,ping 实用程序需要 root 权限才能打开网络套接字,但它也需要由标准用户执行,以验证与其他主机的连接。

但是,如果某些现有的二进制文件和实用程序具有 SUID 权限,则可以使用它们将权限提升到 root。

以下命令可以发现系统上运行的所有 SUID 可执行文件。更具体地说,这些命令是尝试在用户 root 拥有的具有 SUID 权限位的目录中查找文件,然后将所有其重定向到 /dev/null 以便仅列出用户有权访问的二进制文件使用权。

find / -user root -perm -4000 -print 2>/dev/nullfind / -perm -u=s -type f 2>/dev/nullfind / -user root -perm -4000 -exec ls -ldb {} \;

复现过程

①查询suid可执行文件

②提权

(2)通过覆写/etc/passwd文件进行提权poc验证

①用法

②备份/etc/passwd

sudo cp /etc/passwd /etc/passwd.bak

③查看/etc/passwd

cat /etc/passwd

这里了解一下/etc/passwd中各用户数据每个字段的含义(因为我也不是很清楚)。

第一个字段中保存的是:注册名,也就是用户名称,这里为root。

第二字段为:口令(passwd),也就是密码,这里的x代表的是密码标志,而不是真正的密码,真正的密码是保存在 /etc/shadow 文件中。

注:在早期的 UNIX 中,这里保存的就是真正的加密密码串。现在的Unix/Linux系统中,口令不再直接保存在passwd文件中,通常将passwd文件中的口令字段使用一个“x”来代替,将/etc /shadow作为真正的口令文件,用于保存包括个人口令在内的数据。

第三个字段就是用户 ID(UID),这里为0,代表超级用户。

注:0=超级用户、1~499=系统用户(伪用户)、500-65535=普通用户。

第四个字段就是用户的组 ID、这里为0,代表所属组为0组。

第五个字段是这个用户的简单说明,这里为root,没有什么特殊作用,可以不写。

注:如用户的真实姓名、办公室地址、联系电话等。

第六个字段是这个用户的家目录,这里为/root。

注:超级用户的家目录是 /root 目录,普通用户在 /home/ 目录下建立和用户名相同的目录作为家目录,如 lamp 用户的家目录就是 /home/lamp/ 目录。

第七个字段为:用户登录系统时运行的程序名称,通常是一个Shell程序的全路径名,可以理解为用户登录之后所拥有的权限,这里为/bin/bash,代表可以使用bash程序。

例:若为/sbin/nologin代表禁止登录,一般为系统用户。若为/usr/bin/passwd,这是修改用户密码程序的路径,代表用户只能改自己的密码。

更详细的解释参考:

http://c.biancheng.net/view/839.html

④执行命令进行提权

参考p师傅的方法,执行命令

./exploit /etc/passwd 5 ":0:0:rootx:"

将root用户的密码置空,再次切换root用户可以免密切换。

这里碰到一个问题,当我执行命令

./exploit /etc/passwd 5 ":0:0:root:"

切换root用户失败。

再次尝试:

./exploit /etc/passwd 5 ":0:0:r1234:"

成功。盲猜应该是在用户密码为空的情况下注册名和描述性信息不能相同,具体原因不知道,有了解的师傅可以帮忙给解释一下。

相关POC关注公众号401SecNote后台回复CVE-2022-0847获取,包含源码和可执行文件。

Max Kellermann's blog:https://dirtypipe.cm4all.com/

修复建议

升级linux内核到安全版本:

Linux 内核 >= 5.16.11

Linux 内核 >= 5.15.25

Linux 内核 >= 5.10.102

参考链接:

https://dirtypipe.cm4all.com/

https://haxx.in/files/dirtypipez.c

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2022-0847

https://blog.csdn.net/qq_44657899/article/details/106934143

https://www.cnblogs.com/sainet/p/15785864.html

https://twitter.com/phithon_xg/status/1500902906916081666?s=20&t=YcmV8MOOFk_lprrnlNe-wg

声明:本文作为个人学习记录使用,请勿用于非法行为。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北境L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值