“反弹攻击”是DDoS攻击中一种特别灵性的攻击方式,抛开攻击本身的罪恶只谈技术的话,这种攻击的设计思路往往有着“四两拨千斤”,又“深藏功与名”的效果。
“四两拨千斤”说的其实是“放大”效果。攻击者往往用比较小的请求量就能发起比较大的攻击流量,比如传统攻击是攻击者需要真正打出10G的流量才能造成10G的攻击效果(实际可能还不到10G),但反弹攻击可能用1G的请求就能“反弹”出10G的实际攻击流量(具体的放大倍数取决于具体的攻击手段),这样攻击者的成本就相对小了很多。“深藏功与名”意味着反弹攻击往往在原理上就能隐藏掉攻击者的源IP,因为在受害者看来,源IP全部来源于“反射器”。
早期的反弹攻击如SYN反弹,攻击者把SYN包的源IP改成受害者的IP发给一堆服务器(这堆服务器就是反射器),后者收到后会全部按照三次握手的规则回复SYN/ACK给受害者,这样在受害者看来会收到一堆莫名其妙来自不同IP的SYN/ACK,效果上形成了SYN/ACK的DDoS攻击。这种手法现在已经很少有人用,因为攻击者的成本不低,而且很多服务器已经能防御这类攻击手段,但这种思路产生的影响极其深远,花样百出的“反射器”不断被黑客们挖掘出来,并且还逐渐加入了“放大”的功力。
作为“反射器”至少要具备以下两个特点:
1. 广泛分布且数量巨大
2. 有某种可以“反弹”的功能、漏洞、模块或交互机制
可以看到近年来,遍布公网的DNS服务器、NTP服务器、数量繁多的SSDP设备等都被有心的黑客开发成了反射器,通过这些反射器打出来的DDoS攻击异军突起,占据了近些年来DDoS攻击很大的一部分比例。虽然这些反射器工作在7层,但打出来的攻击往往还是以大流量拥塞链路为主,跟传统的UDP大包在效果上没有什么本质区别,防御逻辑也相对简单,用ACL干掉特征的反弹源端口(比如SSDP的UDP 1900端口、NTP的UDP 123端口)即可,或是过滤掉对应攻击一定会包含的特征字段(如SSDP反射的“uuid”)。
说了这么多背景,想必反弹攻击的思路您已经很清楚了,接下来介绍本文的重点:WordPress反弹攻击。相比于NTP等反射攻击,WordPress把反弹做到了7层,也就说我们常说的CC攻击。该攻击手法早在2014年就被披露,但根据我们对云盾用户DDoS攻击的监控情况,时至今日仍然大量出现在CC攻击中,并且往往用很低的成本和不大的流量(相对于流量型反弹攻击)就能耗尽一个普通站点的处理能力。鉴于这种攻击明显的特征和可识别性,特地给大家再分享一下。
WordPress是一种非常流行的博客平台,全球大概有20%的网站是而这种攻击的反射器就是公网上千百万基于WordPress搭建的站点(条件1满足),而条件2的满足则来源于一个叫做“pingback”的机制(通过一个叫“XML-RPC”的模块提供)。Pingback本来是用来通知网站系统文章被引用的一种手段,一个简单的POST请求就可以让它把包含引用的链接和引用页面地址的内容发送给一个被引用的站点或博客。当WordPress收到一个pingback请求时,它会自动回复一个响应给请求来源的页面去确认这个链接是否真实存在,利用这个机制,攻击者就可以指定受害者的地址,构造包含真实链接的pingback请求,通过“反弹”来打到CC攻击的目的。这种请求非常容易构造,一个curl命令就足够了,所以只要手上掌握了一定数量的WP站点,就特别容易批量发动攻击。
上图是云盾高防记录到的针对某站点的一次WP反弹攻击,可以这个pingback是来源于智利某IP。类似这样的请求直到今天依然每天都有几百万次,而且来自于南美(如巴西、墨西哥等国)、北美和国内的请求较多。
如下面云盾高防的日志记录所示,在短短5min时间内这种请求就有近12万次。这是云盾用户每天被CC攻击的一个缩影。
看到这里,WP反弹的攻击特征已经非常明显了,就是User-agent字段中会包含“WordPress”、“pingback”这样的字段,这是一定的,具体来源的IP可能是不固定的,这也就为我们防护这类攻击提供了思路:干掉包含这些特征UA的请求即可(思路上跟用ACL干掉UDP 123来防NTP反射是一样的)。
以Nginx为例,首先当怀疑网站被CC攻击时,可以粗略tail一下log文件,看看有没有满屏的“pingback”出现,也可以用
cat /var/log/nginx/access.log | grep "verifying pingback from" > pingback_attack.log
来具体统计一下。确定遇到这类攻击时,打开网站的Nginx配置文件,找到server定义的部分(/etc/nginx/nginx.conf,或/etc/nginx/sites-enabled/your-site等,具体路径根据具体的Nginx和Linux版本来定),添加以下if声明到server定义的某个地方(大小写敏感):
if ($http_user_agent ~ (WordPress|pingback) {
return 403;
}
上述语句可以将UA中包含“WordPress”或“pingback”的请求直接返回403(禁止访问)响应。当然配置完后要重新加载下Nginx的配置:
sudo …/nginx –s reload
配置完后,可以用curl或者wget命令,带上特定的UA去测试一下,如果能收到403的响应,说明配置成功了。
OK,现在你的服务器已经能够拦截这类攻击了。当然在本地服务器做策略对于缺乏运维能力的用户以及大规模的CC攻击还是有一定的局限性,这时就推荐用高性能的云清洗服务来提前拦截这类攻击。目前阿里云云盾高防IP已经支持相关的定制化策略对付这类攻击,Web应用防火墙也提供了自定义规则可以让用户通过简单的配置来完成防护:
![865e7e5183aeb609cd6df3f32a01f2e9d6c5fe62](https://i-blog.csdnimg.cn/blog_migrate/3ba4bde89e6c6fe7d179bc86706ab322.png)