如何自动激活HIKVISION DS-2CD2512F-IS?

时间:2016-02-22 13:58:08

标签: linux automation cryptography

我有一台HIKVISION DS-2CD2512F-IS,我正试图从Linux机箱自动执行激活步骤,而我却试图弄清楚如何进行逆向工程Web界面如何做到这一点。设置其他所有内容非常简单 - 只需将一堆XML文件上传到URL,并在URL中嵌入用户名和密码即可 - 但设置密码的初始激活步骤让我变得疯狂。当然,我可以通过网络界面或者通过HIKVISION软件轻松完成......但是如果相机工作,他们每年需要被一百个不同的人一起激活30个国家,密码错字意味着相机不会玩。此外,当然,正在这样做的承包商在阅读或遵循指示时并不是100%可靠(毫不夸张地说,承包商说#34是非常常见的;没有人告诉我我和" #39; d需要在三个不同的位置以粗体显示工作单上的#34;因此我无法确定他们是否带有适当的笔记本电脑软件无论如何都能做到。因此,出于可靠性和劳动力成本的原因,我希望自动化所涉及的一切。到目前为止,我唯一的关键点是相机上的激活步骤。

在所有这些地方,我都会在我的控制下运送一个Linux机箱(它是一个克隆的图像)。我可以在主服务器上放一个bash脚本(以及我喜欢的任何命令行程序),并在机器上分配一个按钮来运行它,没有任何问题,并且我对自动化除了此时激活。

现在,他们的客户服务团队向我发送了一份激活指南(您可以在此处看到:http://docdro.id/ntP7v8w),但是撰写它的人显然没有将英语作为他们的第一语言。我已经使用WireShark收听我的浏览器和相机之间的交换,并且它肯定使用引用的API来进行实际激活。但是,我似乎无法使其发挥作用。到目前为止我的测试脚本......遗憾的是,我似乎无法在此处渲染它。通过相机的javascript(痛苦,因为有人在其上运行最小化,所以没有任何评论,所有变量都是单个字母)表明我需要:

1)生成我的RSA密钥。 2)将我的密钥从base 64更改为二进制。 3)将二进制密钥转换为基本16密钥。 4)将基础16密钥重新编码为基础64。 5)将密钥传输到摄像机(用XML包装)。 6)更改基数64的返回值(解开XML后)。 7)将提取的信息转换为二进制,将其视为转换的基本16个人类可读整数。 8)将该二进制信息转换为openssl采用的base64。 9)用我的钥匙从1解密相机的响应。 10)使用所述随机字符串作为AES密钥(其中......很可能会再次涉及步骤7和8)以使用openssl加密我的密码。 11)通过撤消base64转换从该结果中提取二进制数据。 12)将该二进制数据转换为ascii编码的base-16整数 13)将ascii编码的base-16整数转换为base64 14)将其传输到摄像机(用XML包装)

...而且我在确定如何在Linux中实现这一目标时遇到了一些障碍。有什么帮助吗?

作为旁注,似乎文档中引用的API页面在激活后仍保持活动状态......这不是我计划实施的问题,因为它们都在物理上隔离的网络上,但不是很好

4 个答案:

答案 0 :(得分:4)

海康威视激活指南与ISAPI接口。

  1. 首先,检查凸轮是否支持激活和激活尚未完成。为此,只需使用GET请求阅读此页面而不进行自动化: CAM_IP / SDK / activateStatus 如果摄像头支持激活,它将以XML响应:
  2. <ActivateStatus xmlns="http://www.std-cgi.com/ver10/XMLSchema" version="1.0">
    <Activated>true</Activated>
    </ActivateStatus>
    

    并且在标签“已激活”中,如果已经激活了“假”,则表示“真实”值,如果没有,则为“假”。 如果cam不支持激活,它会回复如下:

    <!DOCTYPE html>
    <html><head><title>Document Error: Unauthorized</title></head>
    <body><h2>Access Error: 401 -- Unauthorized</h2>
    <p>Authentication Error: Access Denied! Authorization required.</p>
    </body>
    </html>
    
    1. 生成长度为1024位且e = 65537的RSA密钥。 “n”部分公钥转换为十六进制字符串,如a(每个字节转换为2个字符): b0d89eb193490db47f1f0d419f4962e610d96ed7​​1e592b2bc017e8089ea45d990970af604018bbf450c488d5c08f8954b6d0d88a6388039c93d4bd4df36cf25a349bc1cc91f6484821a789ad7cea524429f817a9f14ccdb2fd46566d6f6dbcea60d152a40cd649d660dac0b8e269f024787bd3d7d15dcd4656ca2f4cc583cb2f
    2. 然后这个字符串用base 64编码。结果字符串放入下一个XML的标签“key”中:

      <PublicKey>
      <key>publickey</key>
      </PublicKey>
      

      并使用POST请求发送到CAM_IP / ISAPI / Security / challenge

      1. 之后我们收到这样的答案:
        <Challenge version=“2.0” xmlns=“http://www.isapi.org/ver20/XMLSchema”>
        <key>MDcyYzhlODc5NTRlOGJkODY1YWE0NDVmYzQ2YWU5MGQyNWZiNmI5ZDk1ZWRkYzRkOTRl MmRmYmNjZjhmNThmMzQ4NTA3ZTYyODI5YzkyZjZlNjNlMDY2ZjUzM2E1MWY2MGJhYjllNDk3NW NjNjNhZGM0MTcxZjhkNjk1M2MyN2YxOTNkZTc1NDdiZmU2ZGNkNTQ2ZmVhN2U0NTAwZjJkOTlk MTlkZjJkM2YyODM0ODQ2MjQyMjE5ZGE3MjY5NDI0YTMyZjY3NjNhM2JjOTEwZmU1ZTg2YTgzMzB lZjE3NDQ1ZWNjMzA4MzEzYzNkMjYwOGQzZjFjM2ZlMDEwNGFkYg==</key> </Challenge>
        
      2. 来自标签“key”的字符串使用base64解码,它的十六进制字符串如下: 072c8e87954e8bd865aa445fc46ae90d25fb6b9d95eddc4d94e2dfbccf8f58f348507e62829c92f6e63e066f533a51f60bab9e4975cc63adc4171f8d6953c27f193de7547bfe6dcd546fea7e4500f2d99d19df2d3f2834846242219da7269424a32f6763a3bc910fe5e86a8330ef17445ecc308313c3d2608d3f1c3fe0104adb

        将其转换为字节数组(每对字符转换为一个字节,与所有步骤中使用的转换方式相同,在此示例中,它应以0x07,0x2c,0x8e,...开头)。用私有RSA密钥(在步骤2生成)描述它并获取最后32个字节的解密结果。它应该是另一个十六进制字符串。

        1. 步骤3中的结果字符串转换为字节数组。该阵列将用作AES密钥。使用此密钥加密步骤3的结果字符串的前16个字节。

        2. 然后您需要为cam选择新密码。如果它短于16个符号,则需要用字符\ 0填充密码字符串到长度为16.然后用相同的AES密钥对其进行加密。

        3. 从步骤4和5中汇总字节数组并将其转换为十六进制字符串(每个字节转换为2个字符)。使用base64编码结果字符串。

        4. 第6步的结果base64字符串在下一个XML中放入标记“password”:

        5. <?xml version="1.0" encoding="UTF-8"?>
          <ActivateInfo>
          <password>pass</password>
          </ActivateInfo>
          

          并使用PUT请求发送到: CAM_IP / ISAPI /系统/激活

          答案应该是:

          <?xml version="1.0" encoding="UTF-8"?>
          <ResponseStatus version="2.0" xmlns="http://www.hikvision.com/ver20/XMLSchema">
          <requestURL>/ISAPI/System/activate</requestURL>
          <statusCode>1</statusCode>
          <statusString>OK</statusString>
          <subStatusCode>ok</subStatusCode>
          </ResponseStatus>
          

          批量配置Hikvision Cams激活的python脚本: https://github.com/qb60/Hikvision-batch-configure

