受限shell逃逸
概念
受限 shell 是一种限制用户执行命令能力的 shell 类型。在受限 shell 中,用户只能执行特定的命令集或在特定目录中执行命令。受限 shell 通常用于为可能意外或故意损坏系统的用户提供安全环境,或为用户提供访问特定系统功能的方式。
受限shell一般禁止以下操作:
- 使用 cd 来改变路径;
- 设置或取消SHELL,PATH,ENV,或BASH_ENV变量的值;
- 指定的命令名中包含/;
- 指定包含/的文件名作为传递给内建命令.的参数;
- 指定包含斜杠 (slash) 的文件名作为-p选项的参数,传递给hash内建命令;
- 启动时从 shell 环境中导入 (import) 函数定义;
- 启动时解释 shell 环境中 SHELLOPTS 的值;
- 使用 >, >|, <>, >&, &>, 和 >> 等重定向操作符重定向输出;
- 使用exec内建命令来以另一个命令替换 shell;
- 使用enable内建命令的-f和-d选项来增加和删除内建命令;
- 使用 enable 内建命令来允许和禁止 shell 内建命令;
- 指定command内建命令的-p选项; 使用 set +r 或 set +o restricted 来关闭受限模式。
这些限制在所有启动文件读取之后才会生效。
枚举Linux环境
枚举是找到突破方法的重要组成部分。我们需要枚举Linux环境来检测为了绕过rbash我们可以做哪些事。
在正式进行绕过测试之前,我们需要进行以下操作:
- 首先,我们必须检查可用命令,像cd、ls、echo等
- 接下来我们要检查常见的操作符,像>、>>、<、|
- 然后对可用的编程语言进行检查,如perl、ruby、python等
- 通过sudo -l命令检查我们可以使用root权限运行哪些命令
- 使用SUID perm检查文件或命令。
- 使用echo $SHELL命令检查当前使用的是什么shell(90%得到的结果是rbash)
- 使用env或者printenv命令检查环境变量
检查可用方法
1 | echo $PATH |
1 | ls -l /home/yongz/bin |
通过以上操作,我们已收集到一些信息,接下来尝试一下通用的利用方法。
逃逸方法
转义
在某些情况下,可能可以通过向命令行或其他 shell 接受的输入注入命令来从受限的 shell 中逃逸。例如,假设 shell 允许用户通过将命令作为内置命令的参数来执行命令。在这种情况下,可能可以通过向参数中注入附加命令来从 shell 中逃逸。
命令注入
ls
想象我们处于一个受限的 shell 中,可以通过将命令作为参数传递给 ls 命令来执行它们。不幸的是,该 shell 仅允许我们使用特定的参数集来执行 ls 命令,例如 ls -l 或 ls -a ,但它不允许我们执行任何其他命令。在这种情况下,我们可以使用命令注入来逃离 shell,通过向 ls 命令的参数中注入额外的命令。
例如,我们可以使用以下命令将 pwd 命令注入到 ls 命令的参数中:1
ls -l `pwd`
此命令将导致 ls 命令使用 -l 参数被执行,然后输出 pwd 命令的结果。由于 pwd 命令不受 shell 限制,这将允许我们执行 pwd 命令并查看当前工作目录,即使 shell 不允许我们直接执行 pwd 命令。
命令替换
$()语法
1 | CURRENT_DATE=$(date +%Y%m%d) |
举例1
echo "$(<tnet.xml)"
反引号替换
另一种从受限 shell 中逃逸的方法是使用命令替换。这涉及到使用 shell 的命令替换语法来执行一个命令。例如,假设 shell 允许用户通过反引号(`)来执行命令。在这种情况下,可能可以通过执行一个不受 shell 限制的反引号替换中的命令来从 shell 中逃逸。
1 | files=`ls | grep .txt` |
命令链接
在某些情况下,可以通过命令串联来逃离受限的 shell。我们需要在单个命令行中使用多个命令,并用 shell 元字符分隔,例如分号( ; )或竖线( | ),来执行命令。例如,如果 shell 允许用户使用分号分隔命令,那么可能可以通过使用分号分隔两个命令来逃离 shell,其中一个命令不受 shell 的限制。
环境变量
从受限的 shell 中逃逸以使用环境变量涉及修改或创建 shell 用于执行不受其限制的命令的环境变量。例如,如果 shell 使用环境变量来指定命令执行的目录,则可以通过修改环境变量的值来指定不同的目录,从而可能从 shell 中逃逸。
Shell函数
在某些情况下,可以通过使用 shell 函数从受限 shell 中逃脱。为此,我们可以定义并调用那些执行不受 shell 限制的命令的 shell 函数。假设 shell 允许用户定义和调用 shell 函数,那么通过定义一个执行命令的 shell 函数,就有可能从 shell 中逃脱。
特殊命令
编辑器
VI/VIM
敲击VIM命令,打开VIM窗口,进入命令模式,输入:1
:set shell=/bin/bash
再进命令模式,输入:1
:shell
