RSD 随机子域名攻击

RSD, random sub domain [attack], 也可称为 PRSD, P for Pseudo,因为所谓的随机数生成算法是“伪随机”。

攻击原理

假定我们想攻击example.com,让其不能正常提供服务,我们可以构造大量的虚假子域名请求,比如:

1
2
3
4
5
6
7
aaaaaaa.example.com
aaaaaab.example.com
...
aaaaaaz.example.com
aaaaaba.example.com
...
zzzzzzz.example.com

这些FQDN都是构造出来的,真实业务不存在的域名,因此接收到这些请求的公共DNS服务器, 例如 114.114.114.114,会根据请求开始递归请求过程,将上述请求转到 example.com 的权威NS服务器, 例如 ns.example.com。

以上伪造的子域名模式是[a-z]7个字母的定长组合,一共有 26 ** 7 = 8031810176个,想象一下,这么多伪造请求如果在10分钟内发出去,可能发生的事情:

  • 公共DNS服务器 114.114.114.114 缓存可能被撑爆,可能无法处理正常请求
  • 114.114.114.114 到 ns.example.com 的路由线路中间某节点带宽被占满
  • ns.example.com 处理不了如此多的请求,导致无法处理正常请求
  • 甚或,到达example.com 的流量只有20G,但是所在IDC认为流量太大,强制将example.com下线来自保(没开玩笑)

这些可能只要满足一个,就有相当大部分或者所有人,在一定时间内都无法正常访问 example.com,攻击成功。

上面伪造请求我用了连续字符串空间的子域名来说明,实际攻击中会用各种随机算法来生成定长/变长的,字母/数字/混合的各种子域名来进行攻击,所以被称为 RSD 。

另:DNS 请求是基于 UDP 的,UDP 没法验证来源,也就是说 DNS 的请求是可以伪造来源的,如果攻击者伪造子域名请求的来源 IP 为 ns.example.com 的 IP 或者同 IDC 的 IP 会如何?

攻击现状

天天有,几乎时时刻刻都有。按照我们当前检测到的结果,每天少则几个,多则十几个站点会遭受这种攻击,持续时长从十几分钟到十几天甚或更久都有可能。

随机子域名模式生成基本就两个维度,固定pattern + 随机pattern,随机pattern又被两个因素来决定:长度 + 字符集。长度是固定的还是随机的?长度如果随机,随机范围是多少?字符随机范围是什么?字母还是数字还是混合,甚或是特定的自选字符集?

最常见的前缀模式

  • 两次rand:一次rand选择一个随机长度,后续每次rand选择一个随机字符
  • 固定长度,随机字母/字母+数字
  • 特定模式:比如d(-[0-9]{2,7}){3,3}-d

攻击规模

攻击发生时,基本都是 百万/s 的请求量。看题图,上面这个攻击有意思在于分了几个阶段:

  • 攻击前:5分钟访问量只有几百
  • 攻击阶段1: 5分钟访问量迅速升到百万, 并且持续了8个小时
  • 攻击阶段2: 攻击者发现没有达到预想的效果,攻击升级,5分钟访问量升到了150w,持续了1个小时
  • 攻击暂停: 攻击者可能发现了自己的一个操作错误,暂停了一下
  • 攻击阶段3: 攻击重新开始,此时5分钟访问量稳步升到了200w,并持续中
  • 后续:写这行字时,正在发生。。。

攻击目标

利益驱动,so…

实时检测方法

知道了RSD的原理,做检测更多的是需要两个前提: 有数据 + 工程能力。

数据参照前一篇 《PDNS系统设计实现总结》,我们需要的是3,至少是2的位置。

检测方法:

  • 0x00 请求计数:对所有级别的FQDN做计数,类似trie-tree的结构,域名反转, www.baidu.com 反转为 com.baidu.www,按点分割,记录各级的count。RSD如果发生,父级域名的count必然有一个明显的spike,比如攻击为 xxxxx.www.baidu.com,那www.baidu.com的访问量会有一个明显的上升。这一步不是必须,但之所以要做这个判断是因为后续过程计算会很重,而这一个前置步骤,可以将大部分正常数据放过,省去不必要的计算
  • 0x01 子域名计数:RSD一大特征就是构造很多很多随机子域名,因此统计子域名个数是最重要的特征。可以使用hyperloglog算法,redis中源码写的不错,可以借鉴
  • 0x02 子域名模式判断:子域名多不见得是RSD攻击,还有可能是各种数据通道,子域名爆破等等情况。要判定为RSD,那就必须要对子域名模式进行分析判定。每分钟几十万的子域名,没必要都记录,阶梯抽样缩减到千级别即可。判断构成的随机性,也可以根据已知的模式判断匹配程度,前者可以来检测所有未知的RSD,后者的好处是可以和已知的bot家族关联到一起。随机性的判定,建议使用分词,不要用熵。

防御方法

我们没有防御的责任和位置,因此防御我们没有做,就算有想法,可能有坑,所以暂且不表。

等哪天如果做了,有了被证实的经验,我可能会回来填坑【doge脸】


我们部门小伙伴还专门分析过 Bot Elknot 的RSD的情况,做的很好,感兴趣的可以看看 vb-2016-TheElknotDDoSBotnetsWeWatched.pdf