一,背景
最近在做一个靶场题目,这个靶场的环境是登录网页版的虚拟机(攻击机),然后再访问内网靶机地址来进行答题。开发者使用这种模式应该是为了避免靶机放在公网上被恶意攻击。但是,这对于我来说,存在一个很大的不便:就是脚本无法上传至攻击机(其实是因为我是脚本小子)
二,解决的问题
前期通过文件上传获得了一个webshell,过程不再赘述,但是这个webshell不能执行命令,过滤的函数如下:
看到这里,我的思路有两个:
-
使用类似中国蚁剑的disable function bypass插件进行绕过。
-
寻找这些禁用的函数有没有漏网之鱼。
第一个思路,我看了很多的思路,攻击机提供的蚁剑并没有下载插件,而且攻击机不出网,显然直接使用插件行不通。我在网上看了很多思路,大部分都是需要下载或者编译c文件和后缀名为so的文件,这些思路也不行,因为根本不能进行文件传输。
于是,我开始尝试第二个思路,我在网上翻阅资料,发现一个叫做pcntl_exec()的函数能够代替其他命令执行函数进行命令执行,条件是:
目标机器安装并启用了php组件Pcntl。
正好,我这个靶机的 phpinfo里面显示pcntl组件是enabled状态,于是,我开始着手使用pcntl_exec()函数进行命令执行,翻阅网上资料,php代码如下:
"/bin/bash", array("/tmp/1.sh")); pcntl_exec(
1.sh的文件内容如下:
ls -l /
这里说明一下:因为不能命令执行,所以想运行php文件还比较麻烦,我上传了一个很古老的php大马,这个木马正好带有php语言执行功能可以运行以上php代码(实际上可以通过上传php文件然后网页访问即可执行)。
结果,提示502错误,我懵逼了:
停顿了好久,我就想,会不会函数已经执行成功了但是返回结果遇到了一些错误?如果是这样,不妨试一下反弹shell,说干就干,修改sh文件:
果然,接收到了shell,但是此时还是www权限,flag在/root目录下,于是,我立马想到了suid提权:
看到这里,下面就不用说了,suid直接获取了root权限,渗透测试结束!
三,总结
当php的很多命令函数被禁用时,可以仔细查找各个命令执行函数,有没有漏网之鱼,如:pcntl_exec()的函数就能够代替其他命令执行函数进行命令执行,条件是:目标机器安装并启用了php组件Pcntl。
这里顺便贴上一些命令执行函数:
assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open
原文始发于微信公众号(小猪网络安全):php的webshell或者rce时容易被忽略的一个函数
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论