python拦截数据包_使用Python进行TCP数据包注入(伪造)
数据包注入是对已经建立的网络连接通过构建任意协议(TCP...UDP...)然后用原始套接字发送的方式进行妨碍的过程,这种方法被广泛使用在网络渗透测试中,比如DDOS,端口扫描等。
一个数据包由IP头部信息、TCP/UDP头部信息和数据构成:Packet = IP Header + TCP/UDP Header + Data
大多数操作系统的socket API都支持包注入(尤其是基于Berkeley Sockets的),微软在windows xp之后为了避免包嗅探限制了原始套接字的能力。这篇文章只适用于UNIX/类UNIX系统。
TCP协议被广泛运用于互联网上的数据传输,它是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议。
TCP的首部格式:0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
---Source Port是源端口,16位。
---Destination Port是目的端口,16位。
---Sequence Number是发送数据包中的第一个字节的序列号,32位。
---Acknowledgment Number是确认序列号,32位。
---Data Offset是数据偏移,4位,该字段的值是TCP首部(包括选项)长度乘以4。
---标志位: 6位,URG表示Urgent Pointer字段有意义:
ACK表示Acknowledgment Number字段有意义
PSH表示Push功能,RST表示复位TCP连接
SYN表示SYN报文(在建立TCP连接的时候使用)
FIN表示没有数据需要发送了(在关闭TCP连接的时候使用)
Window表示接收缓冲区的空闲空间,16位,用来告诉TCP连接对端自己能够接收的最大数据长度。
---Checksum是校验和,16位。
---Urgent Pointers是紧急指针,16位,只有URG标志位被设置时该字段才有意义,表示紧急数据相对序列号(Sequence Number字段的值)的偏移。
更多TCP协议的详细信息可以在网上轻易找到,在这里不再赘述。
为了建立一个可以自己构造数据的包,我们使用"SOCK_RAW"这种socket格式,使用"IPPROTO_RAW"协议,它会告诉系统我们将提供网络层和传输层。s = socket.socket(socket.AF_INET,socket.SOCK_RAW,)
通过这个简单的类,我们可以进行IP头部信息构造class ip(object):
def __init__(self, source, destination):
self.version = 4
self.ihl = 5 # Internet Header Length
self.tos = 0 # Type of Service
self.tl = 0 # total length will be filled by kernel
self.id = 54321
self.flags = 0 # More fragments
self.offset = 0
self.ttl = 255
self.protocol = socket.IPPROTO_TCP
self.checksum = 0 # will be filled by kernel
self.source = socket.inet_aton(source)
self.destination = socket.inet_aton(destination)
def pack(self):
ver_ihl = (self.version <
flags_offset = (self.flags <
ip_header = struct.pack("!BBHHHBBH4s4s",
ver_ihl,
self.tos,
self.tl,
self.id,
flags_offset,
self.ttl,
self.protocol,
self.checksum,
self.source,
self.destination)
"pack"方法会对IP头部元素进行打包并返回它ipobj = ip("127.0.0.1", "127.0.0.2") # Creating an ip object instancei
pobj.source = "localhost" # Changing IP element value
构造TCP头部信息
TCP类允许我们轻易地操作TCP头部元素并打包它们class tcp(object):
def __init__(self, srcp, dstp):
self.srcp = srcp
self.dstp = dstp
self.seqn = 0
self.ackn = 0
self.offset = 5 # Data offset: 5x4 = 20 bytes
self.reserved = 0
self.urg = 0
self.ack = 0
self.psh = 1
self.rst = 0
self.syn = 0
self.fin = 0
self.window = socket.htons(5840)
self.checksum = 0
self.urgp = 0
self.payload = ""
def pack(self, source, destination):
data_offset = (self.offset <
flags = self.fin + (self.syn <
tcp_header = struct.pack(&#039;!HHLLBBHHH&#039;,
self.srcp,
self.dstp,
self.seqn,
self.ackn,
data_offset,
flags,
self.window,
self.checksum,
self.urgp)
#pseudo header fields
source_ip = source
destination_ip = destination
reserved = 0
protocol = socket.IPPROTO_TCP
total_length = len(tcp_header) + len(self.payload)
# Pseudo header
psh = struct.pack("!4s4sBBH",
source_ip,
destination_ip,
reserved,
protocol,
total_length)
psh = psh + tcp_header + self.payload
tcp_checksum = checksum(psh)
tcp_header = struct.pack("!HHLLBBH",
self.srcp,
self.dstp,
self.seqn,
self.ackn,
data_offset,
flags,
self.window)
tcp_header+= struct.pack(&#039;H&#039;, tcp_checksum) + struct.pack(&#039;!H&#039;, self.urgp)
我们知道,TCP协议是一种面向连接(连接导向)的、可靠的、基于IP的传输层协议,提供一种面向连接的、可靠的字节流服务,面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接。
伪造的头部信息有五个不同的区域且包含了source ip和destination ip0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source IP address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination IP address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved | Protocol | Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+•Source IP address (32 bits): 发送者的IP地址
•Destination IP address (32 bits): 接受者的IP地址
•Reserved (8 bits): 清零
•Protocol (8 bits): 传输协议(6为TCP, 17为UDP)
在TCP头部校验计算中,校验和字段必须清零。一旦值被计算出,在发送包之前必须插入字段中。
构造头部字段source_ip = source
destination_ip = destination
reserved = 0
protocol = socket.IPPROTO_TCP
打包伪造的头部并且将它插入TCP头部和数据中:# 伪造头部
psh = struct.pack("!4s4sBBH",
source_ip,
destination_ip,
reserved,
protocol,
total_length)
psh = psh + tcp_header + self.payload
校验函数:def checksum(data):
s = 0
n = len(data) % 2
for i in range(0, len(data)-n, 2):
s+= ord(data[i]) + (ord(data[i+1]) <
if n:
s+= ord(data[i+1])
while (s >> 16):
print("s >> 16: ", s >> 16)
s = (s & 0xFFFF) + (s >> 16)
print("sum:", s)
s = ~s & 0xffff
一个小列子:s = socket.socket(socket.AF_INET,
socket.SOCK_RAW,
socket.IPPROTO_RAW)
src_host = "10.0.2.15"
dest_host = socket.gethostbyname("www.reddit.com")
data = "TEST!!"
# IP Header
ipobj = ip(src_host, dest_host)
iph = ip_object.pack()
# TCP Header
tcpobj = tcp(1234, 80)
tcpobj.data_length = len(data) # Used in pseudo header
tcph = tcpobj.pack(ipobj.source,
ipobj.destination)
# Injection
packet = iph + tcph + dataPinject.py
Running the script:
python pinject.py --src=10.0.2.15 --dst=www.reddit.com
[+] Local Machine: 10.0.2.15
[+] Remote Machine: 198.41.209.142
[+] Raw scoket created
[+] Data to inject: TEST!!
[+] Constructing IP Header
[+] Constructing TCP Header
wireshark的截图:
python拦截数据包_使用Python进行TCP数据包注入(伪造)相关推荐
- python拦截tcp数据包_发送低级原始tcp数据包python
我最近一直在做一个原始数据包的程序.我们最近有一个关于生包的讲座,所以我一直在努力学习和做我的教授告诉我的事情.我的程序有问题,它出现了一个错误,说目标地址是必需的,它是原始的,所以我不想做socke ...
- python处理数据的包_在Python中利用Into包整洁地进行数据迁移的教程
动机 我们花费大量的时间将数据从普通的交换格式(比如CSV),迁移到像数组.数据库或者二进制存储等高效的计算格式.更糟糕的是,许多人没有将数据迁移到高效的格式,因为他们不知道怎么(或者不能)为他们的工 ...
- python怎么编写wireshark抓的包_使用Wireshark 抓取数据包
Wireshark 是一个网络封包分析软件.网络封包分析软件的功能是获取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换. 一 ...
- python怎么用大数据分析师_如何七周成为数据分析师18:Python的新手教程
本文是<怎样 七周成为数据剖析 师>的第十八篇教程,假定 想要了解 写作初衷,能够 先行阅读七周指南.温馨提示:假定 您曾经 熟习 Python,大可不用 再看这篇文章,或只选择 部分 . ...
- python大数据免费_用python做大数据
不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...
- python爬虫数据可视化_适用于Python入门者的爬虫和数据可视化案例
本篇文章适用于Python小白的教程篇,如果有哪里不足欢迎指出来,希望对你帮助. 本篇文章用到的模块: requests,re,os,jieba,glob,json,lxml,pyecharts,he ...
- python全栈还是大数据好_青岛PYTHON全栈应用开发班
.部分 Python环境配置 Python环境配置 1.Python的历史和它的哲学思想 2.Python开发环境安装与配置 3.Python各种编辑器之间的选择,和安装配置 4.交互式解释器及IDE ...
- python交互式数据可视化_基于Python实现交互式数据可视化的工具,你用过几种?...
作者:Alark Joshi 翻译:陈雨琳 来源:数据派THU(ID:DatapiTHU) 我教授了一门关于数据可视化的数据科学硕士课程.我们的数据科学硕士项目是一个为期15个月的强化项目,这个项目已 ...
- python实现食品推荐_通过Python语言实现美团美食商家数据抓取
首先,我们先来打开美团美食商家页面,来分析一下. 如上面所提供的URL即为美团美食商家页面.或者我们通过美团官网打开一个美团美食商家页面,打开步骤如下:1.打开浏览器,输入 即可打开美团北京首页 2. ...
最新文章
- 详细理解JS中的继承
- 返回值类型与函数类型不匹配_C++返回值类型后置(跟踪返回值类型)
- android基础组件----Button的使用
- 工作58:element三级列表的问题
- foxmail 怎么把邮件格式默认为html_Python SMTP发送邮件-smtplib模块
- Guns 下载、导入、运行_入门试炼01
- python爬虫2——下载文件(中华网图片库下载)
- 不缺流量却变现乏力?穿山甲重磅打造《App 如何变现创收》系列课程帮你找症结...
- WCF中常见的几种Host,承载WCF服务的方法
- java NIO 复习
- 算法笔记_面试题_5.验证二叉搜索树
- html5调查问卷的计分实验,问卷调查实验
- 理解virt res shr之间的关系 - linux
- 华为机试:身高体重排序
- QTEmbedded VCN实现
- 解决Excel 2010打开两个以上文件时,总只显示一个窗口
- Python:岱宗夫如何?齐鲁青未了.
- 球半,NBA总决赛:凯尔特人VS勇士 6月11日
- button/input链接方式全攻略
- autosar中com模块_AUTOSAR架构的CAN通讯