糟糕,系统又被攻击了

几年前,我们的电商平台遭遇过一次CC攻击(一种分布式网络攻击,后面有详细介绍),当时整个网站几乎陷于瘫痪的状态。期间很多PC网页和APP页面打不开或者持续报错,下单流程也彻底跑不通了。

上图是对网站流量的监控。我们可以看到10:00时UV(访问用户)和client IP数量突然激增,翻了几千倍。

从后台监控看(上图),CPU资源也被耗尽了。由于CPU被耗尽,服务器慢得要命,所以当时根本无法登入服务器查看CPU详细的使用情况,只能根据监控页面查看CPU使用情况。

另外,出口带宽也被打满了。所以那段时间很多请求根本进不来。用户看到的就是空白页面,请求错误等情况。

经过分析,我们发现这次攻击是新品限量首发活动引发的,是一次薅羊毛活动。攻击者专门针对限量的新品进行了分布式网络攻击,目的就是抢到限量新品,让后再在市场上高价出售获利。

攻击者利用接码平台(接码平台,通俗点讲就是接收手机验证码的平台)提前注册好大量的账号。然后提前准备好脚本程序,利用一些攻击工具(文末有工具列表)将这些脚本分发到大量的代理或者肉鸡,并通过这些代理和肉鸡对网站发起分布式攻击 。攻击步骤如下图:

下面我们详细了解一下CC攻击。了解CC攻击之前我们先弄清下面几个概念。

僵尸主机&僵尸网络

僵尸主机是指感染僵尸程序病毒,从而被黑客程序控制的计算机设备。该计算机设备可以是终端设备,也可以是云端设备,例如个人电脑,手机,云端主机等。一般情况下,僵尸主机已经被人操控并和其他僵尸主机组成了一个僵尸网络。例如,一个人非法控制了10000台电脑,他可以同时调度这10000台电脑发起网络攻击行为,那么其中任意一台电脑就可以称为僵尸主机,而这10000台电脑就组成了僵尸网络(其实是每个电脑中被安装了僵尸客户端程序)。通常,一台被侵占的电脑只是僵尸网络里面众多僵尸主机中的一个,僵尸程序会默默在后台运行。一般电脑的拥有者很难察觉到自己的系统已经被“僵尸化”,就仿佛是没有自主意识的僵尸一般。你用的手机电脑表面上看起来正常,也可能是被感染僵尸程序的一员。

肉鸡

肉鸡泛指所有那些被别人控制的计算机设备(电脑和手机等),而不管其是否属于某个僵尸网络,是否被统一调度。计算机设备一旦被别人控制,就成为了别人砧板上的肉,别人想怎么吃就怎么吃,肉鸡(机)一名由此而来,也被称之为傀儡机。当然在肉鸡上安装僵尸程序之后,也就变成一个僵尸主机了,即大家所说的僵尸电脑,也就成了僵尸网络的一员。

DDos攻击

DDos,全称Distributed Denial of Service,中文意思为“分布式拒绝服务”,就是利用大量合法的分布式计算机设备对目标服务器(网站等)发送请求,导致目标服务器CPU、内存、带宽等资源耗尽,从而导致正常用户无法访问目标服务器。通俗点讲就是利用网络节点资源,如:IDC服务器、个人PC、手机、智能设备、打印机、摄像头等对目标发起大量攻击请求,从而导致服务器拥塞,进而无法对外提供正常服务。

CC攻击

CC攻击(Challenge Collapsar)。其前身名为Fatboy攻击。Collapsar(黑洞) 是绿盟科技的一款抗DDOS产品,在对抗拒绝服务攻击的领域内具有很高的影响力和口碑。因此,黑客们把攻击更名为Challenge Collapsar,表示要向黑洞发起挑战。

CC攻击是DDOS(分布式拒绝服务)的一种,是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向受害主机不停访问,造成服务器的内存或CPU等资源耗尽或带宽资源耗尽,直到网站无法访问。

