利用软件包管理器实现Linux提权

简介

软件包管理器在Linux发行版上是以root权限运行的,以便安装、更新或删除软件/软件包。在某些情况下,为了让非root/admin用户也能管理软件包,通常会授予sudo权限的方式来运行软件包管理器。

在本文中,我们将详细介绍攻击者是如何利用这个权限,并通过root shell来获得机器的root访问权限的。

软件包管理器

对于基于debian的linux发行版,通常可以使用下面所示的软件包管理器:

apt/apt-get

dpkg

aptitude

synaptic

就这里来说,APT(Advanced Packaging Tool)是最常用的一种软件包管理器。而Synaptic是一个GUI应用程序,其功能与命令行工具相似。另外,需要说明的一点是,软件包通常为.deb格式的文件。

对于基于Redhat的发行版,可用的软件包管理器如下所示:

yum (Yellowdog Updater, Modified)

rpm

dnf

这个发行版下面的软件包通常为.rpm文件。

此外,还有一个叫snap的软件包管理器,它支持所有主要的Linux发行版。因此,这就是说,它可以同时在基于debian和redhat的发行版上使用。

在本文中,我们假设入侵者开始只拥有一个低权限的用户身份:只拥有以sudo身份运行上述软件包管理器的权限。

漏洞利用方法:DEB

现在,假设我们有一个ubuntu服务器,并且该用户能够在其上通过sudo运行apt。

方法一:创建一个恶意的debian软件包

实际上,低权限的用户可以通过创建一个包含命令的debian包来提升权限。

首先,我们将创建一个名为exploit的目录,然后创建一个运行whoami命令的shell脚本,并将其放在该文件夹中。

准备好后,我们将使用一个叫做fpm(Effing package management)的工具来建立一个debian软件包,以执行我们刚刚创建的脚本。

为了创建这个debian软件包,可以运行如下所示的fpm命令:

接下来,我们用下面的命令通过apt安装该软件包:

利用软件包管理器实现Linux提权

由于该命令是以root身份执行的,这样,我们就能以root身份运行任何命令了。实际上,我们可以使用不同的策略来获得一个root shell,比如给root用户添加ssh密钥或者获得一个反向的shell。

就本例来说,我们只需在exploit.sh脚本中把whoami命令改为bash,然后创建一个新的debian软件包即可。但这次,我们需要指定一个新的版本来升级已安装的现有版本。

利用软件包管理器实现Linux提权

这样,我们就能成功地以root身份获得一个交互式shell。这种方法也适用于apt-get和dpkg。

方法2:APT配置选项

APT是软件包管理系统的一个高级命令行接口。这意味着,它为更低级的dpkg软件包管理器提供了一个前端接口。

当apt调用dpkg时,我们可以指定在调用发生之前(Pre-Invoke)或之后(Post-Invoke)运行的shell命令。

另外,上述内容可以使用配置文件进行配置。这些配置文件通常存储在/etc/apt/apt.conf.d中。然而,当需要提升权限的时候,低权限的用户可能没有权限在该目录中创建文件。

APT也支持通过使用-o选项通过命令行指定这种配置。利用这一点,我们可以通过以下命令来获得一个root shell。

利用软件包管理器实现Linux提权

由于apt可以与dpkg进行交互,因此,我们也可以使用类似dpkg的配置来获得一个root shell。需要注意的是,我们不能直接将dpkg的配置传递给apt的命令行选项,因此,我们需要借助于配置文件。

APT允许我们通过命令行选项-c指定除默认配置之外要使用的配置文件。

下面,让我们创建一个恶意的配置文件并使用它。

利用软件包管理器实现Linux提权

为了使上述方法奏效,不能安装系统上已安装好的软件包。

需要说明的是,这里的技术也适用于apt-get。

方法3:调用默认分页器

当查看更新日志时,apt/apt-get会使用sensible-pager来显示信息,通常默认设置为less。这意味着apt会运行less,由于less也会以root身份运行,因此,我们可以通过它来获得root shell。

运行第一条命令,然后在分页器界面中运行第二条命令。这这种方法也适用于apt-get。

漏洞利用方法:RPM

假设我们有一台centos 7服务器。与上节类似,假设我们最初的权限很低,只能以sudo身份运行yum。

方法1:创建一个恶意的rpm包

使用与前面相同的技术,我们可以使用fpm创建一个恶意的rpm包。我们将使用ubuntu机器来创建这个包,然后将其转移到centos服务器上。

在这种情况下,进入shell是行不通的,因此,我们需要运行一个命令,以获得不同的shell权限。为此,我们可以将创建一个suid bash二进制文件,通过它获得root权限。

我们将在/tmp中创建exploit文件夹和exploit.sh脚本。然后,将下面的命令放到该脚本中。

现在,我们可以通过与创建debian软件包类似的命令来创建恶意的rpm软件包。

然后,我们可以通过启动一个python http服务器并通过下载的方式将其转移到centos服务器上。

在ubuntu服务器上执行下面的命令:

在centos服务器上执行下面所示的命令:

成功下载后,我们就可以安装该软件包,并执行其中包含的脚本来创建我们的suid bash二进制文件了。

利用软件包管理器实现Linux提权

这样,我们就成功地获得了一个root shell。

方法2:加载自定义的yum插件

Yum提供的插件可以扩展和增强其功能。其中,某些插件是默认安装的。每当我们调用yum命令时,Yum就会指出哪些插件(如果有的话)已经被加载和激活。

如下图所示,当我们运行yum update命令时,可以看到已经加载了哪些插件。

根据yum的使用说明:

插件是一个Python “.py”文件,它被安装在yum.conf中pluginpath选项所指定的目录中。

要想使用某个插件,必须满足以下条件:

1. 插件模块文件必须安装在刚才描述的插件路径中。

2. /etc/yum.conf中的全局插件选项必须被设置为“1”。

3. 插件的配置文件必须存在于/etc/yum/pluginconf.d/中,并且该文件中的启用设置必须设置为“1”。满足上述要求的最小配置文件为:

[main]

enabled = 1

根据yum.conf的手册页的介绍,还有几个插件配置需要进行处理:

plugins

来源:嘶吼RoarTalk

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年8月1日
下一篇 2021年8月1日

相关推荐