一、CC攻击原理 CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃。CC主要是用来消耗服务器资源的,每个人都有这样的体验:当一个网页访问的人数特别多的时候,打开网页就慢了,CC就是模拟多个用户(多少线程就是多少用户)不停地进行访问那些需要大量数据操作(就是需要大量CPU时间)的页面,造成服务器资源的浪费,CPU长时间处于100,永远都有处理不完的连接直至就网络拥塞,正常的访问被中止。二、CC攻击的种类 CC攻击的种类有三种:直接攻击、僵尸网络攻击、代理攻击。 直接攻击:主要针对有重要缺陷的WEB应用程序,一般说来是程序写的有问题的时候才会出现这种情况,比较少见。 僵尸网络攻击:有点类似于DDOS攻击了,从WEB应用程序层面上已经无法防御。 代理攻击【常见】:是CC攻击者一般会操作一批代理服务器,比方说100个代理,然后每个代理同时发出10个请求,这样WEB服务器同时收到1000个并发请求的,并且在发出请求后,立刻断掉与代理的连接,避免代理返回的数据将本身的带宽堵死,而不能发动再次请求,这时WEB服务器会将响应这些请求的进程进行队列,数据库服务器也同样如此,这样一来,正常请求将会被排在很后被处理,就象本来你去食堂吃饭时,一般只有不到十个人在排队,今天前面却插了一千个人,那么轮到你的机会就很小很小了,这时就出现页面打开极其缓慢或者白屏。三、如何判断CC攻击 CC攻击是通过大量的代理ip进行访问网站,从而达到网站服务器无法负荷最终瘫痪的过程。 并且这种攻击是会消耗大量的流量,从而造成站长亏钱,要想判断CC攻击, 其实非常简单,如果发现网站在短时间内cup直线上升,而且网站打开变慢甚至502错误,那可能是遭受cc攻击了 1。1、消耗CPU资源 黑客用1万台肉鸡,刷新你网站动态页面,如果你程序不够健壮,cpu直接100 1。2、消耗内存资源 黑客只要刷新你动态页面中搜索数据库的内容,只要搜索量一大,内存占满。网站直接打不开或者是非常卡。 1。3、消耗IO资源 黑客找到上传文件,或者是下载文件的页面,在不停的上传与下载,磁盘资源点满 1。4、消耗带宽资源 能看流量占用多少,如果流量占满了,服务器直接掉包,掉线。网站一点都打不开。如果自己主机上不去,你可以问运营商要流量图,机房都有流量图的。 1。5、网站502 很多时候,发现自己网站特别的慢,甚至经常502,一般来说是被CC攻击了。 1。4、查看SYN连接检查方式〔rootmayiops〕netstatnawktcp{S〔NF〕}END{for(ainS)printa,S〔a〕}LASTACK14SYNRECV348ESTABLISHED70FINWAIT1229FINWAIT230CLOSING33TIMEWAIT18122其中可以重点观察,如果数字大于以上情况的话,基本都被命中了被CC攻击的SYNRECV大于50TIMEWAIT大于500ESTABLISHED大于500四、常见办法 CC攻击基本是模拟真人访问,如果肉鸡够多的话,基本是无解 以下是稍微简单有效的几种办法: 1。针对IP进行封禁,例如一个IP如果在一秒内请求大于100的,可以封禁掉(一般肉鸡的话,都N多IP,封禁不过来的) 2。针对被高频访问的URL,譬如定制为10秒内访问超过100次的,需要进行真人验证,有效防止被刷(也需要你有足够的宽带,如果宽带不够早就卡死了) 3。使用一些高防CDN,一些高防CDN会同时具备以上的两种功能五、Nginx防CC配置http{limitreqzonebinaryremoteaddrzoneone:10mrate1rs;server{限制每ip每秒不超过20个请求,漏桶数burst为5brust的意思就是,如果第1秒、2,3,4秒请求为19个,第5秒的请求为25个是被允许的。但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。nodelay,如果不设置该选项,严格使用平均速率限制请求数,第1秒25个请求时,5个请求放到第2秒执行,设置nodelay,25个请求将在第1秒执行。limitreqzoneoneburst1nodelay;}} 上面样本的配置是什么意思呢?binaryremoteaddr表示:客户端IP地址zone表示漏桶的名字rate表示nginx处理请求的速度有多快burst表示峰值nodelay表示是否延迟处理请求,还是直接503返回给客户端,如果超出rate设置的情况下。 详细的可以参考官方说明文档:Modulengxhttplimitreqmodule模拟请求 以下三种配置方式,访问结果参考地址:https:www。cnblogs。comkenshinobiyp10215913。html 这里我们需要ApacheBenchmark这个小工具来生成请求1个用户持续100s的时间向服务器发送请求abt100c1vvvhttp:example。com样本一http{limitreqzonebinaryremoteaddrzoneone:10mrate1rs;server{limitreqzoneoneburst1nodelay;}}样本二,提高了burst值,明显nginx成功的请求数上去http{limitreqzonebinaryremoteaddrzoneone:10mrate1rs;server{limitreqzoneoneburst10nodelay;}}样本三,去掉nodelay,成功的请求数在100左右而失败的请求数变成0了http{limitreqzonebinaryremoteaddrzoneone:10mrate1rs;server{limitreqzoneoneburst10;} 从这里的数据可以看到将nodelay的参数去掉的话,成功的请求数在100左右而失败的请求数变成0了,为什么呢?有nodelay参数的时候,nginx正常是及时处理当前的请求的并响应数据给客户端,但是如果超过limitreqmodule的限制,那么会统一返回503给客户端。无nodelay参数的时候,nginx正常是及时处理当前的请求的并响应数据给客户端,但是如果超过limitreqmodule的限制,那么会将此此请求缓存就先这么理解起来稍后再处理,所以也就不会出现大量的失败请求数了。 存在的问题: 虽然用limitreqmodule可以一定上的防止CC攻击,但是有误杀概率;国内宽带用户的IP地址已经大量内网化,几百人共享一个IP的可能性是很大的。六、防御方法 1、对于轻量级CC工具,通过工具、脚本进行屏蔽IP限制防御,CCKiller:https:zhangge。net5066。html 2、接入高防CDN,隐藏服务器源IP,自动识别攻击流量,清洗后将正常访客流量回源到源服务器IP上,保障业务安全。 3、网站页面静态化:网站页面静态化可以较大程度的减少系统资源消耗,从而达到提高抗系统抗攻击能力(业务不同,成本高)。 4、域名欺骗解析:如果发现针对域名的CC攻击,我们可以把被攻击的域名解析到127。0。0。1这个地址上。我们知道127。0。0。1是本地回环IP是用来进行网络测试的,如果把被攻击的域名解析到这个IP上,就可以实现攻击者自己攻击自己的目的,这样他再多的肉鸡或者代理也会宕机,让其自作自受(杀敌一千,自损八百)。 5、nginx配置限制,如上七、建议后续工作: 保守:站点应尽快进行服务能力升级。 积极:尽所能,追溯攻击者。 追溯攻击者: CC:proxyforwardfromip 单个IP高并发的DDOS:找到访问异常的、高度可疑的ip列表,exploit,搜集、分析数据,因为一个傀儡主机可被二次攻占的概率很大(但不建议这种方法) 单个IP低并发的DDOS:以前极少访问被攻击站点,但是在攻击发生时,却频繁访问我们的站点,分析日志得到这一部分ip列表 追溯攻击者的过程中,snat与webproxy增加了追踪的难度,如果攻击者采用多个中继服务器的方法,追溯将变得极为困难。 防御者: 1。应对当前系统了如指掌,如系统最高负载、最高数据处理能力,以及系统防御体系的强项与弱点 2。历史日志的保存、分析 3。对当前系统进行严格安全审计 4。上报公安相关部分,努力追溯攻击者 5。网站,能静态,就一定不要动态,可采取定时从主数据库生成静态页面的方式,对需要访问主数据库的服务使用验证机制。 6。防御者应能从全局的角度,迅速及时地发现系统正在处于什么程度的攻击、何种攻击,在平时,应该建立起攻击应急策略,规范化操作,免得在急中犯下低级错误 对历史日志的分析这时将会非常重要,数据可视化与统计学的方法将会很有益处: 1。分析每个页面的平均访问频率 2。对访问频率异常的页面进行详细分析分析得到ip页面访问频率 3。得到对访问异常页面的访问异常ip列表 4。对日志分析得到忠实用户IP白名单 5。一般一个页面会关联多个资源,一次对于这样的页面访问往往会同时增加多个资源的访问数,而攻击程序一般不会加载这些它不感兴趣的资源,所以,这也是一个非常好的分析突破点 防御思路 因为CC攻击通过工具软件发起,而普通用户通过浏览器访问,这其中就会有某些区别。想办法对这二者作出判断,选择性的屏蔽来自机器的流量即可。 初级 普通浏览器发起请求时,除了要访问的地址以外,Http头中还会带有Referer,UserAgent等多项信息。遇到攻击时可以通过日志查看访问信息,看攻击的流量是否有明显特征,比如固定的Referer或UserAgent,如果能找到特征,就可以直接屏蔽掉了。 中级 如果攻击者伪造了Referer和UserAgent等信息,那就需要从其他地方入手。攻击软件一般来说功能都比较简单,只有固定的发包功能,而浏览器会完整的支持Http协议,我们可以利用这一点来进行防御。 首先为每个访问者定义一个字符串,保存在Cookies中作为Token,必须要带有正确的Token才可以访问后端服务。当用户第一次访问时,会检测到用户的Cookies里面并没有这个Token,则返回一个302重定向,目标地址为当前页面,同时在返回的Http头中加入setcookies字段,对Cookies进行设置,使用户带有这个Token。 客户端如果是一个正常的浏览器,那么就会支持http头中的setcookie和302重定向指令,将带上正确的Token再次访问页面,这时候后台检测到正确的Token,就会放行,这之后用户的Http请求都会带有这个Token,所以并不会受到阻拦。 客户端如果是CC软件,那么一般不会支持这些指令,那么就会一直被拦在最外层,并不会对服务器内部造成压力。 高级 高级一点的,还可以返回一个网页,在页面中嵌入JavaScript来设置Cookies并跳转,这样被伪造请求的可能性更小 Token生成算法 Token需要满足以下几点要求 1,每个IP地址的Token不同 2,无法伪造 3,一致性,即对相同的客户端,每次生成的Token相同 Token随IP地址变化是为了防止通过一台机器获取Token之后,再通过代理服务区进行攻击。一致性则是为了避免在服务器端需要存储已经生成的Token。 推荐使用以下算法生成Token,其中Key为服务器独有的保密字符串,这个算法生成的Token可以满足以上这些要求。 TokenHash(UserAgentclientipkey) 本文主要讲述了DDoS攻击之一的CC攻击工具实现,以及如何防御来自应用层的DDoS攻击的理论总结。接下来的文章,笔者将会实现一个工作于内核态的、具有黑名单功能的防火墙模块,以对应于上述防御状态机中的防火墙单元,它实现了自主地动态内存管理,使用hash表管理ip列表,并可以自定义hash表的modular。