数据包注入是对已经建立的网络连接通过构建任意协议(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(&amp#039;!HHLLBBHHH&amp#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(&amp#039;H&amp#039;, tcp_checksum) + struct.pack(&amp#039;!H&amp#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数据包注入(伪造)相关推荐

  1. python拦截tcp数据包_发送低级原始tcp数据包python

    我最近一直在做一个原始数据包的程序.我们最近有一个关于生包的讲座,所以我一直在努力学习和做我的教授告诉我的事情.我的程序有问题,它出现了一个错误,说目标地址是必需的,它是原始的,所以我不想做socke ...

  2. python处理数据的包_在Python中利用Into包整洁地进行数据迁移的教程

    动机 我们花费大量的时间将数据从普通的交换格式(比如CSV),迁移到像数组.数据库或者二进制存储等高效的计算格式.更糟糕的是,许多人没有将数据迁移到高效的格式,因为他们不知道怎么(或者不能)为他们的工 ...

  3. python怎么编写wireshark抓的包_使用Wireshark 抓取数据包

    Wireshark 是一个网络封包分析软件.网络封包分析软件的功能是获取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换. 一  ...

  4. python怎么用大数据分析师_如何七周成为数据分析师18:Python的新手教程

    本文是<怎样 七周成为数据剖析 师>的第十八篇教程,假定 想要了解 写作初衷,能够 先行阅读七周指南.温馨提示:假定 您曾经 熟习 Python,大可不用 再看这篇文章,或只选择 部分 . ...

  5. python大数据免费_用python做大数据

    不学Python迟早会被淘汰?Python真有这么好的前景? 最近几年Python编程语言在国内引起不小的轰动,有超越Java之势,本来在美国这个编程语言就是最火的,应用的非常非常的广泛,而Pytho ...

  6. python爬虫数据可视化_适用于Python入门者的爬虫和数据可视化案例

    本篇文章适用于Python小白的教程篇,如果有哪里不足欢迎指出来,希望对你帮助. 本篇文章用到的模块: requests,re,os,jieba,glob,json,lxml,pyecharts,he ...

  7. python全栈还是大数据好_青岛PYTHON全栈应用开发班

    .部分 Python环境配置 Python环境配置 1.Python的历史和它的哲学思想 2.Python开发环境安装与配置 3.Python各种编辑器之间的选择,和安装配置 4.交互式解释器及IDE ...

  8. python交互式数据可视化_基于Python实现交互式数据可视化的工具,你用过几种?...

    作者:Alark Joshi 翻译:陈雨琳 来源:数据派THU(ID:DatapiTHU) 我教授了一门关于数据可视化的数据科学硕士课程.我们的数据科学硕士项目是一个为期15个月的强化项目,这个项目已 ...

  9. python实现食品推荐_通过Python语言实现美团美食商家数据抓取

    首先,我们先来打开美团美食商家页面,来分析一下. 如上面所提供的URL即为美团美食商家页面.或者我们通过美团官网打开一个美团美食商家页面,打开步骤如下:1.打开浏览器,输入 即可打开美团北京首页 2. ...

最新文章

  1. 详细理解JS中的继承
  2. 返回值类型与函数类型不匹配_C++返回值类型后置(跟踪返回值类型)
  3. android基础组件----Button的使用
  4. 工作58:element三级列表的问题
  5. foxmail 怎么把邮件格式默认为html_Python SMTP发送邮件-smtplib模块
  6. Guns 下载、导入、运行_入门试炼01
  7. python爬虫2——下载文件(中华网图片库下载)
  8. 不缺流量却变现乏力?穿山甲重磅打造《App 如何变现创收》系列课程帮你找症结...
  9. WCF中常见的几种Host,承载WCF服务的方法
  10. java NIO 复习
  11. 算法笔记_面试题_5.验证二叉搜索树
  12. html5调查问卷的计分实验,问卷调查实验
  13. 理解virt res shr之间的关系 - linux
  14. 华为机试:身高体重排序
  15. QTEmbedded VCN实现
  16. 解决Excel 2010打开两个以上文件时,总只显示一个窗口
  17. Python:岱宗夫如何?齐鲁青未了.
  18. 球半,NBA总决赛:凯尔特人VS勇士 6月11日
  19. button/input链接方式全攻略
  20. autosar中com模块_AUTOSAR架构的CAN通讯

热门文章

  1. 计网复习第三章part one
  2. Easystructure教程_C语言源代码自动生成流程图
  3. Objective-C依然占C位,Swift和SwiftUI在iOS 15中的使用情况
  4. 谁说数学好编程就好了?MIT告诉你:不对!
  5. 假如 C++ 是一只箭,你会用它来射哪只雕?
  6. 只用6张图教会AI识别物体,达摩院新方案大幅降低AI数据标注成本
  7. 老师,你确定注释不会被执行吗?
  8. 2020 年,嵌入式开发工程师的两大必知必会!
  9. 延迟上班别发愁,远程办公抗疫情!
  10. 光棍节就要到了,要不要给你介绍个 Python 对象?| CSDN 博文精选