【问题标题】:Pull Arris SB8200 Cable Modem Status With Curl用卷曲拉动 Arris SB8200 电缆调制解调器状态
【发布时间】:2021-02-25 03:09:27
【问题描述】:

短版:

  • 我使用 Node-RED 自动化来管理网络。
  • 通过 Node-RED,我查询 Arris SB8200 电缆调制解调器以每小时获取连接和事件状态并存储在数据库中。
  • 最近的 Comcast 调制解调器固件更新强制使用调制解调器上的用户/密码来检索状态。
  • 我无法通过 cURL 成功进行身份验证和检索状态,但可以通过浏览器进行。

我用谷歌搜索并尝试了十几种不同的 cURL 身份验证方法,但均未成功。有 3 个复杂因素:

  1. 用户名/密码验证。我假设这只是基本身份验证,应该不是问题,但请参阅 #2。
  2. 有一个会话cookie“凭据”必须在请求之间维护。这应该不是问题,但无论我尝试什么,都不会在我指定的 cookies.txt 文件中捕获任何 cookie。
  3. 手动登录(到https://192.168.100.1/)后立即重定向(到https://192.168.100.1/cmconnectionstatus.html)。当我尝试使用 chrome 开发工具“另存为 cURL”时,只有重定向可用,而不是初始登录,因此我无法捕获登录 cURL。

我希望读到这篇文章的人已经卷曲到带有用户/密码验证的 SB8200 电缆调制解调器(或类似的)中,并且可以发布详细信息。更有可能的是许多关于尝试的建议和一些谷歌结果链接,其中大部分我可能已经尝试过了。我认为最有帮助的是解决为什么我无法成功登录和在初始 cURL 上设置的凭据 cookie。

顺便说一句 - 用户名和密码是我知道的,由我设置,并且可以正常从浏览器登录。我认为无论我如何传递凭据,我都会再次返回登录表单。也许基本身份验证永远不会起作用,我需要做点别的。

编辑:我在 Chrome 开发工具中发现了“保留日志”选项。这使我可以将登录和重定向操作都复制为 curl。并且运行登录 curl(确实使用基本身份验证)确实会在标准输出上返回我一个凭据 cookie。我无法使用 curl 中的 cookie 选项将此 cookie 存储在我的 cookies.txt 文件中。并且立即在重定向 curl 中使用返回的 cookie 不会让我得到预期的结果,而是返回登录页面。但我越来越近了。

这是 Chrome 捕获的用于从浏览器登录和重定向的 cURL:

curl 'https://192.168.100.1/cmconnectionstatus.html?<REDACTED>' \
  -H 'Connection: keep-alive' \
  -H 'sec-ch-ua: "Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"' \
  -H 'DNT: 1' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'Authorization: Basic <REDACTED>' \
  -H 'Content-Type: application/x-www-form-urlencoded; charset=utf-8' \
  -H 'Accept: */*' \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36' \
  -H 'X-Requested-With: XMLHttpRequest' \
  -H 'Sec-Fetch-Site: same-origin' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Accept-Language: en-US,en;q=0.9' \
  -H 'Cookie: HttpOnly: true, Secure: true' \
  --compressed \
  --insecure

curl 'https://192.168.100.1/cmconnectionstatus.html' \
  -H 'Connection: keep-alive' \
  -H 'sec-ch-ua: "Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'Upgrade-Insecure-Requests: 1' \
  -H 'DNT: 1' \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36' \
  -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \
  -H 'Sec-Fetch-Site: same-origin' \
  -H 'Sec-Fetch-Mode: navigate' \
  -H 'Sec-Fetch-User: ?1' \
  -H 'Sec-Fetch-Dest: document' \
  -H 'Accept-Language: en-US,en;q=0.9' \
  -H 'Cookie: HttpOnly: true, Secure: true; credential=gmhyY4SjR3qiWBiNIOtivpj4TF5Zwad' \
  --compressed \
  --insecure
 

这是我尝试登录时返回的 HTML 文档:

<!DOCTYPE html>
<html>
<head>
<title>Login</title>
<script src="jquery-1.7.1.min.js"></script>
<script src="json2.js"></script>
<script src="main_arris.js"></script>
<script src="jquery-2.0.3.min.js"></script>

<script>
$(document).ready(function(){
    $("#htmlheader").load("htmlheader.htm");
});
</script>
</head>

<body>
<div id="htmlheader"></div>
<div class="header">

<script>
$(document).ready(function(){
    $("#pageheaderA").load("pageheaderA.htm"); 
});
</script>


         <div id="binnacleWrapper1" class="binnacleItems_hide" style="display:none;">
            <div id="binnacleWrapper2" class="binnacleItems_hide" style="display:none;">
                <div id="binnacleWrapperLeft"><img src="px1_Ux.png" alt="" class="binnacleWrapperShim"></div>
                <div id="binnacleWrapperRight"><img src="px1_Ux.png" alt="" class="binnacleWrapperShim"></div>
                <div id="binnacleWrapperMiddle">
                    <div id="binnacleInnards">
                        <div id="binnacleIndicatorWrap"></div>
                            <div id="binnacleModelName">
                             <span id="thisModelNumberIs">
                               <label id="model">SB8200</label></span></div>
                    </div>
                </div>
            </div>
        </div>

<div id="pageheaderA"></div>

        <div class="container">
                <div class="subHeader">
                        <div class="subHeadcontent">Login</div>
                </div>
        <form action="">
               <br>
               <b>Username:</b><br>
               <input type="text" id="username" onkeypress="return checkForActivate(event)">
               <br>
               <br>
               <b>Password:</b><br>
               <input type="password" id="password" onkeypress="return checkForActivate(event)">
               <br>
               <br>
               <input type="button" id="loginButton" onclick="validate(this.form)" value="Login">
        </form>
        </div>

<div class="spacer40" style="text-align: center; color: red; font-weight: bold;"></div>
<div class="spacer70"></div>

</div>
<!--gap<div id="bmtg"><div class="gap1"><div class="gap2"><div class="gap3"><div class="gap4"></div></div></div></div></div>-->

<div id="fg1"><div id="fg2"><div id="fg3"><div id="fg4"><div id="fg5"><div id="fg6"><div id="fg7">
   <div id="logo_bottom"><a href="http://www.arris.com"><img src="px1_Ux.png" alt="ARRIS" title="ARRIS" class="logo_bottom"></a></div>
   <div id="copyright">
      <a href="http://www.arris.com">&copy;CommScope, Inc. All rights reserved. ARRIS, SURFBOARD and SURFBOARD MAX are trademarks of CommScope, Inc.<br />All other trademarks are the property of their respective owners.</a>
   </div>
</div></div></div></div></div></div></div>
<!--/div-->


<script>
function authenticateUser(user, password)
{
    var token = user + ":" + password;

    // Base64 Encoding -> btoa
    var hash = btoa(token); 

    var auth = hash;
    sessionStorage.setItem('auth', auth);
    return auth;
}

function validate( form )
{
        $(".spacer40")[0].innerHTML = "";
        authenticateUser(form.username.value, form.password.value);
        localStorage.setItem('username', form.username.value);
        eraseCookie("credential");
        $.ajax({
            type: 'GET',
            url:"/cmconnectionstatus.html?" + sessionStorage.getItem('auth'),
            contentType: 'application/x-www-form-urlencoded; charset=utf-8',
            xhrFields: {
               withCredentials: true
            },
            headers: {
               'Authorization': 'Basic ' + sessionStorage.getItem('auth')
            },
            success: function (result) {
               var token = result;
                createCookie("credential", result);
                window.location.href = "/cmconnectionstatus.html";
            },
            error: function (req, status, error) {
            alert(error);
            }
        });
}
   

function checkForActivate( e )
{
   if( e.keyCode == 13 )
   {
      document.getElementById("loginButton").click();
   }
   
   return true;
}
   
</script>

<!--/div-->
</body>
</html>

【问题讨论】:

    标签: authentication curl


    【解决方案1】:

    自己解决了。一旦我能够将登录信息保存为 chrome 中的 curl,一切就到位了。看起来我在最初的尝试中缺少一些必需的 curl 选项。我仍然需要将其缩小到最少的必要选项,消除用户/密码 chrome 编码的双重副本,并添加错误检查。但以下将成功登录并拉取 Arris SB8200 的调制解调器状态。从来没有让 curl 将凭据 cookie 存储在 cookies.txt 文件中,所以只使用了本地 shell 变量。

    cookie=`curl 'https://192.168.100.1/cmconnectionstatus.html?<REDACTED>'   -H 'Connection: keep-alive'   -H 'sec-ch-ua: "Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"'   -H 'DNT: 1'   -H 'sec-ch-ua-mobile: ?0'   -H 'Authorization: Basic <REDACTED>'   -H 'Content-Type: application/x-www-form-urlencoded; charset=utf-8'   -H 'Accept: */*'   -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36'   -H 'X-Requested-With: XMLHttpRequest'   -H 'Sec-Fetch-Site: same-origin'   -H 'Sec-Fetch-Mode: cors'   -H 'Sec-Fetch-Dest: empty'   -H 'Accept-Language: en-US,en;q=0.9'   -H 'Cookie: HttpOnly: true, Secure: true'   --compressed   --insecure`
    
    curl 'https://192.168.100.1/cmconnectionstatus.html'   -H 'Connection: keep-alive'   -H 'sec-ch-ua: "Chromium";v="88", "Google Chrome";v="88", ";Not A Brand";v="99"'   -H 'sec-ch-ua-mobile: ?0'   -H 'Upgrade-Insecure-Requests: 1'   -H 'DNT: 1'   -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36'   -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'   -H 'Sec-Fetch-Site: same-origin'   -H 'Sec-Fetch-Mode: navigate'   -H 'Sec-Fetch-User: ?1'   -H 'Sec-Fetch-Dest: document'   -H 'Accept-Language: en-US,en;q=0.9'   -H 'Cookie: HttpOnly: true, Secure: true; credential='$cookie  --compressed   --insecure

    【讨论】:

    • 重要提示:SB8200中的登录验证码似乎是由于对未验证登录的安全考虑而匆忙实施的。允许的并发会话数似乎有限制,固定项目会话表。在多个并发的唯一登录会话之后,SB8200 将停止接受任何登录,直到重新启动。它将返回无效的用户/密码。脚本访问最简单的解决方案是为注销添加 curl,以便每个会话干净地结束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多