因为CC攻击的访问流量来自成千上万,几十万,甚至数百万的电脑,手机,云主机等客户端。几乎和正常的用户访问没区别,这些攻击请求不具备明显的特征,很难和正常访问区分开来,防御难度也很大。尤其是利用肉鸡组成的僵尸网络发起攻击,动辄是数以万计的机器(其中很多机器可能都是普通用户使用的电脑手机等),这种攻击请求和正常用户请求非常相似,防御难度就更大了。

慢速攻击--CC攻击的变异品种

慢速攻击的基本原理如下:对任何一个开放了HTTP访问的HTTP服务器,先建立了一个连接,指定一个比较大的Content-length,然后以非常低的速度发包,比如1-10s发一个字节,然后维持住这个连接不断开。如果客户端持续建立这样的连接,那么服务器上可用的连接将一点一点被占满,从而导致拒绝服务。

HTTP协议在接收到request之前是不对请求内容作校验的,所以即使你的Web应用没有可用的form表单,这个攻击一样有效。

在客户端建立较大数量的无用连接,并保持持续发包的代价非常的低廉。实际试验中一台普通PC可以建立的连接在3000个以上。这对一台普通的Web服务器,将是致命的打击。更不用说结合肉鸡群做分布式攻击了。

正因为其简单易用,成本低廉,效果明显的特性,慢速攻击成为众多攻击者的研究和利用对象。

发展到今天,慢速攻击也演变成了多种,典型的主要包括如下几类:

Slow headers:Web应用在处理HTTP请求之前都要先接收完所有的HTTP头部,因为HTTP头部中包含了一些Web应用可能用到的重要的信息。攻击者利用这点,发起一个HTTP请求,一直不停的发送HTTP头部,消耗服务器的连接和内存资源。攻击客户端与服务器建立TCP连接后,每10秒才向服务器发送一个HTTP头部,而Web服务器再没接收到2个连续的\r\n时,会认为客户端没有发送完头部,而持续的等待客户端发送数据。

下面是使用 slowhttptest 工具发起的 slow header 攻击:

slowhttptest -H -c 1000 -l 300 -u http://192.168.2.16/test/Mon May 21 02:03:49 2018:slowhttptest version 1.7 - -test type:SLOW HEADERSnumber of connections:1000URL:                              http://192.168.2.16/test/verb: GETContent-Length header value:4096follow up data max size:68interval between follow up data:10 secondsconnections per seconds:50probe connection timeout: 5 secondstest duration:300 secondsusing proxy:no proxy Mon May 21 02:03:49 2018:slow HTTP test status on 45th second:initializing:0pending: 426connected: 407error: 0closed:167service available: NO

Slowhttptest 所发送的请求

GET /DVWA/ HTTP/1.1Host: 192.168.2.16User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2)Referer: TESTING_PURPOSES_ONLYX-aK1: sj4ZX-4: SX-OWw: HX-Dptasviz5: Q...X-headers...

服务端连接数变化

# 客户端发起攻击前,服务端的连接数root@server2:~# netstat -na|grep -i 80|wc -l47# 客户端发起攻击过程中,服务端的连接数root@server2:~# netstat -na|grep -i 80|wc -l461root@server2:~# netstat -na|grep -i 80|wc -l706

Slow body:攻击者发送一个HTTP POST请求,该请求的Content-Length头部值很大,使得Web服务器或代理认为客户端要发送很大的数据。服务器会保持连接准备接收数据,但攻击客户端每次只发送很少量的数据,使该连接一直保持存活,消耗服务器的连接和内存资源。攻击客户端与服务器建立TCP连接后,发送了完整的HTTP头部,POST方法带有较大的Content-Length,然后每10s发送一次随机的参数。服务器因为没有接收到相应Content-Length的body,而持续的等待客户端发送数据。

