本文首发于:微信公众号「运维之美」,公众号 ID:Hi-Linux。

「运维之美」是一个有情怀、有态度,专注于 Linux 运维相关技术文章分享的公众号。公众号致力于为广大运维工作者分享各类技术文章和发布最前沿的科技信息。公众号的核心理念是:分享,我们认为只有分享才能使我们的团体更强大。如果你想第一时间获取最新技术文章,欢迎关注我们!

公众号作者 Mike,一个月薪 3000 的杂工。从事 IT 相关工作 15+ 年,热衷于互联网技术领域,认同开源文化,对运维相关技术有自己独特的见解。很愿意将自己积累的经验、心得、技能与大家分享交流,篇篇干货不要错过哟。如果你想联系到我,可关注公众号获取相关信息。


作为 Linux 中最常使用的重要实用程序之一,sudo 几乎安装在每一款 UNIXLinux 发行版上的,以便用户调用和运行核心命令。然而近期这个命令曝出的一个严重的本地提权漏洞,即便配置中明确不允许 root 用户访问,该漏洞仍可允许恶意用户或程序,在目标 Linux 系统上以 root 用户身份执行任意命令。

sudo 作为一个系统命令,其允许普通用户以特殊权限来运行程序或命令,而无需切换使用环境。

漏洞详情

据悉,该漏洞由苹果信息安全部门的 Joe Vennix 追踪发现(漏洞的 CVE ID 为 CVE-2019-14287 )。

如果想要利用这个漏洞,只需按以下的方式运行即可。

$ sudo -u#-1 id -u

或者

$ sudo -u#4294967295 id -u

使用 sudo 命令时,你可以直接指定用户的 UID 来代替用户名。

之所以会产生这个漏洞,是因为将用户 ID 转换为用户名的函数会将 -1(或无效等效的 4294967295)误认为是 0,而这正好是 root 用户 User ID 。此外,由于通过 -u 选项指定的 User ID 在密码数据库中不存在,因此不会运行任何 PAM 会话模块。

如何利用漏洞

CVE-2019-14287 是管理员在配置文件中用了 ALL 关键词后造成的。当 /etc/sudoers 文件中存在 *=(ALL, *) 形式的配置时,本地攻击者可以通过指定用户 ID 为 -1 或者 4294967295,从而以 root 权限在服务器上执行命令。例如:

user_name ALL=(ALL, !root) /usr/bin/vim

当存在这种 ALL=(ALL, !root) 形式的配置时,表示对被切换到的用户进行了 ALL(所有用户) 和其他用户的剔除操作。例如上面的含义就是:允许 user_name 用户以非 root 权限之外的所有用户权限运行 vim 命令。

下面我们来看一个实例,首先配置一个允许 r7 用户以非 root 权限之外的所有用户权限运行 vim 命令的规则。

然后,直接以 r7 用户身份切换为 root 来运行 vim 命令。

我们可以看到,命令执行请求被拒绝了。

接着,我们利用漏洞中所描述的方式进行身份切换。

我们可以看到成功切换到为 root 用户,并打开了 /etc/shadow 文件。

/etc/shadow 文件只有具备 root 权限的用户才能进行访问。

因此,我们可以很轻易地利用该漏洞在 vim 命令下启动一个具有 root 权限的 Shell,然后执行任何命令。

# 在 vim 中执行外部命令,下面这个就表示执行一个带有 root 权限的 SHELL。
:!/bin/bash

漏洞修复建议

  1. 该漏洞影响最新版本 1.8.28 之前的所有 Sudo 版本,目前各大 Linux 发行版都已经向用户推送最新版本,请及时升级到 sudo 1.8.28 版本。

  2. 检查 /etc/sudoers 是否存在 ALL 关键词的复合限制逻辑。

参考文档

  1. https://www.google.com

  2. https://www.cnbeta.com/articles/tech/899229.htm

  3. https://www.anquanke.com/post/id/188743

  4. https://nosec.org/home/detail/3045.html

