劫持升级漏洞

前言
之前一直只是听说劫持升级,但是一直没有机会尝试,正好趁这次公司内部演练,刚好去挖掘一下。

环境准备

  • 安装各种软件的PC(这里就用自己的电脑做演示)
  • Fiddler抓包工具

开始抓包
这个时候就打开各种软件,然后去Fd那边检查抓到的流量包,一个个软件的打开,如果用检查更新的按钮去去点击一下,一个个去找。

发现特殊请求
Seay 源代码审计系统居然对外发起请求,而且还是Http协议的,感觉这里有戏。
[图片]
尝试返回内容
这里尝试对请求的/tools/ver.txt进行一个返回特殊内容,这里新建一个ver.txt 内容随便写,我这里写的是“cxaqhq v1.0”。
[图片]
然后配置自动回复器,选择我们指定的ver.txt进行回复,然后重新打开Seay 源代码审计系统,进行下一步检查。
[图片]
直接出现弹窗提示,而且提示内容正是我们在ver.txt中输入的内容,这里我们选择升级。
[图片]
这时候程序会开启一个新的弹窗,并且提示让我们结束当前进程进行升级,这里我们也选择是,然后就提示升级失败了,不要慌,去看看Fiddler那边情况。
[图片]
[图片]
发现upgrade请求
咱们发现,这个比第一次多了一个下载ZIP文件的请求,而且根据路径来说还是upgrade,兄弟们这里感觉有戏啊,咱们也给这边响应返回一个内容,内容就是把计算器给它压缩成ZIP文件。
[图片]
尝试返回计算器
现在咱们就有2个自动回复内容了,继续打开程序看看流程。
[图片]
现在出现了文件下载成功了,然后也解压成功了,我们重新启动程序,看看我们的计算器能否被执行。
[图片]
这里计算器没有被执行,我们找到程序的安装路径,在安装路径里面我们发现了new.zip和calc.exe,这不就是我们刚刚返回给第二个请求包内容吗?现在我们已经能劫持让他下载文件了,只要这个文件能执行那么这个流程就打通了。
[图片]

分析程序代码
幸运的是,我们能找到Seay 源代码审计系统源码,下载地址如下所示,我们可以直接分析程序源代码去观察程序更新的逻辑。
下载地址:https://github.com/f1tz/cnseay.git
这里大家容易有一个误区,就是直接在Seay主项目中去找更新逻辑,其实更新逻辑并不在主项目里面,而是在upgrade项目里面,我们很容易能找到对应的更新代码。
[图片]
分析下载与解压逻辑
可以从代码中看到下载的Url地址是在代码中写死的,然后会把下载的文件存储到当前目录并重命名为new.zip

string DownURL = "http://www.cnseay.com/tools/upgrade/codesafecheck.zip";
string filename = Application.StartupPath + "\\new.zip";

下面就是程序的更新代码,可以看到没有对下载文件作任何校验,直接在当前目录下对zip包进行解压,这里我尝试进行目录穿越让我们对exe解压到其他目录,但是没有成功。

        public void DownloadFile()
        {
            listbox_info.Items.Add("开始升级...");
            try
            {
                System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(DownURL);
                System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();
                long totalBytes = myrp.ContentLength;

                toolStripProgressBar1.Maximum = (int)totalBytes;

                listbox_info.Items.Add("正在下载升级包...");

                Stream st = myrp.GetResponseStream();
                Stream so = new FileStream(filename, System.IO.FileMode.Create);
                long totalDownloadedByte = 0;
                byte[] by = new byte[1024];
                int osize = st.Read(by, 0, (int)by.Length);
                while (osize > 0)
                {
                    totalDownloadedByte = osize + totalDownloadedByte;
                    System.Windows.Forms.Application.DoEvents();
                    so.Write(by, 0, osize);

                    toolStripProgressBar1.Value = (int)totalDownloadedByte;

                    osize = st.Read(by, 0, (int)by.Length);

                    //percent = (float)totalDownloadedByte / (float)totalBytes * 100;

                    System.Windows.Forms.Application.DoEvents(); //必须加注这句代码,否则将因为循环执行太快而来不及显示信息  

                }

                listbox_info.Items.Add("下载完成... ...");

                so.Flush();//将缓冲区内在写入到基础流中  
                st.Flush();//将缓冲区内在写入到基础流中  
                so.Close();
                st.Close();

                unzip();
                listbox_info.Items.Add("升级成功...");
            }

            catch (System.Exception)
            {
                listbox_info.Items.Add("升级失败...");
            }
        }

        public void unzip()
        {
            listbox_info.Items.Add(" ");
            listbox_info.Items.Add("正在解压文件...");
            try
            {
                Shell32.ShellClass sc = new Shell32.ShellClass();
                Shell32.Folder SrcFolder = sc.NameSpace(filename);
                Shell32.Folder DestFolder = sc.NameSpace(Application.StartupPath + "\\");
                Shell32.FolderItems items = SrcFolder.Items();
                DestFolder.CopyHere(items, 20);
                listbox_info.Items.Add("解压完成...");
            }
            catch (Exception)
            {
                listbox_info.Items.Add("解压失败...");
            }

        }

利用方式1,Dll劫持(未利用成功)
因为下载结束后,程序会重新启动,而重启的exe名称已经写死了,这里我们可以尝试寻找Seay源代码审计系统.exe是否存在Dll劫持漏洞,我们可以下载恶意Dll文件到当前目录,当"Seay源代码审计系统.exe"启动时会自动加载我们的恶意Dll

     DownloadFile();
            if (MessageBox.Show("是否重新启动程序", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
            {
                try
                {
                    System.Diagnostics.Process.Start("Seay源代码审计系统.exe");
                }
                catch (Exception)
                {
                }
            }
        }

通过Windbg发现"Seay源代码审计系统.exe"会调用当前目录下MyScript.dll,根据代码发现是CSPluginKernel项目编译的,但是此Dll没有导出表,无法利用,欢迎各位大佬指点一下。
[图片]
[图片]

利用方式2,在主程序添加后门功能
我们直接修改"Seay源代码审计系统.exe"代码并在中加入恶意代码,通过更新下载对原有对exe进行替换,当程序重启的时候就可以运行我们的恶意代码了。
[图片]
在Main函数加入弹窗函数,编译、运行,弹窗成功触发。

思考
随着使用Https协议的软件越来越多,此类漏洞现在越来越少了,但是我们还是需要提高警惕,相信还是有不少人还在使用这款工具把,我也在使用,如果使用过程中受到DNS劫持,或者请求的www.cnseay.com域名被攻击者抢注,很容易就被植入木马了,建议大家使用的时候断网操作。