一种针对DNS缓存服务器的杠杆式攻击

笔者发现一台国内的机器流量异常,检查发现这台机器上运行的DNS缓存服务被人用作了攻击的放大杠杆,这里简单记一下。

发现流量异常,首先当然是检查服务器上的TCP会话,发现了一些不太正常的东西,关闭之后流量减少,但仍然没有回到正常水平。

于是听包。这一听发现一大片:

07:39:53.271744 IP 158.XX.XX.238.53019 > XX.XX.XX.XX.53: 56854+ [1au] ANY? isc.org. (36)

07:39:53.271772 IP 158.XX.XX.238.53019 > XX.XX.XX.XX.53: 56854+ [1au] ANY? isc.org. (36)

07:39:53.271784 IP 158.XX.XX.238.53019 > XX.XX.XX.XX.53: 56854+ [1au] ANY? isc.org. (36)

07:39:53.271792 IP 158.XX.XX.238.53019 > XX.XX.XX.XX.53: 56854+ [1au] ANY? isc.org. (36)

07:39:53.274225 IP 92.XX.XX.148.31650 > XX.XX.XX.XX.53: 23600+ [1au] ANY? isc.org. (36)

07:39:53.274252 IP 92.XX.XX.148.31650 > XX.XX.XX.XX.53: 23600+ [1au] ANY? isc.org. (36)

07:39:53.274262 IP 92.XX.XX.148.31650 > XX.XX.XX.XX.53: 23600+ [1au] ANY? isc.org. (36)

07:39:53.274270 IP 92.XX.XX.148.31650 > XX.XX.XX.XX.53: 23600+ [1au] ANY? isc.org. (36)

07:39:53.291822 IP 158.XX.XX.238.13616 > XX.XX.XX.XX.53: 56854+ [1au] ANY? isc.org. (36)

07:39:53.291850 IP 158.XX.XX.238.13616 > XX.XX.XX.XX.53: 56854+ [1au] ANY? isc.org. (36)

07:39:53.291860 IP 158.XX.XX.238.13616 > XX.XX.XX.XX.53: 56854+ [1au] ANY? isc.org. (36)

07:39:53.291869 IP 158.XX.XX.238.13616 > XX.XX.XX.XX.53: 56854+ [1au] ANY? isc.org. (36)

07:39:53.291877 IP 92.XX.XX.148.56278 > XX.XX.XX.XX.53: 23600+ [1au] ANY? isc.org. (36)

显然,这样来自同一个 IP 地址,在短时间内反复查询同一个域名的现象是不正常的。为什么会是 isc.org?暂时不清楚,但是这样的行为,显然是利用这台机器作为放大攻击的杠杆。攻击者发出伪造成最终受害者为源 IP 地址的DNS查询包(这类包的尺寸较回应来说要小的多)到受害的DNS缓存服务器,而这些缓存服务器由于在本地已经有了查询到的域名信息副本(这些域名是存在的),会立即向最终的受害者发出回应。这样,攻击者就能够用较小的带宽代价占满最终受害者的下行带宽,实现 DDoS 攻击了。

由于是DDoS,在防御一方的角度看,阻止这类攻击并不容易。不过,在传统的网络设计中,DNS缓存服务器是放在DMZ 里的,因此可以通过在路由上直接过滤掉全部来自外部的 DNS 回应包来缓解这类攻击造成的影响。在运行DNS缓存服务器的管理员方面,则应限制对自己运行的DNS缓存服务器的访问,例如只在内网接口上监听DNS查询请求,而外网接口只用来发出DNS请求和接收这些请求的回应,避免被坏人利用成为DDoS的杠杆。