翻译:无用君www.isfocus.com
译者注:
前几天收到朋友寄来的这篇文章,觉得相当有意思,所以就翻译出来了。因为时间比较紧,我只翻译了原理及防御部分,前面还有一堆关于拒绝服务攻击历史及理论的一堆废话,想看到朋友请
_blank href=http://grc.com/dos/drdos.htm>http://grc.com/dos/drdos.htm 看原文。请不要来跟我们来要exploit,有心的朋友把那些在网上早已传烂了的SYN Flood 工具改一改(甚至改都不用改)就可以拿来做这个用了。这篇文章算是给国内的网管敲个警钟吧。
正文:
2002 年一月11 日凌晨两点,grc.com 被一些更先进的恶意洪水数据包攻击。这种新型的
DDoS 攻击可以被成为分布式反射拒绝服务攻击(Distributed Reflection Denial of
Servie Attack )— DRDoS
神秘的洪水攻击
攻击在凌晨两点左右开始,那时我正好还在工作,所以我才有机会迅速的抓取到一部分的洪水
攻击的信息。这次攻击使Verio(我们的网络提供商)的集合路由器将攻击数据挤满了我们的
两条T1。我们的网站服务器因为这次攻击而无法处理其它合法的请求。我们被完全的炸下了
网。
我们以前就曾遭受过UDP 和ICMP 洪水攻击,这些攻击其实都可以由被攻击者入侵的主机、
zombie 工具及Windows 系统简单的实现,我们也被一些经典的SYN 洪水攻击过。所以当我
查看了一下那些显示我们是被SYN/ACK 数据攻击的攻击数据包后,眉毛跳了一下。毕竟这些
事实并不重要,就像我以前说的那样,一个SYN/ACK 包只是一个SYN 数据包带了一个ACK
标记。任何有限权制作"raw socket"的人都可以制作出这种数据包来—— 不管他是恶意的还
是无意的。
真正的惊讶是当我看到这些发起攻击的地址:
IP 来源主机名
ge-6-2-0.r03.sttlwa01.us.bb.verio.net
ge-1-0-0.a07.sttlwa01.us.ra.verio.net
ge-0-1-0.a12.sttlwa01.us.ra.verio.net
ge-0-0-0.r00.bcrtfl01.us.bb.verio.net
ge-1-1-0.r01.bcrtfl01.us.bb.verio.net
ge-1-2-0.r00.sfldmi01.us.bb.verio.net
ge-1-0-0.a00.sfldmi01.us.ra.verio.net
ge-1-1-0.a01.sfldmi01.us.ra.verio.net
ge-1-2-0.r01.sfldmi01.us.bb.verio.net
ge-1-1-0.a00.sfldmi01.us.ra.verio.net
ge-1-0-0.a01.sfldmi01.us.ra.verio.net
ge-0-3-0.a00.scrmca01.us.ra.verio.net
ge-0-2-0.r00.scrmca01.us.bb.verio.net
ge-1-2-0.a00.scrmca01.us.ra.verio.net
ge-0-2-0.r01.scrmca01.us.bb.verio.net
ge-1-0-0.a10.dllstx01.us.ra.verio.net
ge-1-0-0.a11.dllstx01.us.ra.verio.net
ge-6-0-0.r01.dllstx01.us.bb.verio.net
ge-0-2-0.a00.snjsca03.us.ra.verio.net
ge-0-2-0.a01.snjsca03.us.ra.verio.net
ge-2-1-0.r04.snjsca03.us.bb.verio.net
ge-1-1-0.a00.snjsca03.us.ra.verio.net
ge-1-1-0.a01.snjsca03.us.ra.verio.net
ge-2-1-0.r01.snjsca03.us.bb.verio.net
iah-core-01.inet.qwest.net
iah-core-02.inet.qwest.net
iah-core-01.inet.qwest.net
iah-core-03.inet.qwest.net
iah-core-01.inet.qwest.net
iah-core-01.inet.qwest.net
iah-core-01.inet.qwest.net
iah-core-01.inet.qwest.net
iah-core-02.inet.qwest.net
iah-core-01.inet.qwest.net
iah-core-01.inet.qwest.net
iah-core-02.inet.qwest.net
iah-core-02.inet.qwest.net
iah-core-03.inet.qwest.net
iah-core-02.inet.qwest.net
iah-core-03.inet.qwest.net
globalcrossing-px.exodus.net
exds-wlhm.gblx.net
telefonica-px.exodus.net
core1-atl4-oc48-2.atl2.above.net
core2-atl4-oc48.atl2.above.net
core1-atl4-oc48.atl2.above.net
core2-core1-oc48.atl2.above.net
core1-core2-oc192.sfo1.above.net
core2-core1-oc192.sfo1.above.net
sfo1-sjc2-oc48-2.sfo1.above.net
ord2-sea1-oc48-2.ord2.above.net
sea1-ord2-oc48-2.sea1.above.net
bos2-dca2-oc48.bos2.above.net
dca2-bos2-oc48.dca2.above.net
bos2-dca2-oc48-2.bos2.above.net
dca2-bos2-oc48-2.dca2.above.net
core1-dfw3-oc48.dfw2.above.net
core1-dfw2-oc48.dfw3.above.net
core2-dfw3-oc48.dfw2.above.net
core2-dfw2-oc48.dfw3.above.net
core1-dfw1-oc48.dfw2.above.net
sfo1-sjc2-oc48.sfo1.above.net
dca2-dfw2-oc48-2.dca2.above.net
dfw2-dca2-oc48-2.dfw2.above.net
ord2-bos2-oc48.ord2.above.net
bos2-ord2-oc48.bos2.above.net
lga1-ord2-oc48.lga1.above.net
ord2-lga1-oc48.ord2.above.net
atl2-lga2-oc48.atl2.above.net
lga2-atl2-oc48.lga2.above.net
atl2-lga2-oc48-2.atl2.above.net
lga2-atl2-oc48-2.lga2.above.net
sjc3-pao1-oc12.above.net
bos2-lga2-oc48.bos2.above.net
lga2-bos2-oc48.lga2.above.net
bos2-lga2-oc48-2.bos2.above.net
lga2-bos2-oc48-2.lga2.above.net
core2-lga2-oc192.lga1.above.net
core2-lga1-oc192.lga2.above.net
ord2-sjc2-oc48.ord2.above.net
core2-sjc2-oc48.sjc3.above.net
iad1-lga1-oc192-2.iad1.above.net
lga1-iad1-oc192-2.lga1.above.net
iad1-lga1-oc192.iad1.above.net
lga1-iad1-oc192.lga1.above.net
core1-main1colo56-oc48.sea2.above.net
core1-main2colo56-oc48.sea2.above.net
core2-main1colo56-oc48.sea2.above.net
core2-main2colo56-oc48.sea2.above.net
core1-core2-oc192.sea2.above.net
core2-core1-oc192.sea2.above.net
core2-sea2-oc192.sea1.above.net
core2-sea1-oc192-2.sea2.above.net
core1-core2-oc192.dca2.above.net
iad1-dca2-oc192.iad1.above.net
dca2-iad1-oc192.dca2.above.net
iad1-dca2-oc192.iad1.above.net
dca2-sjc2-oc48.dca2.above.net
ord2-dfw2-oc48.ord2.above.net
globalcenter-above.iad2.above.net
sea1-nrt3-stm1.sea1.above.net
nrt3-sea1-stm1.nrt3.above.net
sea1-nrt3-stm1-3.sea1.above.net
nrt3-sea1-stm1-3.nrt3.above.net
core1-main1-oc12.nrt3.above.net
core1-main2-oc12.nrt3.above.net
core2-main1-oc12.nrt3.above.net
core2-main2-oc12.nrt3.above.net
core2-core3-oc48.lga1.above.net
core2-v6core3-oc3.nrt3.above.net
core1-oc192-core2.bos2.above.net
core2-oc192-core1.bos2.above.net
core5-dlr-oc3.iad1.above.net
core5-main1-oc48.iad1.above.net
core5-main2-oc48.iad1.above.net
core4-iad4-oc48.iad1.above.net
core5-iad4-oc48.iad1.above.net
core4-core1-oc48.iad1.above.net
core4-core3-oc48.iad1.above.net
core5-core1-oc48.iad1.above.net
core5-core3-oc48.iad1.above.net
core4-main1-oc48.iad1.above.net
core4-main2-oc48.iad1.above.net
core1-core2-oc48.lga3.above.net
core2-core1-oc48.lga3.above.net
core1-lga3-oc12.lga1.above.net
core1-lga1-oc12.lga3.above.net
core1-core3-oc3-2.lga3.above.net
core2-core3-oc3.lga3.above.net
core1-core3-oc48.ord2.above.net
core2-core3-oc48.ord2.above.net
core1-ord1-oc48.ord2.above.net
core2-ord1-oc48.ord2.above.net
core1-core3-oc48.atl2.above.net
core2-core3-oc48.atl2.above.net
dca2-atl2-oc48-2.dca2.above.net
atl2-dca2-oc48-2.atl2.above.net
core1-core2-oc192.lga1.above.net
core2-core1-oc192.lga1.above.net
core1-core3-oc48.lga1.above.net
core1-lga2-oc192.lga1.above.net
core1-lga1-oc192.lga2.above.net
core1-dfw2-oc48.atl2.above.net
core1-atl2-oc48.dfw2.above.net
core2-lhr1-stm16.lhr3.above.net
core3-core5-oc48.sjc2.above.net
core2-sea2-oc192-2.sea1.above.net
core1-sea1-oc192-2.sea2.above.net
ord2-lga1-oc48-2.ord2.above.net
lga1-ord2-oc48-2.lga1.above.net
core3-main1colo7-oc12.sjc2.above.net
core4-main2colo7-oc12.sjc2.above.net
ord2-sea1-oc48.ord2.above.net
core3-core4-oc3.sea1.above.net
earthlink-above.lax.above.net
core1-core2-oc192.sjc3.above.net
core2-core1-oc192.sjc3.above.net
core2-sjc4-oc192.sjc3.above.net
core1-sjc2-oc48.sjc3.above.net
core2-core1-oc48.sea1.above.net
core3-core1-oc48.sea1.above.net
core1-main1colo56-oc48.sjc3.above.net
core1-main2colo56-oc48.sjc3.above.net
core2-main1colo56-oc48.sjc3.above.net
core2-main2colo56-oc48.sjc3.above.net
core4-iad5-oc48.iad1.above.net
core5-iad5-oc48.iad1.above.net
sjc2-iad1-oc48.sjc2.above.net
core4-epe1-oc3.iad1.above.net
core5-epe1-oc3.iad1.above.net
core1-epe1-oc3.lga1.above.net
core2-epe1-oc3.lga1.above.net
iad1-lga1-oc48-2.iad1.above.net
lga1-iad1-oc48-2.lga1.above.net
lga1-sea1-oc48.lga1.above.net
sea1-lga1-oc48.sea1.above.net
lga1-lhr1-stm4-3.lga1.above.net
sea1-sjc2-oc48.sea1.above.net
core1-core2-oc192.lga2.above.net
core2-core1-oc192.lga2.above.net
core1-core3-oc48.lga2.above.net
core1-main1colo45-oc48.lga2.above.net
core1-main2colo45-oc48.lga2.above.net
core1-main1colo678-oc48.lga2.above.net
core1-main2colo678-oc48.lga2.above.net
core2-core3-oc48.lga2.above.net
core2-main1colo45-oc48.lga2.above.net
core2-main2colo45-oc48.lga2.above.net
core2-main1colo678-oc48.lga2.above.net
core2-main2colo678-oc48.lga2.above.net
core1-main1-oc48.lga1.above.net
core1-main2-oc48.lga1.above.net
core2-main1-oc48.lga1.above.net
core2-main2-oc48.lga1.above.net
dfw2-dca2-oc48.dfw2.above.net
dca2-dfw2-oc48.dca2.above.net
core1-core2-oc192.dfw2.above.net
core2-core1-oc192.dfw2.above.net
core1-core3-oc48.dfw2.above.net
core2-core3-oc48.dfw2.above.net
atl2-dfw2-oc48.atl2.above.net
dfw2-atl2-oc48.dfw2.above.net
我们看起来是在被超过200 多个网络核心基础设施路由器攻击.
发生什么事了?
看到这些分别来自Verio、Qwest、和Above.net 的洪水数据包,我想它们都是完全合法的
SYN/ACK 连接回应包,它们显示了一个TCP 源端口:179。换句话说,就像一个网页服务器
的数据包会从HTTP 的80 号端口返回一样,这些数据包是从"BGP"的179 号端口返回的。
BGP 是中介路由器支持的"边界网关协议"(Border Gateway Protocol)。路由器使用BGP
与他们的邻居进行即时的信息交流来交换他们的" 路由表" ,这是为了通知它们彼此路由器可
以在哪个IP 范围进行转交。
BGP 的细节并不重要,重要的是每个良好连接(高宽带)的中介路由器都会接受在他们179
端口上的连接。换句话来说,任何一个SYN 数据包到达一个网络路由器上后都会引出一个该
路由的SYN/ACK 回应包来。
我突然知道什么会一定发生…..
这些被利用来攻击的两百台主机不可能全存在安全问题,甚至可能没有任何一台有安全问题。
我认识到它们只不过全是一些普通的的TCP 服务器,它们是在认为我们想建立一个TCP 连接
到它们自带的BGP 服务的情况下才向grc.com 发送SYN/ACK 数据包的。
换句话说,一个恶意的入侵者在其他的Internet 角落里利用带有连接请求的syn 数据包对网
络路由器进行洪水攻击。这些数据包带有虚假的IP 地址,这些地址都是grc.com 的。这样以
来,路由器认为这些Syn 数据包是从grc.com 发送来的,所以它们便对它们发送SYN/ACK
数据包作为三次握手过程的第二个步。
恶意的数据包其实就被那些被利用的主机“反射”到了受害者主机上。这些被
反射的数据包返回到受害者主机上后,就形成了洪水攻击。
阻拦反射攻击
我们有一些好消息,这种攻击看起来可以很简单的阻拦。因为我们自己不是网络服务提供商,
以我们从来没有任何连接到远程带有BGP 服务的路由器上的需要。这样以来,我便要求Verio
去阻拦任何从BGP 服务端口179 发起的入站数据。因为这个恶意攻击者的SYN 数据包的目
标是网络上中介路由的179 号端口,任何反射的数据包也应该会从那个端口发出。
Verio 的工程师加了一个filter 到提供我们网络服务的集合路由上,它用来阻拦(丢弃)任何
从179 端口发来的数据包。从179 号端口发送来的数据包洪水立即停止了。
但我们并没有回到Internet 上。
一个刚从网上抓到的数据包显示我们现在正被一群全新的网络服务器攻击。因为这第二群攻击
是在我们阻拦了从179 端口发送来的攻击以后才出现的,所以这第二拨攻击没有办法跟第一拨
的攻击力相比。
我们现在正在被从端口22 (Secure Shell), 23 (Telnet), 53 (DNS), 和80 (HTTP/Web)
上发送来的SYN/ACK 数据包攻击。这其中还有一些从端口4001 (代理服务器端口)和6668
(IRC 聊天)发送来的数据包。
很可惜的是,因为这第二波攻击完全出乎我的意料,所以我没有抓到这第二波攻击的完整的数
据包来作为取样。不过,我先前在第一波攻击中所抓到一些日志有展现一些非BGP 所发出的
SYN/ACK 包。
这是一小部分先前从HTTP(网页服务)端口80 上所发出
SYN/ACK 攻击数据包的样本
IP 来源地址主机名
64.152. 4. 80
128.121.223.161
131.103.248.119
164.109. 18.251
171. 64. 14.238
205.205.134. 1
206.222.179.216
208. 47.125. 33
216. 34. 13.245
216.111.239.132
216.115.102. 75
216.115.102. 76
216.115.102. 77
216.115.102. 78
216.115.102. 79
216.115.102. 80
216.115.102. 82
www.wwfsuperstars.com
veriowebsites.com
www.cc.rapidsite.net
whalenstoddard.com
www4.Stanford.EDU
shell1.novalinktech.net
forsale.txic.net
gary7.nsa.gov
channelserver.namezero.com
www.jeah.net
w3.snv.yahoo.com
w4.snv.yahoo.com
w5.snv.yahoo.com
w6.snv.yahoo.com
w7.snv.yahoo.com
w8.snv.yahoo.com
w10.snv.yahoo.com
这蜂拥而来的SYN/ACK 数据包和一些非路由的网络服务器告诉了我们,任何用于普通目的
TCP 连接许可的网络服务器都可以用做数据包反射服务器。当我看到我们光阻拦从BGP 端口
传来的数据是远远不够的,我开发了一套更全面的解决方案来对付这种攻击。这套方案我们会
在下面讨论。
在装置好对付反射攻击的filter 后,我们立即就可以重新返回网上了。经过我不可以监控在装
置filter 后的攻击状况,但看到下面的这些信息还是让我冒了一阵冷汗…
直到攻击停止,Verio 的路由丢弃了将近十亿(1,072,519,399)的恶意
SYN/ACK 数据包。
我是在认识我到没有抓到第二波非BGP 的数据包后才联系Verio,从而得知这个数据的。我想
要重新装备我们的防御系统,好让我们继续遭受攻击,这样才能抓到那些我先前没有收集到的
资料,但当我这样做的时候,攻击已经停止了。
反射攻击的防御及预防
通过Internet 进行交流的电脑一般都可以被分为两类:客户端及服务端。这两个角色可以随
着环境转换(例如一个网页服务器可能会是一个邮件服务器的客户端),不过大部分的TCP 连
接都意味着一个客户端和服务端的关系。客户端一般会从一个高数位的端口发起连接到服务端
上处于监听状态的底数位端口上。
因为任何反射的SYN/ACK 数据包必须要弹到一个TCP 服务器上,并且因为几乎所有的服务端
口都在1 到1023 这个范围之内,阻拦所有在服务端口范围之内入站的数据包会防止大部分的
攻击造成的阻塞。不过这样做有产生一些问题…..
保护服务器
首先,这次对grc.com 的攻击包含了从端口4001 和6668 来的SYN/ACK 数据包。所以,
如果从这些端口发出的数据太多的话,这些特殊的高数位服务端口也需要被阻拦。在阻拦高数位端口的入站数据包存在一个问题,那就是一些合法的客户端的端口所发生的数据可能也会被我们设置的filter 给拦截掉。
第二个问题是如果我们只是简单的拦截所有从1024 以下端口发送的数据的话,那么像当一个在blanket filter 后的服务器作为客户端的话,它将无法和其它服务器进行交流。就像我们刚才举的例子一样,当一个网页服务器作为一个SMTP 服务器的客户端时,这个情况就会变的非常复杂。因为远程SMTP 服务器的数据包会试图从SMTP 服务器的25 号端口返回,这时它就会被我们设置的反反射攻击的filter 给拦截掉。为了解决这个问题,我们需要在配置文件里设置例外端口,这样才可以让合法数据包正常通过。
保护客户端
这里有一些坏消息。客户端主机,例如那些典型的终端用户,将无法被保护。因为多数的客户端在大部分时间里都是连接到远程的服务器端上的,这些服务器端很可能会被利用来攻击这些无辜的客户端。
译者注:
国内的网管可能都冒了一身的冷汗,以前的分布式拒绝服务式攻击可以算是可见不可及。毕竟那是需要几百台受控的肉鸡才能实现的,可现在这个技术可以利用任何不存在安全漏洞的主机来进行攻击,后果可以想象。原作者上面所说的利用filter 来拦截数据包只是暂时之策,服务器不用来提供服务还有屁用?所以真正的解决办法还是要从基础的配置做起,这种攻击不是使用半连接来挂掉主机,所以对付以前那种传统的SYNFlood 的方法可能无法在这里行通。到目前为止,通过利用_blank">防火墙来阻挡那些序列号不对的数据包恐怕是最好的方法了。
希望网络安全界的人士能尽快研究出更好的解决方法。
另外也请那些能自己悟出Exploit 的高手不要将攻击方法乱传,以国内现在的安全水准,无法经受起这种攻击,慎思。