软件包管理器在Linux发行版上是以root权限运行的,以便安装、更新或删除软件/软件包。在某些情况下,为了让非root/admin用户也能管理软件包,通常会授予sudo权限的方式来运行软件包管理器。 在本文中,我们将详细介绍攻击者是如何利用这个权限,并通过root shell来获得机器的root访问权限的。
对于基于debian的linux发行版,通常可以使用下面所示的软件包管理器:
就这里来说,APT(Advanced Packaging Tool)是最常用的一种软件包管理器。而Synaptic是一个GUI应用程序,其功能与命令行工具相似。另外,需要说明的一点是,软件包通常为.deb格式的文件。 对于基于Redhat的发行版,可用的软件包管理器如下所示:
这个发行版下面的软件包通常为.rpm文件。 此外,还有一个叫snap的软件包管理器,它支持所有主要的Linux发行版。因此,这就是说,它可以同时在基于debian和redhat的发行版上使用。 在本文中,我们假设入侵者开始只拥有一个低权限的用户身份:只拥有以sudo身份运行上述软件包管理器的权限。
现在,假设我们有一个ubuntu服务器,并且该用户能够在其上通过sudo运行apt。 方法一:创建一个恶意的debian软件包 实际上,低权限的用户可以通过创建一个包含命令的debian包来提升权限。 首先,我们将创建一个名为exploit的目录,然后创建一个运行whoami命令的shell脚本,并将其放在该文件夹中。 准备好后,我们将使用一个叫做fpm(Effing package management)的工具来建立一个debian软件包,以执行我们刚刚创建的脚本。 为了创建这个debian软件包,可以运行如下所示的fpm命令: 接下来,我们用下面的命令通过apt安装该软件包: 由于该命令是以root身份执行的,这样,我们就能以root身份运行任何命令了。实际上,我们可以使用不同的策略来获得一个root shell,比如给root用户添加ssh密钥或者获得一个反向的shell。 就本例来说,我们只需在exploit.sh脚本中把whoami命令改为bash,然后创建一个新的debian软件包即可。但这次,我们需要指定一个新的版本来升级已安装的现有版本。 这样,我们就能成功地以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。 由于apt可以与dpkg进行交互,因此,我们也可以使用类似dpkg的配置来获得一个root shell。需要注意的是,我们不能直接将dpkg的配置传递给apt的命令行选项,因此,我们需要借助于配置文件。 APT允许我们通过命令行选项-c指定除默认配置之外要使用的配置文件。 下面,让我们创建一个恶意的配置文件并使用它。 为了使上述方法奏效,不能安装系统上已安装好的软件包。 需要说明的是,这里的技术也适用于apt-get。 方法3:调用默认分页器 当查看更新日志时,apt/apt-get会使用sensible-pager来显示信息,通常默认设置为less。这意味着apt会运行less,由于less也会以root身份运行,因此,我们可以通过它来获得root shell。 运行第一条命令,然后在分页器界面中运行第二条命令。这这种方法也适用于apt-get。
假设我们有一台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二进制文件了。 这样,我们就成功地获得了一个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 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。 我们看到,插件目前已经启用,但没有其他选项的条目,这意味着使用的是默认选项。 实际上,我们可以通过查看fastestmirror插件文件和配置来确认这一点。 现在我们已经为发动攻击做好了相应的准备。因为我们是一个低特权用户,所以,现在还没有默认的插件目录的写入权限,所以我们需要使用一个配置文件来指定我们有权编写的目录。 幸运的是,yum允许我们通过命令行下的-c选项来指定配置文件。好了,现在让我们创建一个名为custom_yum.conf的配置文件,其内容如下所示: 接下来,让我们创建插件的配置文件,并把它放到badplugin文件夹中。 然后,让我们开始创建插件本身。 最后,通过用下面的命令执行该插件,就能获得一个root shell。
由于snap可以在所有主要的发行版上工作,因此,这里将通过ubuntu服务器环境来进行利用方法的展示。这里,我们假设低权限的用户能够以sudo权限运行snap。
创建恶意snap软件包有两种方法,一种是使用我们已经使用过的fpm命令,另一种是使用snapcraft命令。 实际上,创建软件包的思路是一样的,但是在创建snap软件包时,我们可以指定钩子(hook)。 根据官方文档的介绍:钩子是一个可执行文件,当某个动作发生时,会在snap的限定环境中运行该文件。 在snap支持的钩子中,有一个叫做install的钩子。 根据相关文档的介绍: install钩子只能在初始安装时被调用,也就是说,它不会在随后的更新过程中被调用。 钩子在启动snap服务(如果它有的话)和配置钩子之前执行。install钩子通常用于处理一次性的操作,例如在第一次安装时对资源进行早期初始化。 我们可以把这个install钩子创建为一个shell脚本,这样的话,当我们试图安装软件包时,它就会执行我们的恶意命令。 1. Snapcraft 接下来,让我们来设置环境。 其中,snapcraft init命令用于创建一个snap目录,并在其中创建一个snapcraft.yaml文件。 接下来,我们进入snap目录,并创建一个hooks目录,并放入install的相关文件: 现在,我们将相关的恶意命令放到install文件中,并将其转换为可执行的bash脚本。 由于我们的目标是获得一个root shell,因此,我们将使用另一种技术,即添加一个uid为0的新用户,来获得root权限。当然,您喜欢的话也可以使用反向shell命令。 不要忘了赋予脚本可执行权限。 现在,让我们编辑snapcraft.yaml文件。这里,我们将修改默认名称、摘要和描述,并删除基本条目。 然后,让我们回到exploit目录,并运行snapcraft命令来创建软件包,然后,开始安装。 一旦安装完毕,我们就会发现相关的用户已经被添加,这样,我们就可以切换为该用户,从而获得root shell。 2. fpm 对于fpm,我们可以使用完全相同的文件结构,不过这里需要将snap目录名改为meta。 当我们安装它时,会发现将添加相应的新用户;这样,我们可以通过切换为该用户,来获得一个root shell,具体方法与前面一样。
正如我们所看到的,攻击者可以通过各种方式利用软件包管理器来提升权限,因此,我们在赋予用户相应的权限的时候,一定要多加小心。 实际上,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/ |