Slow read:客户端与服务器建立连接并发送HTTP请求,客户端发送完整的请求给服务器端,然后一直保持这个连接,以很低的速度读取Response,比如很长一段时间客户端不读取任何数据,通过发送Zero Window到服务器,让服务器误以为客户端很忙,直到连接快超时前才读取一个字节,以消耗服务器的连接和内存资源。

注:TCP通过滑动窗口(Window)的概念来进行流量控制。设想在发送端发送数据的速度很快而接收端接收速度却很慢的情况下,为了保证数据不丢失,显然需要进行流量控制, 协调好通信双方的工作节奏。所谓滑动窗口,可以理解成接收端所能提供的缓冲区大小。顾名思义,Zero Window,零窗口,即当发送方的发送速度大于接收方的处理速度,接收方的缓冲塞满后,就会告诉发送方当前窗口size=0,发送方此时会立即停止发送数据。

慢速攻击主要利用的是thread-based(基于线程)架构的服务器的特性,这种服务器会为每个新连接打开一个线程,它会等待接收完整的HTTP头部才会释放连接。比如Apache会有一个超时时间来等待这种不完全连接(默认是300s),但是一旦接收到客户端发来的数据,这个超时时间会被重置。正是因为这样,攻击者可以很容易保持住一个连接,因为攻击者只需要在即将超时之前发送一个字符,便可以延长超时时间。而客户端只需要很少的资源,便可以打开多个连接,进而占用服务器很多的资源。

Apache、httpd都采用thread-based架构,很容易遭到慢速攻击。而另外一种event-based(基于事件)架构的服务器,比如 nginx 和 lighttpd 却不容易遭受慢速攻击。

如何防御慢速攻击?

如果请求超过配置的超时时间或者传输速率低于最小速率,那么它就有可能是一个慢速攻击。可以配置合理的从客户端接收HTTP头部和HTTP body的超时时间和最小速率,来避免连接长时间等待。

周期地统计报文数量。一个TCP连接,HTTP请求的报文中,报文过多或者报文过少都是有问题的,如果一个周期内报文数量非常少,那么它就可能是慢速攻击,可以封禁对应IP;如果一个周期内报文数量非常多,那么它就可能是一个CC攻击。

使用较多的慢速攻击工具有:Slowhttptest和Slowloris。

CC等DDos攻击的防御方法如下:

按IP限流

我们可以在网关层(Apache,Nginx,Zuul等),对IP限流,按分钟级和秒级维度限制接口访问次数。当访问次数超过指定阀值后对其他请求做抛弃处理。对访问量过大的IP,放进黑名单,限制访问。将恶意请求的拦截前置到网关层处理,避免大量恶意请求打到后端服务,对服务造成巨大压力。

分组部署,按用户限流

可以将新用户和老用户路由到不同的服务器群组。如果新用户突然暴涨,很可能是混入了大量肉鸡注册的账号,可以将这些新用户的请求路由到专门的新用户服务器群组,保证老用户所在的服务器群组不受影响。之后再找出异常的用户进行封禁和拦截处理。另外还可以按USERID对用户进行限流,如新用户每分钟请求上限为60次/分钟,老用户为45次/分钟。这样可以避免同一用户在短时间内发送大量请求到后端服务器。

更改访问端口

很多情况下,Web Server通过80端口对外提供服务,攻击者也是针对目标站点的对应端口进行攻击的。发现被攻击后,可以临时改变该端口来应对攻击。但是这只是临时策略,稍微懂点网络知识的攻击者会很快发现新改变的接口,改变攻击脚本后即可发动新一轮的攻击。

购买高防IP服务

高仿IP服务算是终极抗D方案了。公司可以通过配置DDoS高防IP服务,把自己的网站域名解析指向高防IP,并配置源站IP。所有公网流量都经过高防IP服务,在高防IP服务上进行清洗过滤后再将正常流量转发到源站IP,从而确保源站IP稳定访问。另外,高防IP服务往往拥有超大带宽,一般的CC攻击几乎不可能耗尽高防IP服务的带宽资源。高防IP防御效果非常好,不过价格也比较贵。我们当时就是采用了这个方式,紧急采购了高防IP,并快速接入我们的网站。