![](https://img2018.cnblogs.com/blog/1747538/201910/1747538-20191016173506699-1164376591.jpg)

Linux 曝出严重安全漏洞,受限用户亦可提权至 Root 身份运行任意命令!(内附解决方案)的更多相关文章

  1. 【转载】Linux踢出其他正在SSH登陆用户

    Linux踢出其他正在SSH登陆用户     在一些生产平台或者做安全审计的时候往往看到一大堆的用户SSH连接到同一台服务器,或者连接后没有正常关闭进程还驻留在系统内.限制SSH连接数与手动断开空闲连 ...

  2. Day 10 用户的提权,用户组的创建删除

    1.如何为用户设定密码,又如何修改密码? 2.用户的创建流程? [扩展了解] 3.用户组如何管理? 4.普通用户无权限怎么办? 切换身份 or 提权? su 切换用户 sudo 提权   5.为用户添 ...

  3. CVE¬-2020-¬0796 漏洞复现(本地提权)

    CVE­-2020-­0796 漏洞复现(本地提权) 0X00漏洞简介 Microsoft Windows和Microsoft Windows Server都是美国微软(Microsoft)公司的产品 ...

  4. Centos普通用户提权至ROOT

    1.利用/bin/ping的漏洞普通用户提权.(rws中的s) [root@localhost ~]# ls -l /bin/ping -rwsr-xr-x. root root 9月 /bin/pi ...

  5. Linux 的计划任务(运维基础|可用于提权)

    Linux操作系统定时任务系统 Cron 入门 先写笔记: crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 crontab -l //列出某个用户 ...

  6. Tomcat非root身份运行制作Linux系统服务管理

    理论知识怱略,马上开始实战 一.首先准备好tomcat 启动.关闭.重启Shell脚本: 以下Shell脚本主要修改值 tomcatPath:tomcat目录 runUser:以哪个身份运行 此处测试 ...

  7. Linux踢出其他正在SSH登陆用户

    1.查看系统在线用户 [root@testdb ~]#w 2.查看哪个属于此时自己的终端(我开了两个连接) [root@testdb ~]# who am i 3.pkill掉自己不适用的终端 [ro ...

  8. Net Manager测试连接测试没有成功,用户权限问题,以管理员身份运行后测试成功

    Net Manager测试连接测试没有成功,截图如下:

  9. Linux提权手法整理

    之前写过了windows提权小结,这下一篇水什么就有了嘛,于是有了这篇水文,整理一下Linux提权 前篇windows提权小结 ,链接送上 https://www.cnblogs.com/lcxblo ...

随机推荐

  1. 002-maven开发Java脚手架archrtype【如无定制开发,请直接看3.3使用】

    一.概述 项目基础构建需要:项目结构,spring框架,orm,连接池,数据库,单元测试等等. 上述即使复用:001-脚手架发展,基础代码结构+mybatis代码生成,基础代码结构,也需要修改成自己单 ...

  2. postman做接口测试 application/x-www-form-urlencoded 格式与json格式互转

    背景:用postman做接口测试可以使用application/x-www-form-urlencoded请求,也可以使用json请求,接口文档如下: 请求参数 字段 类型 是否必填 注释 websi ...

  3. dataTable.NET的search box每輸入一個字母進行一次檢索的問題

    當使用dataTable.NET時,可以通到簡單的setting來添加一個search box進行全表格的檢索. $('#test-listing') .on('order.dt', function ...

  4. Python下numpy的使用

    首先:当然是欢迎大家了! Numpy : NumPy系统是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structur ...

  5. QT_QML_常见问题

    1. qml文件中,如果要添加信号连接,如果与控件x有丁点关联,则将Connections{}最好放到该控件的{}内部,不这样做曾经遇到接受不到信号的奇葩问题. 2. 使用TabView时,在每个Ta ...

  6. [转帖]Helm V2 迁移到 V3 版本

    Helm V2 迁移到 V3 版本 -- :: Mr-Liuqx 阅读数 63更多 分类专栏: kubernetes 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上 ...

  7. flask框架(一)——初识Flask

    一.初识flask 1.什么是Flask:Flask是一个python编写的web框架,只是一个内核,默认依赖2个外部库:jinja2模板引擎和WSGI工具集--Werkzeug. 2.安装flask ...

  8. go 疑难杂症

    func Test_doSeond(t *testing.T) { msg := make([]Msg, 0) for i := 0; i < 5; i++ { m := Msg{ data: ...

  9. 创建包含CRUD操作的Web API接口2:实现Get方法

    本节是前一节的延续,上一节中我们已经为我们的Web API项目创建必要的基础设施. 在本节中,我们将在我们的控制器类中实现操作方法,这些方法用来处理HTTP GET请求. 根据Web API命名约定, ...

  10. JDK提供的原子类和AbstractQueuedSynchronizer(AQS)

    大致分成: 1.原子更新基本类型 2.原子更新数组 3.原子更新抽象类型 4.原子更新字段 import java.util.concurrent.atomic.AtomicInteger; impo ...