X为光猫与威斯汀
一天,跟几个老哥在一起吃饭的时候吹B,说现在的人技术不咋样,但是心还很大,培训三个月出来就敢要求月薪上W,其中一个哥们接话,他们有个技术问题,卡了2个月还没搞定(我叫他A哥吧),我说“你们P大点的公司,有毛的个技术问题啊,还卡这么长时间。哥给你搞定,到时候吃顿饭就成”。A哥一听来精神了,“对啊,我TM咋把你这尊大神忘记了。这事你要给搞定了,威斯汀一日游”。“成交”
晚上,A哥发来了关于那个技术问题的具体情况-----获取X为光猫(http://b2b.hc360.com/supplyself/621259462.html)光电转换口的速度。NMB,不知道我没有接触过嵌入式相关的啊,这些设备上的事情,我知道个球啊。但是话都说出去了,脸打太快也疼不是。硬着头皮上,看看再说。
整理下思路,如果不能上网,那还有球的个转换速度啊。好,连到光纤上,哈哈,果然不能上网,开森啊。电话A哥,”这玩意在我这里不好使啊。Balabala~~”,”你改几个参数,在XXXXXXX,我发个文档给你”。VLAN?LOID? 这TM是啥啊?啥啊?照着做,看看再说。不行我就找个借口开溜。

唉,什么意思。居然连上了,我X啊。
继续整理思路,进入web管理页面看看,说不定有呢,那就简单了撒。OK,进入web管理,果然让我找到了一个。马上电话A哥,“明天威斯汀?看QQ消息”
“这个不对啊,而且有几个问题:1、需要登录才能获取。但事实上每个地区或者每个用户密码可能是不一样的,不能批量进行;2、这个是收发包数量,不是速度啊。哥,再帮忙看看呗,威斯汀在等着你”
好像也对。那就看看这个鬼是怎么来的吧。
1.1 通过查看当前页面源代码,发现最终嵌入的页面地址为http://172.16.1.1/html/amp/opticinfo/opticinfo.asp,输入浏览器验证,没问题,通过。
1.2 通过telnet登录光猫。进入光猫shell,如下:

用户名root,密码 admin
我X,这什么意思?电话A哥,得到还要su,然后shell才能真正进入linux的shell环境。照做,别说话。
哥,你是我亲哥。
直接搜索上面的文件名,看看是个什么鬼。
第一个就是,看来离威斯汀不远了。
经过一番折腾之后,来到这里。
var PONTxPackets = '<%HW_WEB_GetParaByDomainName(InternetGatewayDevice.WANDevice.1.X_HW_PonInterface.Stats.PacketsReceived);%>';
经人指点,应该是用的goahead的一个定制版本做的web容器。表示的意思是调用函数HW_WEB_GetParaByDomainName,并将InternetGatewayDevice.WANDevice.1.X_HW_PonInterface.Stats.PacketsReceived作为传输传递给刚才的函数。
1.3 那就看看这个web容器的函数实现,先得找到文件啊。
2066,错不了。
/var/web是个文件夹,无关,不管。/bin/web是个elf文件,应该错不了。Tftp下来看看吧。本地tftp走起。感谢Ph.Jounin
。
拿到web,IDA有请。然并卵啊,web里面没有那函数。威斯汀啊,这TM什么情况啊。
经请教高人得知,应该是其他库提供了这个函数,web进程加载了相应的库,看看依赖的库呢。
尼玛,这只是其中一部分啊。硬着头皮一个一个看吧。找啊找,终于在libhw_web_dll.so库中找到HW_WEB_GetParaByDomainName函数。
F5的代码大体如下:
int __fastcall HW_WEB_GetParaByDomainName(int a1, int a2, int a3)
{
if ( webEjArgs(v3, v4, "%s", &v14) <= 0 ) <-----------格式化参数
{...... }
else
{
v6 = j_HW_WEB_GetNodeName((int)&s, v14); <----------拆分参数 这里是按照.进行拆分
if ( v6 ){...... }
else
{
v8 = HW_CFG_InitAttList((int)&v18); <--------关键函数1
if ( v8 ) {...... }
else
{
v7 = HW_WEB_GetNodeValue((int)&v18, v14, (int)&v16); <-------关键函数2
if ( v7 ){...... }
else
{
v7 = HW_WEB_GetNodeValueByName((int)&v15, (int)&s, (int)&v18); <---------关键函数3
if ( v7 ){......}
else
{
v9 = HW_WEB_GetEscapeLength(v15); <----------编码函数,猜测是获取到数据之后编码为指定的格式
v10 = HW_OS_MemMallocSet(v9, 0, 10, 1);
......
}
}
}
}
}
return v7;
}1.4 在libhw_smp_web_base.so库中找到函数 HW_WEB_GetNodeValue。F5如下
int __fastcall HW_WEB_GetNodeValue(int a1, int a2, int a3)
{
...
else
{
v8 = HW_CFG_GetCmdPro(10, (int)&s, (int)&v16, (int)&v15); <------------关键函数4
HW_CFG_FreeAttList(&v15);
if ( v8 )
HW_PROC_DBG_LastWord_1("hw_web_productapi.c", 2337, v8);
} } }
return v8;
}1.5 在libhw_smp_cfg.so库中发现关键函数4---HW_CFG_GetCmdPro ,F5大概如下
int __fastcall HW_CFG_GetCmdPro_0(int a1, int a2, int a3, int a4, int a5)
{
HW_OS_MemSet_S((int)&v32);
v15 = j_HW_CFG_InitAttList((int)&v32);
......
v12 = j_HW_CFG_CheckParaList(v8, v9, (int)&v32);
......
v12 = j_HW_CFG_CheckParaList(v8, a5, (int)&v32);
......
v12 = j_HW_CFG_GetKeyLen(v6, (int)&v30);
......
......
v12 = j_HW_CFG_AppendPara2Buffer(v9, &v32, &v33, *(_DWORD *)v6);
......
v12 = HW_XML_DBTTreeGetObjAttrValue(v8, v7, 16, v28);
......
else if ( j_HW_CFG_GetObjApiCmo(v28, (int)"GetApi", (int)&v31) )
.....
v12 = sub_4954(v28);
......
v12 = j_HW_CFG_SetRpcMsgHead(v8, v28, (int)&v34);
......
j_HW_CFG_SPEC_GetCallWaitTime(0, v23, v24);
v25 = HW_MSG_RpcCall((int)&v34, v31, v8, v18);
......
}
return v12;
}这里可以看到,最后走了一个RPC调用。谁提供的RPC服务?我TM哪知道啊。行,第一回合结束。
