华为光猫(ONU) 在Web界面实现跨运营商认证

不改公办界面通过管理员账户配置Loid/password/SN参数以实现跨运营认证使用

August 21, 2024

现在华为光猫telnet提权比较困难,可以不改界面的的情况,通过管理员账户登录。 但是联通/电信界面只能修改Loid,无法配置password和修改SN。 分析发现可以打开 http://192.168.1.1/html/amp/ontauth/password.asp 配置Loid/password/SN参数(不可改MAC),以实现跨运营认证使用。

光猫认证的方式

ONT认证就是光猫和运营商设备进行注册和通信, 除了移动使用Paswor 认证外,大部分使用Loid认证,部分地区绑定MAC和SN。

运营商 PON 协议 认证方式 说明
电信 G/E 都有 逻辑ID(即Loid) + Loid密码 (部分地区空) 少数地区绑定SN
移动 GPON Password密码 + SN 或者 LoId 部分地区切换XGPON线路需要解绑,部分省用Loid
联通 G/E 都有 loid + SN,(北京联通绑定MAC无Loid) 部分地方绑定设备标识,

更换光猫就需要确认线路是否支持,认证方式是否可以修改。

默认超级账号和密码

部分光猫可以通过长按重置键盘恢复初始密码(部分地区型号可能无法修改,北京联通没有超级账户)。 重置后即可使用默认管理员账号进入后台。

华为不同运营商版本得常用超级密码

版本 默认超级账号 默认密码 地址 备注
移动 CMCCAdmin aDm8H%MdA http://192.168.1.1 部分型号同普通密码
电信 telecomadmin nE7jA%5m http://192.168.1.1:8080 部分是80端口
联通 CUAdmin CUAdmin http://192.168.1.1/cu.html 部分密码可一样
华为(运营商) telecomadmin admintelecom https://192.168.100.1:80 部分型号同普通密码
华为(企业版) Epadmin adminEp http://192.168.18.1 部分是https

Web 修改运营商方式

从R22之后,开telnet和刷入shell已经非常困难了。 这种方法可以让目前的大部分V5版华光猫都可以在web界面直接修改 LOID (Loid,LoidPassword)和(Password,SN)实现跨运营商使用.

通过公版的页面我们可以找到/html/amp/ontauth/password.asp的iframe页面。

通过分析旧版固件可以找到这个文件。 ont-auth

管理员账户登录,打开路径 http://192.168.1.1/html/amp/ontauth/password.asp,即可修改。(截图为联通版界面)

ont-auth

补充

JS提交

这里是原始代码关于光猫认证的配置页,里面其实有更多的认证方式。