答案 1 :(得分:1)

如果您有一个网站,那么只需自动化该网站即可。使用Selenium相当容易,它可能会对您喜欢的语言进行绑定。您可以使用不同的浏览器,包括PhantomJS之类的无头浏览器,或通过xvfb无头地使用任何桌面浏览器。

答案 2 :(得分:1)

最终脚本在PhantomJS中运行,感谢Artjom B指向我的程序(注意:在最终脚本中使用了不同的密码,相机型号总是在此固件上使用IP地址192.168.1.64,所以很难 - 有意义的编码)

编辑:以下显然仅适用于HIKVISION固件5.3.0。我在HIKVISION固件5.3.4上用相机短暂播放,他们更改了javascript文件名,以及按钮和字段名称。

/**
 * Wait until the test condition is true or a timeout occurs. Useful for waiting
 * on a server response or for a ui change (fadeIn, etc.) to occur.
 *
 * @param testFx javascript condition that evaluates to a boolean,
 * it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
 * as a callback function.
 * @param onReady what to do when testFx condition is fulfilled,
 * it can be passed in as a string (e.g.: "1 == 1" or "$('#bar').is(':visible')" or
 * as a callback function.
 * @param timeOutMillis the max amount of time to wait. If not specified, 3 sec is used.
 */

"use strict";
function waitFor(testFx, onReady, timeOutMillis) {
    var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 3000, //< Default Max Timout is 3s
        start = new Date().getTime(),
        condition = false,
        interval = setInterval(function() {
            if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {
                // If not time-out yet and condition not yet fulfilled
                condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code
            } else {
                if(!condition) {
                    // If condition still not fulfilled (timeout but condition is 'false')
                    console.log("'waitFor()' timeout");
                    phantom.exit(1);
                } else {
                    // Condition fulfilled (timeout and/or condition is 'true')
                    console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms.");
                    typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled
                    clearInterval(interval); //< Stop this interval
                }
            }
        }, 250); //< repeat check every 250ms
};


var page = require('webpage').create();

// Open camera and, onPageLoad, do...
page.open("http://192.168.1.64/doc/page/login.asp", function (status) {
    // Check for page load success
    if (status !== "success") {
        console.log("Unable to access network");
    } else {
        page.viewportSize = {
                width: 800,
                height: 600
        };
        // Wait for 'signin-dropdown' to be visible
        waitFor(function() {
            // Check in the page if a specific element is now visible
            return page.evaluate(function() {
                return $("#btnOK").is(":visible");
            });
        }, function() {
           console.log("The sign-in dialog should be visible now.");
                //page.includeJs("//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js", function() {
                page.includeJs("http://192.168.1.64/doc/script/jquery-1.7.1.min.js", function() {
                        page.evaluate(function() {
                                $('#newPassword').val("MyPassword1");
                                $('#newComfirmPassword').val("MyPassword1");
                                $('#btnOK').click();
                        });
                });
                window.setTimeout(
                        function() {
                                page.render("test.png");
                                phantom.exit();
                        },
                        5000);
                //phantom.exit();
        });
    }
});

答案 3 :(得分:0)

海康威视摄像机使用称为SADP的激活协议。

您可以使用SADP SDK在网络上查找相机并激活它。

请查看ftp://ftp.hikvisionusa.com/以获取SDK。他们有Windows,Linux,Android和iOS版本。