简介
软件包管理器在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安装该软件包:
由于该命令是以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。
漏洞利用方法: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二进制文件了。
这样,我们就成功地获得了一个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
由于snap可以在所有主要的发行版上工作,因此,这里将通过ubuntu服务器环境来进行利用方法的展示。这里,我们假设低权限的用户能够以sudo权限运行snap。
创建一个恶意的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/如若转载,请注明原文地址