前言

某天下午,朋友给我发了个被阿里云上被ddos攻击的截图,一个小时内,有十几条分布在不同服务器的受到ddos攻击记录。
我急忙说,“不是我啊,我没有,”
因为之前用他的服务器测试我的小水管ddos攻击量来着。
接着他问,“这攻击频率,ddos成本很低吗?”
哦,我还以为找我兴师问罪来了。。。

于是我给他解释:

ddos攻击,一般是特指layer 4攻击(cc攻击是layer 7),通过大量的恶意流量阻塞网络带宽,达到拒绝服务的目的。
而大多数l4使用的是udp反射的攻击方式,少数是tcp攻击方式。
udp方式中,因为不需要肉鸡,只需要找到协议存在缺陷的服务器,向这些服务器发送伪造的udp数据包,以四两拨千斤的方式,将流量反射到目标机器,成本低廉。
tcp方式中,因为需要肉鸡,成本较高。在肉鸡上直接发送数据包给目标机器,阻塞网络带宽。

我让他查看ddos的详细信息,受到攻击的SLB上,报文峰值达到259w个,其中197w个都是udp。
看到收到数据包的类型是udp,我猜到估计是ntp的反射流量。

我让他下次受到攻击的时候,用tcpdump -i eth0抓包查看攻击流量。
结果他直接把ddos的cap包发给了我。

原来,阿里云的后台有个方便的功能,就是下载报表,可以看到受到攻击的时候,tcpdump 记录到的收到的数据流。

就如浅谈拒绝服务攻击的原理与防御(5):NTP反射攻击复现所言。这可是都是宝贝啊。

分析cap抓包文件

用wireshark加载 cap 文件,然后一看protocol,果然基本上是ntp,夹杂着少量CLDAP,可能是用于破盾用的。
31秒内有14.6w 余个packet。

导出ip列表

菜单栏 - 统计 - ipv4 statistics - source and destination addresses

可能需要加载一会儿
加载完后点导出

过滤

打开导出的txt文件,文件内容和在wireshark看到的统计信息差不多,有制表符和表头,非常详细。
先把source地址删掉,查看发包的个数,低于200的删掉,因为是31秒内的总发包数,这时大概还剩60个ip。

最后使用awk,提取第一列的ip,分隔符为tab。

1
awk -F '[ :\t|]' '{print $1}' list.txt > list2.txt

我将解析的过程写成了一个脚本.

自动化解析cap文件,计算协议占比,按时间长度,以平均每秒10个数据包作为期望值,过滤到高质量的反射ip列表。

目前只支持ntp,因为没有其他类型的样本。

ip拉出来了,顺便发了朋友一份,朋友说要做个规则禁止这些ip的访问。(当然是没有用的,因为带宽都被阻塞满了。软件防d是不可能的

说明一下:
在网络上,是没有拒收的概念的,只能说比如你访问服务器的80端口,服务器上的80端口的web server选择不回应,这样看,服务器好像是拒绝了你的访问,但是流量已经到达了机器。

这让我想起了,cloudflare博客中曾写过如何丢弃每秒1千万个数据包,你只能想办法快速丢弃,而没法拒收数据包的。即使你将服务器关机,数据包也可以顺着路由到达你的服务器所在机房,只是机房再转发数据包到你的服务器上。

使用

我最后将这些ip列表提交到了我的一台100M小水管发包机上,使用tgbot调用,测试下朋友的SLB,打出了20Gbps的流量。

惊了

不足60行的列表竟然比之前扫的7000行列表威力大多了。

瞬间感叹到:列表ip不在于多,而在于反射的质量啊。

那我不是可以开个阿里云,到处骗ddos,然后收集反射ip了?而且还能通过报表功能看到实际反射的数据包量,再根据需要设置过滤阈值。

防御思路

最有效的办法是使用cdn/高防ip,隐藏源站ip。
实际上,很多人看到是网站的ip是cloudflare/akamai的cdn地址,又获取不到源站的ip,一般都会放弃的。cdn是没法打死的,一辈子都不可能的。
再实际上,国外的几家云服务商gcp/aws/azure,都是可以屏蔽udp的,只有国内的屑阿里云/腾讯云不行,ddos一摸就进黑洞。

参考:

  1. http://www.freebuf.com/articles/network/129288.html
  2. https://blog.cloudflare.com/how-to-drop-10-million-packets/