利用软件包管理器实现Linux提权
2021-09-01 17:12:06 Author: www.4hou.com(查看原文) 阅读量:65 收藏

简介

软件包管理器在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。

1.png

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

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

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

1.png

1.png

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

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

2.png

1.png

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

3.png

1.png

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

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

4.png

1.png

这样,我们就能成功地以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。

5.png

1.png

6.png

1.png

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

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

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

7.png

1.png

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

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

方法3:调用默认分页器

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

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

8.png

漏洞利用方法:RPM

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

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

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

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

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

9.png

1.png

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

10.png

1.png

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

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

11.png

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

12.png

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

13.png

1.png

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

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

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

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

1.png

根据yum的使用说明:

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

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

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

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

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

    [main]

    enabled = 1

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

  •     plugins

    0或1都可以。全局开关,启用或禁用yum插件。默认为0(禁用插件)。感兴趣的读者,可以参见yum(8) man中的PLUGINS部分以获得更多关于安装yum插件的信息。

  •     pluginpath

    yum寻找插件模块时所用的目录列表,默认的搜索目录为/usr/share/yum-plugins和/usr/lib/yum-plugins。

  •     pluginconfpath

    yum寻找插件配置文件时所用的目录列表。默认值是/etc/yum/pluginconf.d。

利用这些信息,我们可以查看centos服务器上的yum.conf。

1.png

我们看到,插件目前已经启用,但没有其他选项的条目,这意味着使用的是默认选项。

实际上,我们可以通过查看fastestmirror插件文件和配置来确认这一点。

privesc-19.png

现在我们已经为发动攻击做好了相应的准备。因为我们是一个低特权用户,所以,现在还没有默认的插件目录的写入权限,所以我们需要使用一个配置文件来指定我们有权编写的目录。

幸运的是,yum允许我们通过命令行下的-c选项来指定配置文件。好了,现在让我们创建一个名为custom_yum.conf的配置文件,其内容如下所示:

11.png

接下来,让我们创建插件的配置文件,并把它放到badplugin文件夹中。

10.png

然后,让我们开始创建插件本身。

9.png

最后,通过用下面的命令执行该插件,就能获得一个root shell。

8.png

1.png

漏洞利用方法:Snap

由于snap可以在所有主要的发行版上工作,因此,这里将通过ubuntu服务器环境来进行利用方法的展示。这里,我们假设低权限的用户能够以sudo权限运行snap。

1.png

创建一个恶意的snap软件包

创建恶意snap软件包有两种方法,一种是使用我们已经使用过的fpm命令,另一种是使用snapcraft命令。

实际上,创建软件包的思路是一样的,但是在创建snap软件包时,我们可以指定钩子(hook)。

根据官方文档的介绍:钩子是一个可执行文件,当某个动作发生时,会在snap的限定环境中运行该文件。

在snap支持的钩子中,有一个叫做install的钩子。

根据相关文档的介绍:

install钩子只能在初始安装时被调用,也就是说,它不会在随后的更新过程中被调用。

钩子在启动snap服务(如果它有的话)和配置钩子之前执行。install钩子通常用于处理一次性的操作,例如在第一次安装时对资源进行早期初始化。

我们可以把这个install钩子创建为一个shell脚本,这样的话,当我们试图安装软件包时,它就会执行我们的恶意命令。

1. Snapcraft

接下来,让我们来设置环境。

7.png

其中,snapcraft init命令用于创建一个snap目录,并在其中创建一个snapcraft.yaml文件。

接下来,我们进入snap目录,并创建一个hooks目录,并放入install的相关文件:

6.png

现在,我们将相关的恶意命令放到install文件中,并将其转换为可执行的bash脚本。

由于我们的目标是获得一个root shell,因此,我们将使用另一种技术,即添加一个uid为0的新用户,来获得root权限。当然,您喜欢的话也可以使用反向shell命令。

5.png

不要忘了赋予脚本可执行权限。

4.png

现在,让我们编辑snapcraft.yaml文件。这里,我们将修改默认名称、摘要和描述,并删除基本条目。

3.png

然后,让我们回到exploit目录,并运行snapcraft命令来创建软件包,然后,开始安装。

2.png

一旦安装完毕,我们就会发现相关的用户已经被添加,这样,我们就可以切换为该用户,从而获得root shell。

1.png

2. fpm

对于fpm,我们可以使用完全相同的文件结构,不过这里需要将snap目录名改为meta。

1.png

1.png

当我们安装它时,会发现将添加相应的新用户;这样,我们可以通过切换为该用户,来获得一个root shell,具体方法与前面一样。

1.png

小结

正如我们所看到的,攻击者可以通过各种方式利用软件包管理器来提升权限,因此,我们在赋予用户相应的权限的时候,一定要多加小心。

实际上,fpm软件包也是一个非常好的工具,可以用它快速创建软件包。它可以安装在任何一个发行版上,但我在centos上安装时遇到了问题,因此,这里就没有怼它进行介绍。

当然,除了本文中介绍的方法指纹,还有许多其他的方法,比如使用rpm,读者可以自行尝试。

参考资料

https://github.com/jordansissel/fpm/

http://manpages.ubuntu.com/manpages/focal/en/man8/apt.8.html

http://manpages.ubuntu.com/manpages/focal/man5/apt.conf.5.html

https://gtfobins.github.io/gtfobins/apt/

https://gtfobins.github.io/gtfobins/yum/

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/deployment_guide/sec-yum_plugins

http://yum.baseurl.org/wiki/WritingYumPlugins.html

https://www.tecmint.com/enable-disable-and-install-yum-plug-ins/

https://gtfobins.github.io/gtfobins/snap/

https://snapcraft.io/docs/supported-snap-hooks

https://0xdf.gitlab.io/2021/07/24/htb-armageddon.html

https://youtu.be/8ikdbyOQsLg

本文翻译自:https://blog.ikuamike.io/posts/2021/package_managers_privesc/如若转载,请注明原文地址


文章来源: https://www.4hou.com/posts/j5EB
如有侵权请联系:admin#unsafe.sh