<tr id="TrAuthmode"> 
            <td BindText='amp_auth_mode'></td>
            <td id="TrTdAuthmode" > 
            	<select name="Authmode" size="1" id="Authmode" onchange="OnChangeMode()">
	                <option value="0" BindText='amp_auth_ctclogic' selected></option>
	                <option value="1" BindText='amp_auth_hwkey'></option>
              	</select>
            </td>
          </tr>
          
          <tr id="TrLoid"> 
            <td BindText='amp_scenario_loid'></td>
            <td > <input type="text" name="LOIDValue" id="LOIDValue"  maxlength="24"> </td>
			<td BindText='amp_loid_note'></td>
          </tr>
          
          <tr id="TrPasswordmode"> 
            <td BindText='amp_passwd_mode'></td>
            <td id="TrTdPasswordmode" > 
              <select name="Passwordmode" size="1" id="Passwordmode" onChange="OnChangeMode1()">
                <option value="0" BindText='amp_char_mode' selected="selected"></option>
                <option value="1" BindText='amp_hex_mode'></option>
              </select>
            </td>
          </tr>
          
          <tr id="TrPasswordEpon"> 
            <td BindText='amp_pass_word'></td>
            <td>
              <input name="PwdEponValue" type="password" autocomplete="off" id="PwdEponValue" maxlength="12" onchange="eponpassword=getValue('PwdEponValue');getElById('tPwdEponValue').value = eponpassword;"/> 
              <input name="tPwdEponValue" type="text" id="tPwdEponValue" maxlength="12" style="display:none" onchange="eponpassword=getValue('tPwdEponValue');getElById('PwdEponValue').value = eponpassword;"/> 
            </td>
            <td>
    		  <input checked type="checkbox" id="hidePwdEponValue" name="hidePwdEponValue" value="on" onClick="ShowOrHideText('hidePwdEponValue', 'PwdEponValue', 'tPwdEponValue', eponpassword);" style="margin-right:-2px"/> 
    			  <script>
    			  	document.write(cfg_ontauth_language['amp_password_hide']);
    			  	document.write(cfg_ontauth_language['amp_passwd_note1']);
    			  </script>
            </td>
          </tr>
          
          <tr id="TrPasswordGpon"> 
            <td BindText='amp_pass_word'></td>
            <td> 
            	<input name="PwdGponValue" type="password" autocomplete="off" id="PwdGponValue" maxlength="10" onchange="gponpassword=getValue('PwdGponValue'); getElById('tPwdGponValue').value = gponpassword;hexgponpassword = ChangeAsciitoHex(gponpassword); getElById('tHexPwdValue').value = hexgponpassword; getElById('HexPwdValue').value = hexgponpassword;"/> 
                <input name="tPwdGponValue" type="text" id="tPwdGponValue" maxlength="10" style="display:none" onchange="gponpassword=getValue('tPwdGponValue');getElById('PwdGponValue').value = gponpassword;hexgponpassword = ChangeAsciitoHex(gponpassword);getElById('tHexPwdValue').value = hexgponpassword;getElById('HexPwdValue').value = hexgponpassword;"/> 
            </td>
            <td>
              	<input checked type="checkbox" id="hidePwdGponValue" name="hidePwdGponValue" value="on" onClick="ShowOrHideText('hidePwdGponValue', 'PwdGponValue', 'tPwdGponValue', gponpassword);" style="margin-right:-2px"/>
    			  <script>
    			  	document.write(cfg_ontauth_language['amp_password_hide']);
    			  	document.write(cfg_ontauth_language['amp_passwd_note2']);
    			  </script>
            </td>
          </tr>
          
          <tr id="TrHexPassword"> 
            <td BindText='amp_pass_word'></td>
            <td> 
               <input name="HexPwdValue" type="password" autocomplete="off" id="HexPwdValue" maxlength="20" onchange="hexgponpassword=getValue('HexPwdValue');getElById('tHexPwdValue').value = hexgponpassword;gponpassword = ChangeHextoAscii(hexgponpassword);getElById('PwdGponValue').value = gponpassword;getElById('tPwdGponValue').value = gponpassword;"/> 
               <input name="tHexPwdValue" type="text" id="tHexPwdValue" maxlength="20"  style="display:none" onchange="hexgponpassword=getValue('tHexPwdValue');getElById('HexPwdValue').value = hexgponpassword;gponpassword = ChangeHextoAscii(hexgponpassword);getElById('PwdGponValue').value = gponpassword;getElById('tPwdGponValue').value = gponpassword;"/> 
            </td>
            <td>
            	<input checked type="checkbox" id="hideHexPwdValue" name="hideHexPwdValue" value="on" onClick="ShowOrHideText('hideHexPwdValue', 'HexPwdValue', 'tHexPwdValue', hexgponpassword);" />
	  			  <script>
	  			  	document.write(cfg_ontauth_language['amp_password_hide']);
	  			  	document.write(cfg_ontauth_language['amp_passwd_note3']);
	  			  </script>
            </td>
          </tr>
          
	      <tr id="TrMutualAuth" style="display:none"> 
            <td BindText='amp_mutual_auth'></td>
            <td id="TrTdMutualAuth" >
            	<input checked type="checkbox" id="MutualAuth" name="MutualAuth" value="on" onClick="onMutualAuthSwitch()"/> 
            </td>
          </tr>
          
		  <tr id="TrRegisterId" style="display:none"> 
            <td BindText='amp_pass_word'></td>
            <td> 
				<input name="RegisterId" type="password" autocomplete="off" id="RegisterId" maxlength="36" onchange="xgponregisterid=getValue('RegisterId');getElById('tRegisterId').value = xgponregisterid;"/> 
				<input name="tRegisterId" type="text" id="tRegisterId" maxlength="36"  style="display:none" onchange="xgponregisterid=getValue('tRegisterId');getElById('RegisterId').value = xgponregisterid;"/> 
            </td>
            <td>
            	<input checked type="checkbox" id="hideRegisterId" name="hideRegisterId" value="on" onClick="ShowOrHideText('hideRegisterId', 'RegisterId', 'tRegisterId', xgponregisterid);" style="margin-right:-2px"/> 
  			  <script>
  			     document.write(cfg_ontauth_language['amp_password_hide']);
  			     document.write(cfg_ontauth_language['amp_registerid_note']);
  			  </script>
            </td>
          </tr>
          
		  <tr id="TrPSK" style="display:none"> 
            <td BindText='amp_pass_word'></td>
            <td> 
            	<input name="Psk" type="password" autocomplete="off" id="Psk" maxlength="16" onchange="xgponpsk=getValue('Psk');getElById('tPsk').value = xgponpsk;"/> 
              	<input name="tPsk" type="text" id="tPsk" maxlength="16"  style="display:none" onchange="xgponpsk=getValue('tPsk');getElById('Psk').value = xgponpsk;"/> 
            </td>
            <td>
                <input checked type="checkbox" id="hidePsk" name="hidePsk" value="on" onClick="ShowOrHideText('hidePsk', 'Psk', 'tPsk', xgponpsk);" style="margin-right:-2px"/>
  				  <script>
  				  	document.write(cfg_ontauth_language['amp_password_hide']);
  				  	document.write(cfg_ontauth_language['amp_psk_note']);
  				  </script>
            </td>
          </tr>		  
		  
          <tr id="TrSN"> 
            <td><script>document.write(cfg_ontauth_language['amp_scenario_sn']);</script></td>
            <td> 
	             <script>
	              if(1 == TelMexFlag)
	              {
	            	  document.write('<input type="text" name="SNValue1" id="SNValue1"  maxlength="4" style="width:50px">');
	                  document.write('<input type="text" name="SNValue2" id="SNValue2"  maxlength="8" style="width:68px">');                
	              }
	              else
	              {
	            	  document.write('<input type="text" name="SNValue" id="SNValue"  maxlength="16" >');                
	              }
	              </script>
			 </td>
            <td>
                <font style="color: red;">*</font>
                <script>
    			  if(1 == TelMexFlag)
    			  {
    			  		document.write(cfg_ontauth_language['amp_telmexsn_note']);
    			  }
    			  else
    			  {
    			  		document.write(cfg_ontauth_language['amp_passwd_note4']);
    			  }
  			  </script>
            </td>
          </tr>
          
          <tr id="TrHwkey"> 
            <td BindText='amp_ontauth_hwkey'></td>
            <td> <input type="text" name="HwkeyValue" id="HwkeyValue" maxlength="32"></td>
            <td BindText='amp_passwd_note5'></td>
          </tr>
          
		  <tr id="tr_guide_apply" style="display:none;">
			<td></td>
			<td  colspan="2" style="padding-top: 20px;">
				<input type="hidden" name="gd_onttoken" id="gd_hwonttoken" value="<%HW_WEB_GetToken();%>">
				<input id="pre" type="button" class="CancleButtonCss buttonwidth_100px" style="margin-left:0px;" BindText="amp_wifiguide_prestep" onClick="window.parent.location.href='../../ssmp/cfgguide/guideindex.asp';">
				<input id="guidewancfg" type="button" class="ApplyButtoncss buttonwidth_100px" BindText="amp_wifiguide_nextstep" name="../../html/bbsp/wan/wan.asp?cfgguide=1" onClick="Submit();">
				<a id="a_skip" href="#" style="display:block; margin-top: -28px;margin-left: 230px;font-size:16px;text-decoration: none;color: #666666;width: 35px;" onclick="window.parent.onchangestep(window.parent.wifiPara);"><script>document.write(cfg_ontauth_language['amp_wifiguide_skip']);</script></a>
			</td>
	    </tr>

也可以直接在网页的console调试中执行JS,来修改:

fetch("/html/amp/ontauth/set.cgi?x=InternetGatewayDevice.DeviceInfo&RequestFile=html/amp/ontauth/password.asp", {
  headers: {
    "content-type": "application/x-www-form-urlencoded",
  },
  body: "x.X_HW_PonHexPassword={PASSWORD_HEX}&x.X_HW_PonSN={SN_HEX}&x.X_HW_ForceSet=1&x.X_HW_Token={TOKEN_IN_THE_PAGE}",
  method: "POST",
  mode: "cors",
  credentials: "include"
})

上行口的修改(待验证)

分析固件可以通过 http://192.168.1.1/html/ssmp/mainupportcfg/mainupportconfig.asp 修改上行口,(暂时无法验证)