经常听说 Dos, DDoS, ARP欺骗,Man In The Middle 等各种攻击方式,最近抽空研究了一下,这里做个总结。
在典型的MAC flooding中,攻击者能让目标网络中的交换机不断泛洪大量不同源MAC地址的数据包,导致交换机内存不足以存放正确的MAC地址和物理端口号相对应的关系表。如果攻击成功,交换机会进入failopen模式,所有新进入交换机的数据包会不经过交换机处理直接广播到所有的端口(类似HUB集线器的功能)。攻击者能进一步利用嗅探工具(例如Wireshark)对网络内所有用户的信息进行捕获,从而能得到机密信息或者各种业务敏感信息。
如图所示,网络中有3个PC和一个交换机,在正常情况下,如果PC A向PC B发送信息,PC C是不会知道的。
当攻击者PC C利用MAC flooding攻击对交换机发送很多非法的包含不同源MAC地址的封包时,交换机会把所有这些MAC地址记录到自己的CAM(Content Addressable Memory)表之中,当这些记录超过一定的数量,超过交换机所能承载的内存的时候,MAC flooding的效果就达成了。
当MAC flooding效果达成的时候,交换机就变成了集线器,对所有信息进行无定向广播,PC A 发送给PC B的信息PC C也可以收到了。这个时候PC C就可以捕获数据进行数据截取等操作。
一个黑客可以只做简单的操作就将一个重要的IP地址和一个错误的MAC地址绑定。例如,黑客可以发送一个ARP响应报文 (到你的计算机) 将你所在网络的路由器 (即我们常说的网关) IP地址和一个根本不存在的MAC地址绑定起来。你的计算机一位它知道默认网关在哪,但是事实上它的所有数据包,其目的地址都不在这个网络的网段上 (因为那个不存在的MAC不在此局域网的网段上) ,它们最后消逝在了无尽的比特流中 (即因数据包的生命周期到了而信号消失,译者注)。仅仅这一下,黑客就能阻止你连上因特网。
黑客利用ARP缓存中毒来截获你的局域网中两台设备之间的网络信息。例如,我们假象黑客想要窃听你的计算机,192.168.0.12,和你的网络路由器 (即网关,译者注) ,192.168.0.1,之间的通信信息。黑客先发送一个恶意的ARP “响应” ( 因为在此之前根本没有请求) 到你的路由器,将他的计算机的MAC地址和192.168.0.12绑定。现在你的路由器以为这个黑客的计算机就是你的计算机了。
然后,黑客在发送一个恶意的ARP响应到你的计算机,将他的MAC地址和192.168.0.1绑定起来。 现在你的机器以为黑客的计算机是你的路由器了。
最后,黑客开启一个叫IP转发的系统功能。这个功能让黑客能将所有来自你的计算机的网络信息转发到路由器。现在,只要你尝试上网,你的计算机就会将网络信息发送到黑客的机器上,然后黑客再将其转发到路由器。由于黑客仍然将你的信息转发到网络路由器,所以你并不会察觉到他已经截获了所有你的网络信息,或许还窃听了你的明文密码或者劫持了你曾经安全的网络会话。
大量的 ICMP消息发送给目标系统,使得它不能够对合法的服务请求做出响应。ICMP FLOOD攻击实际上是一种两败俱伤的攻击方式,在主机”疯狂”地向攻击目标发送ICMP消息的时候,主机也在消耗自身的系统资源。如果自身的网络资源小 于目标的话,这种攻击就是”蚍蜉撼大树”。因此,ICMP FLOOD攻击为了达到很好的效果,往往要联合多台机器同时攻击同一台机器,从而形成分布式拒绝服务攻击(DDoS)。
攻击者向许多地址发送ICMP Echo Request,但是它却告诉这些地址ICMP Echo Request不是它自己发的,而是”某某”发的,这个”某某”就会成为”众矢之的”。通过伪装目的主机的IP地址,向多个IP 网络的广播地址发送ICMP Echo Request数据包,使得目的主机需要消耗大量CPU 资源和有效带宽来处理来自众多节点的ICMP Reply数据包。
Smurf攻击是根据它的攻击程序命名的,是一种ICMP echo flooding攻击,在这样的攻击中,ping包中包含的欺骗源地址指向的主机是最终的受害者,也是主要的受害者,而路由器连接的广播网段成为了攻击的帮凶,类似一个放大器,使网络流量迅速增大,也是受害者。
smurf攻击的工作原理:
R1 (H11: 1.1.1.1) |----H1(192.168.20.1)
| |----H2(192.168.20.2)
--------------------R2-----------|----H3(192.168.20.3)
| |----H4(192.168.20.4)
|s0/0 |----H5(192.168.20.5)
R3(H33: 3.3.3.3)
路由器R1后方有一真实主机H11的IP地址为1.1.1.1,路由器R3后方有一真实主机H33的IP地址为3.3.3.3,R2后方的ethernet网络内有多台主机:H1,H2,H3,H4,H5…假设主机H11是一个攻击者,它发起一个到子网192.168.20.0的ICMP echo广播报文,报文的源IP地址被伪造成3.3.3.3,目的地址为192.168.20.255(子网广播地址),当R2后方网段内的每台主机收到此广播报文后,都将作出相同的响应:返回单播报文,此报文的目的地址为3.3.3.3(此时,R2后方的ethernet网络被攻击者利用,成为一个攻击的放大器)。这样真实主机H33将收到许多ICMP echo-reply的洪泛,最终主机H33的系统资源将被耗尽。
Ping of Death 属于 Dos 的一种,它通过发送大于65536字节的ICMP包使操作系统崩溃;通常不可能发送大于65536个字节的ICMP包,但可以把报文分割成片段,然后在目标主机上重组;最终会导致被攻击目标缓冲区溢 出,引起拒绝服务攻击。有些时候导致telne和http服务停止,有些时候路由器重启。
A UDP flood attack is a denial-of-service (DoS) attack using the User Datagram Protocol (UDP), a sessionless/connectionless computer networking protocol.
Using UDP for denial-of-service attacks is not as straightforward as with the Transmission Control Protocol (TCP). However, a UDP flood attack can be initiated by sending a large number of UDP packets to random ports on a remote host. As a result, the distant host will:
Thus, for a large number of UDP packets, the victimized system will be forced into sending many ICMP packets, eventually leading it to be unreachable by other clients. The attacker(s) may also spoof the IP address of the UDP packets, ensuring that the excessive ICMP return packets do not reach them, and anonymizing their network location(s). Most operating systems mitigate this part of the attack by limiting the rate at which ICMP responses are sent.
Software such as Low Orbit Ion Cannon and UDP Unicorn can be used to perform UDP flooding attacks. This attack can be managed by deploying firewalls at key points in a network to filter out unwanted network traffic. The potential victim never receives and never responds to the malicious UDP packets because the firewall stops them.
UDP 洪攻击的主要思路:给目标主机的不同端口发送大量的UDP包,目标主机会检查哪一个应用程序在监听当前端口;如果没有应用程序监听该端口,主机会给发送方发送ICMP消息进行反馈。如果攻击者短时间内向攻击目标不同端口发送大量UDP包,会导致目标主机资源几乎耗尽以至于无法响应正常的访问。
DNS Query Flood攻击实质上是UDP Flood的一种,也属于 DDos 的一种。 但是由于DNS服务器的不可替代的关键作用,一旦服务器瘫痪,影响一般都很大。 DNS Query Flood攻击采用的方法是向被攻击的服务器发送大量的域名解析请求,通常请求解析的域名是随机生成或者是网络世界上根本不存在的域名,被攻击的DNS 服务器在接收到域名解析请求的时候首先会在服务器上查找是否有对应的缓存,如果查找不到并且该域名无法直接由服务器解析的时候,DNS 服务器会向其上层DNS服务器递归查询域名信息。域名解析的过程给服务器带来了很大的负载,每秒钟域名解析请求超过一定的数量就会造成DNS服务器解析域名超时。
根据微软的统计数据,一台DNS服务器所能承受的动态域名查询的上限是每秒钟9000个请求。而我们知道,在一台P3的PC机上可以轻易地构造出每秒钟几万个域名解析请求,足以使一台硬件配置极高的DNS服务器瘫痪,由此可见DNS 服务器的脆弱性。
在UDP Flood的基础上对 DNS Query Flood 攻击进行防护的方法:
根据域名 IP 自学习结果主动回应,减轻服务器负载(使用 DNS Cache);对突然发起大量频度较低的域名解析请求的源 IP 地址进行带宽限制? 在攻击发生时降低很少发起域名解析请求的源 IP 地址的优先级;限制每个源 IP 地址每秒的域名解析请求次数。
DHCP starvation is attacking a DHCP server by sending a lot of requests to it. This lead to server’s address pool exhausting after which DHCP server is not able to respond clients and give them new leases. This type of attack can easily be achieved with tools such as gobbler. If enough requests flooded onto the network, the attacker can completely exhaust the address space allocated by the DHCP servers for an indefinite period of time. Clients of the victim network are then starved of the DHCP resource(s), thus DHCP Starvation can be classified as a Denial of Service attack. The network attacker can then set up a Rogue DHCP Server on the network and perform man in the middle attacks, or simply set their machine as the default gateway and sniff packets.
A DHCP starvation attack works by broadcasting DHCP requests with spoofed MAC addresses. This is easily achieved with attack tools such as “the gobbler”. If enough requests are sent, the network attacker can exhaust the address space available to the DHCP servers for a period of time. This is a simple resource starvation attack just like a synchronization (SYN) flood attack. Network attackers can then set up a rogue DHCP server on their system and respond to new DHCP requests from clients on the network.
DHCP starvation 攻击的思路:发送大量具有 虚拟MAC地址 的 DHCP 请求,DHCP 服务器会不断的给这些虚拟 MAC 地址分配 IP 地址,如果这样的请求包足够多,可以很轻易的占用子网内所有可分配的 IP 地址,导致 DHCP 服务器无法给正常用户分配 IP。
Normally when a client attempts to start a TCP connection to a server, the client and server exchange a series of messages which normally runs like this:
This is called the TCP three-way handshake, and is the foundation for every connection established using the TCP protocol.
The server will wait for the acknowledgement for some time, as simple network congestion could also be the cause of the missing ACK. However, in an attack, the half-open connections created by the malicious client bind resources on the server and may eventually exceed the resources available on the server. At that point, the server cannot connect to any clients, whether legitimate or otherwise.
SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。
要明白这种攻击的基本原理,还是要从TCP连接建立的过程开始说起:
大家都知道,TCP与UDP不同,它是基于连接的,也就是说:为了在服务端和客户端之间传送TCP数据,必须先建立一个虚拟电路,也就是TCP连接,建立TCP连接的标准过程是这样的:
首先,请求端(客户端)发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号;
第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgment)。
第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。
以上的连接过程在TCP协议中被称为三次握手(Three-way Handshake)。
问题就出在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源—-数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃—即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYN Flood攻击(SYN洪水攻击)。
The attack involves sending a spoofed TCP SYN packet (connection initiation) with the target host’s IP address to an open port as both source and destination. This causes the machine to reply to itself continuously.
Combining a SYN attack with IP spoofing, a land attack occurs when an attacker sends spoofed SYN packets containing the IP address of the victim as both the destination and the source IP address.The receiving system responds by sending the SYN-ACK packet to itself, creating an empty connection that lasts until the idle timeout value is reached. Flooding a system with such empty connections can overwhelm the system, causing a denial of service (DoS).
HSRP的工作原理
HSRP协议利用一个优先级方案来决定哪个配置了HSRP协议的路由器成为默认的主动路由器。如果一个路由器的优先级设置得比所有其他路由器的优先级高,则该路由器成为主动路由器。路由器的缺省优先级是100,所以如果只设置一个路由器的优先级高于100,则该路由器将成为主动路由器。
通过在设置了HSRP协议的路由器之间广播HSRP优先级,HSRP协议选出当前的主动路由器。当在预先设定的一段(Hold Time 缺省为10秒)时间内主动路由器不能发送hello消息,或者说HSRP检测不到主动路由器的hello消息时,将认为主动路由器有故障,这时HSRP会选择优先级最高的备用路由器变为主动路由器,同时将按HSRP优先级在配置了HSRP的路由器中再选择一台路由器作为新的备用路由器。所有参与HSRP的路由器共享一个虚的IP地址,网络中的工作站将缺省网关指向该虚地址,被选出的主动路由器负责转发由工作站发到虚地址的数据包。Hello消息是基于UDP的信息包,配置了HSRP的路由器将会周期性的广播Hello消息包,并利用Hello消息包来选择主动路由器和备用路由器及判断路由器是否失效。
PC (H1:192.168.1.1)
(gateway: 192.168.1.254)
|
------------------------------------------------
| |
| |
| |
7609 5500
R1(192.168.1.253) R2(192.168.1.252)
(virtual ip: 192.168.1.254) (virtual ip: 192.168.1.254)
PC将数据包发送到设置的缺省网关(配置HSRP路由器所共享的虚拟IP地址),假设图中的7609设置了较高的优先级,7609将被选为主动路由器,并负责转发网络中所有由PC发送到其网关(HSRP地址)的数据包。当7609发生故障时,7609就不会广播Hello信息包,HSRP如果经过Hold Time还未收到来自7609的Hello信息包,将认为7609实效,这时HSRP将选择备用的5500作为主动路由器,并由5500来负责转发网络中所有由PC发送到其网关(HSRP地址)的数据包。而当7609恢复后,将继续发送Hello信息包,HSRP检测到其发送的Hello信息包具有高的优先级,则会重新将7609选为主动路由器,5500则仍将恢复成为备用路由器。
配置了HSRP协议的路由器交换以下三种多点广播消息:
在任一时刻,配置了HSRP协议的路由器处于由以下六种状态:
Hijacking HSRP
R1:
interface FastEthernet0/0
ip address 172.16.40.10 255.255.255.0
standby 1 ip 172.16.40.1
R2:
interface FastEthernet0/0
ip address 172.16.40.20 255.255.255.0
standby 1 ip 172.16.40.1
standby 1 priority 90
We can verify that R1 is the active HSRP router using the show standby command:
R1# show standby
FastEthernet0/0 - Group 1
State is Active
2 state changes, last state change 00:43:11
Virtual IP address is 172.16.40.1
Active virtual MAC address is 0000.0c07.ac01
Local virtual MAC address is 0000.0c07.ac01 (v1 default)
Hello time 3 sec, hold time 10 sec
Next hello sent in 0.868 secs
Preemption disabled
Active router is local
Standby router is 172.16.40.20, priority 90 (expires in 8.856 sec)
Priority 100 (default 100)
IP redundancy name is "hsrp-Fa0/0-1" (default)
To usurp the active router, we need only to inject HSRP hellos claiming the active role with a higher priority. Fields of interest from the intercepted packet above are:
State - A state of “active” (code 16) verifies we have a hello from the active router.
Hellotime - This value is how often we should retransmit our forged hello packet, in seconds.
Priority - We’ll need to claim a higher priority than the active router to take over.
All other fields should match between our captured packet and the one we inject.
A number of tools are available to emulate an HSRP router, but for this example we’ll use the Scapy packet manipulation framework. Scapy provides a very convenient interface for constructing, transmitting, and capturing packets. We can make use of its prebuilt libraries to easily construct a forged HSRP packet. Each protocol layer is built from an independent Python object:
Linux# scapy
Welcome to Scapy (2.0.0.10 beta)
>>> ip = IP(src='172.16.40.128', dst='224.0.0.2')
>>> udp = UDP()
>>> hsrp = HSRP(group=1, priority=255, virtualIP='172.16.40.1')
>>> send(ip/udp/hsrp, iface='eth1', inter=3, loop=1)
At this point, we have achieved an eventual denial of service attack, as neither router will answer ARP requests for 172.16.40.1 so long as we are seen as the active router. Although our example ends here, we could opt to begin answering ARP requests for 172.16.40.1 with our own MAC. By capturing the traffic from other hosts on the LAN and forwarding it on to one of the legitimate routers, we could easily achieve a man-in-the-middle attack.
Cisco HSRP active router hijacking 攻击原理:HSRP协议利用一个优先级方案来决定哪个配置了HSRP协议的路由器成为默认的主动路由器。黑客攻击的思路是通过发送 HSRP 包欺骗路由器组,告诉路由器黑客的计算机才是这个路由器组里优先级最高的路由器,这样所有访问该子网的流量都会被黑客监听到。
PPPoE有两个明显的阶段,发现阶段(PPPoE Discovery stage)和PPP会话阶段(PPPoE Session Stage)。
当主机希望开始一个PPPOE会话时,它首先要执行一个发觉流程来识别对方的MAC地址,然后建立一个唯一的PPPOE会话ID。PPPOE运用一个发觉 协议来处理这个疑问,它是基于客户/服务器模型的。由于以太网的广播特征,在这个流程中主机(客户)能发觉所有的访问集中器(服务器),并选择其中一个, 根据所获信息在两者之间建立点对点的连接。当一个PPP会话被建立起来之后,就完成了PPPOE的整个发现阶段。
发现阶段有四个步骤。 当它完成时,PPPoE双方都知道了PPPoE SESSION_ID和对方的以太网地址,它们一起唯一定义了PPPoE会话:
PPPoE的会话阶段开始后,主机和访问集中器之间就依据PPP协议传送PPP数据,执行 PPP的各项协商和数据传输。在这一阶段传输的数据包中必须包含在发觉阶段确定的会话标识并保持不变。正常情况下,会话阶段的结束是由PPP协议控制成 的,但在PPPOE中定义了一个PADT (PPPoE Active Discovery Terminate)包用来结会话,主机或者访问集中器可以在PPP会话开始的任何时候通过发送这个数据包来结束会话。
PPPoE会话流程分为三个阶段:
重复发送 PADR 分组是最常用的一种攻击方式, 攻击者首先通过发送PADI 来获取到PPPoE 服务器的PADO分组. 在确定好攻击目标后, 攻击者会不断地向被攻击的PPPoE 服务器发送PADR 分组, 若此时PPPoE 服务器没有为之前的PADO 分组保持状态, 则它会为攻击者的每个PADR 分组回复PADS 分组, 而PPPoE 服务器在发送了PADS 分组后会为此建立PPP 连接, 并为此连接分配相应的资源. 如果攻击者发送的PADR 分组足够多, 则最终会导致PPPoE 服务器资源耗尽. 如果攻击者预先知道PPPoE 服务器的MAC 地址和服务标签的设置, 则可以直接发送PADR分组, 更有甚者, 攻击者可能会把PADR分组封装在以太网广播帧中, 从而对整个物理网络造成影响.
另一种常见的 DoS 攻击手段是伪造MAC 地址攻击. 使用这种攻击方法的攻击者会发起多次PPPoE 发现阶段的交互过程, 而在每次的交互过程中, 攻击者会为自己伪造出不同的MAC 地址来欺骗PPPoE 服务器, 自己却在收到PADS 分组不做任何处理.