高防IP服务会通过多种手段对请求进行清洗。比如,会根据大数据分析结果,形成各种特征的IP名单。还会根据请求特征对攻击工具进行识别。

页面静态化

尽量将页面静态化,减少对后端服务的访问。静态页面可以充分利用客户端浏览器和反向代理的缓存能力。还可以上CDN,用CDN分担绝大部分的流量。可以大幅降低攻击流量到达后端服务的几率。

避免IP泄漏

为了减少被DDos攻击的可能性,我们需要隐藏真实IP,这可以让攻击者找不到攻击目标,从而有效地保护网站。隐藏IP主要有两种方式,利用CDN或者高防IP。虽然很多公司都接入了CDN,但是还有很多要注意的点,一不留神就会泄漏真实IP。

尽量避免真实业务主机直接发起对外连接,不理解这句的同学可以想想以下场景:用户注册激活、找回密码等业务需要发邮件,如果业务主机直接通过SMTP方式向外发邮件,绝大部分情况下邮件HEADER中会出现真实IP。

防止二级域名IP泄漏。主域名上了CDN,如果管理后台的admin的二级域名没有经过CDN,就可以轻易解析到业务主机的IP,同样泄漏了真实IP。邮件解析的MX,如果没有经过CDN,同样会泄漏真实IP。CDN如果只用了国内的,则可以通过国外主机PING域名来获取真实IP。诸如此类的情况比较多,要引起大家的注意。

注:MX即邮件交换记录。用于将以该域名为结尾的电子邮件指向对应的邮件服务器。例如用户所用的邮件是以域名163.com为结尾,那么在MX解析时就要解析到163.com对应的服务器IP。如果没有经过CDN,很容易获取真实IP。

最后介绍几款分布式网络攻击工具:

LOIC:LOIC是一款专注于web应用程序的Dos/DDOS攻击工具,它可以用TCP数据包、UDP数据包、HTTP请求对目标网站进行DDOS/DOS测试,不怀好意的人可能利用LOIC构建僵尸网络。LOIC是用C#语言写的,这是一个C#新手的练手作品,靠GUI界面吸引了不明真相的小白们使用。由于程序设计上“有意或无意”留下的BUG导致一旦开始攻击在退出进程前无法真正停止攻击,潜在增大了攻击效果。攻击手段主要是以无限循环方式发送大量数据,并无其它特色。LOIC 程序主界面如下。

HULK:HULK是一种web的拒绝服务攻击工具。它能够在web服务器上产生许多单一的伪造流量,能绕开引擎的缓存,因此能够直接攻击服务器的资源池。hulk的特别之处在于:对于每一个请求都是独特的,能够绕开引擎的缓存直接作用于服务器的负载。

Darkddoser:Darkddoser通过僵尸网络发起http攻击,图形界面如下。

Slowhttptest:Slowhttptest是一个可以灵活配置的应用层攻击工具,它能发起诸如slowloris、Slow http post、slow read、slow range等工具实现的慢速攻击。

Zarp:Zarp是采用Python编写的、类似MSF的一款网络攻击测试框架。工具采用模块化设计,集漏洞扫描、嗅探、DDoS压力测试于一身。Zarp主要接口是一个CLI驱动的图形界面,采用多层菜单,使用起来相当方便。

写在最后

在计算机世界的攻与防的博弈中,作为防御者的我们,不可能把系统做到无懈可击,没有任何安全漏洞。我们能做的是,尽量考虑全面,不断的发现问题,将已知的安全问题快速修复。没有绝对安全的系统,也没有无法防御的黑客。只有不断积累安全知识,保持居安思危的意识才能让我们从容应对网络攻击。

作者简介:曾任职于阿里巴巴,每日优鲜等互联网公司,任技术总监,15年电商互联网经历。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