当前位置: 首页 > news >正文

记录基于scapy构造ClientHello报文的尝试

        最近有个需求就是用scapy构造https的client hello报文,由用户指定servername构造对应的报文。网上对于此的资料甚少,有的也是怎么去解析https报文,但是对于如果构造基本上没有找到相关的资料。

        一直觉得最好的老师就是Python的help功能和dir功能,对于这种资料比较少的最好也是去看看源码,我们可以先看看scapy对于TLS的支持能力

 有handshake,extensions等,说明基础的能力肯定是具备的,在上一篇文章中

基于Python3的scapy解析SSL报文-CSDN博客

我们可以看到scapy可以去解析https报文,那我想着能解析应该也具备构造的能力,所以自己先是尝试是不是和构造HTTPS差不多,在原有的报文上去修改servername。

尝试一:在原ClientHello报文上做修改

运行结果:

serverName=b'www.baidu.com'
serverName=b'www.sina.com'

附上源码

from scapy.all import *
from scapy.layers.tls.all import *
#from scapy_ssl_tls.ssl_tls import *load_layer("tls")srcpcap = rdpcap("https_standerd.pcapng")
tlsLayer = srcpcap[3][TLS]
#print(tlsLayer.layers)
#print(help(tlsLayer))
clientHelloPart = tlsLayer['TLS Handshake - Client Hello']
#clientHelloPart = tlsLayer[TLSClientHello]
serverNamePart = clientHelloPart['TLS Extension - Server Name']
serverLayers = serverNamePart.servernames
#serverNamePart = clientHelloPart[TLS_Ext_ServerName][ServerName]print(f"serverName={serverLayers[0].servername}")
#print(f"serverNameLen={serverLayers[0].namelen}")
#print(f"serverNamesLen={serverNamePart.servernameslen}")serverLayers[0].servername = b'www.sina.com'print(f"serverName={serverLayers[0].servername}")wrpcap("client_hello.pcap", srcpcap)

来看看保存的报文能不能修改成功

 可以看到修改成功了,但是光修改这个还是不够的,因为改了servername,那整个报文的长度都要重新计算赋值。但是可以看到这样是有效的

尝试二:从零开始构造ClientHello报文

        从零开始构造需要对scapy关于ClientHello相关的函数非常熟悉,我也尝试去读了源码,发现太复杂了,需要非常熟悉ssl的各个字段。既然网上没有相关资料,那就从chatgpt开始吧,由于墙的原因,咱就用一下国内的大模型,主要尝试了两个,一是百度家的,二是讯飞家的。

代码

from scapy.all import *  # 定义协议层次  
ssl_client_hello = (  IP(src="192.168.1.1", dst="192.168.1.2")/  TCP(dport=443, flags="S")/  SSL(version=0x0303, type=0x01)/  SSLClientHello(version=0x0303,  random=0x5778f9ac4b7b8e97ac39a0f78add5d47,  cipher_suites=[  0x002f, 0x0035, 0x0033, 0x0032, 0x002f,  0x0032, 0x0031, 0x0035, 0x002d, 0x002d,  0x002f, 0x0035, 0x332e, 0x382e, 0x372e,  0x362d, 0x352d, 0x332d, 0x322d, 0x2f35,  0x2f36, 0x2f37, 0x2f34, 0x2f33, 0x2f32,  0x2f31, 0x2f35, 0x2f37, 0x2f36, 0x2f35],  compression_methods=[1],  extensions=[  TLSExtension(type=0x14),  TLSExtension(type=0x15),  TLSExtension(type=0x16),  TLSExtension(type=0x17),  TLSExtension(type=0x18, server_name="www.baidu.com")])  
)  # 保存报文为pcap文件  
wrpcap("client_hello.pcap", ssl_client_hello)

直接运行报错,调试了版本也不好使,放弃,接着下一家

直接运行也会报错,需要修改调试

from scapy.all import *
from scapy.layers.tls.all import *# 创建一个IP层数据包
ip = IP(dst="www.xfyun.com")# 创建一个TCP层数据包
tcp = TCP(dport=443, flags="S")# 创建一个TLSClientHello报文
client_hello = TLSClientHello(version=0x0303)# 添加扩展字段,设置servername为www.xfyun.com
ext = TLS_Ext_ServerName(servernameslen=len('www.xfyun.com'),servernames=[b"www.xfyun.com"])
client_hello /= ext# 添加扩展字段,设置密钥共享信息
keyshare = TLS_Ext_KeyShare()
keyshare.group = 0x001d  # FFFD (X25519)
keyshare.key_exchange = b'\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
client_hello /= keyshare# 添加扩展字段,设置预共享密钥信息
psk = TLS_Ext_PreSharedKey()
psk.identity = b'\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
psk.secret = b'\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
client_hello /= psk# 将各个层组合在一起
packet = Ether() / ip / tcp / TLS(version=0x0303, type=0x01) / client_hello
packet.show2()
# 保存报文为pcap文件  
wrpcap("client_hello.pcap", packet)

 用wireshark打开生成的报文并不能识别成ClientHello。

尝试三:ClientHello构造思路

说实话在调试两个大模型的代码过程中,花费了我几乎一下午的时间,在这个过程中也熟悉了一下构造的几个函数

TLS()

TLSClientHello()

 大模型提供了构造的思路,但是仅仅只是填入servername,其他参数不填的话,构造出来的报文也是残缺的,那其他我们不关注的参数说实话我们也很难去构造,那我们能不能从已有的一个报文中去提取这些参数然后填入呢

当然这只是一个思路,等后面有时间打算实践一下,目前记录一下 

相关文章:

记录基于scapy构造ClientHello报文的尝试

最近有个需求就是用scapy构造https的client hello报文,由用户指定servername构造对应的报文。网上对于此的资料甚少,有的也是怎么去解析https报文,但是对于如果构造基本上没有找到相关的资料。 一直觉得最好的老师就是Python的help功能和dir功…...

程序设计实践学习笔记

第1题 题目描述 创建一个返回四舍五入到最接近整数的分数之和的函数。在矩阵中有每行的第一个数字表示分子,第二个数子表示分母,挑战者需要将该分数的结果进行四舍五入并将矩阵中所有分数结果总和进行返回。 输入输出格式 输入格式 数字 N 表示的是矩阵的行数。…...

Ubuntu中apt-get update显示域名解析失败

第一步 检查主机->虚拟机能否ping成功 ping 红色框中的IPv4地址 能通,表示虚拟机ip配置成功;否则,需要先配置虚拟机ip 第二步 检查是否能ping成功百度网址 ping www.baidu.com 若不成功,可能原因 虚拟机没联网,打开火狐浏览器…...

go学习之简单项目

项目 文章目录 项目1.项目开发流程图2.家庭收支记账软件项目2)项目代码实现3)具体功能实现 3.客户信息管理系统1)项目需求说明2)界面设计3)项目框架图4)流程5)完成显示客户列表的功能6&#xff…...

代码随想录二刷 | 数组 | 总结篇

代码随想录二刷 | 数组 | 总结篇 基础知识二分查找移除元素有序数组的平方长度最小的数组最小覆盖子串螺旋数组 基础知识 定义:数组是存放在连续内存空间上的相同类型数据的集合 特点: 数组下标从 0 开始数组内存空间的地址是连…...

go test 命令详解

文章目录 1.简介2.test flag3.test/binary flags4.常用选项5.示例参考文献 1.简介 go test 是 Go 用来执行测试函数(test function)、基准函数(benchmark function)和示例函数(example function)的命令。 …...

【Mysql学习笔记】1 - Mysql入门

一、Mysql5.7安装配置 下载后会得到zip 安装文件解压的路径最好不要有中文和空格这里我解压到 D:\hspmysql\mysql-5.7.19-winx64 目录下 【根据自己的情况来指定目录,尽量选择空间大的盘】 添加环境变量 : 电脑-属性-高级系统设置-环境变量,在Path 环境变量增加mysq…...

sentinel 网关

网关简介 大家都都知道在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。 这样的架构,会存在…...

常见面试题-MySQL的Explain执行计划

了解 Explain 执行计划吗? 答: explain 语句可以帮助我们查看查询语句的具体执行计划。 explain 查出来的各列含义如下: id:在一个大的查询语句中,每个 select 关键字都对应一个唯一的 id select_type:…...

SpringBoot静态资源配置

项目中 SSM中配置 第一种&#xff1a;配置文件中 <mvc:resources mapping"/js/**" location"/js/"/> <mvc:resources mapping"/css/**" location"/css/"/> <mvc:resources mapping"/html/**" location&q…...

Java拼图

第一步是创建项目 项目名自拟 第二部创建个包名 来规范class 然后是创建类 创建一个代码类 和一个运行类 代码如下&#xff1a; package heima;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import jav…...

Linux 怎样通过win 远程桌面连接链接Linux后台服务器的可视化图形界面

目的概述&#xff1a;因不想后台直接操作&#xff08;操作不便&#xff09;&#xff0c;所以想到能否基于xrdp协议服务利用 win自带的远程桌面服务&#xff0c;链接到后台&#xff0c;类似于vnc的使用方式&#xff0c;涉及操作系统版本&#xff1a;win11 、 CentOS 7.4 、CentO…...

Java 实现随机图形

要求 定义4个类&#xff0c;MyShape、MyLine、MyRectangle和MyOval&#xff0c;其中MyShape是其他三个类的父类。MyShape为抽象类&#xff0c;包括图形位置的四个坐标&#xff1b;一个无参的构造方法&#xff0c;将所有的坐标设置为0&#xff1b;一个带参的构造函数&#xff0…...

java 读写文件的代码。

java 读写文件的代码。 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStr…...

如何使用贝锐花生壳内网穿透远程访问JupyterNotebook?

在数据科学领域&#xff0c;Jupyter Notebook 已成为处理数据的必备工具。 其用途包括数据清理和探索、可视化、机器学习和大数据分析。Jupyter Notebook的安装非常简单&#xff0c;如果你是小白&#xff0c;那么建议你通过安装Anaconda来解决Jupyter Notebook的安装问题&#…...

文本向量化

文本向量化表示的输出比较 import timeimport torch from transformers import AutoTokenizer, AutoModelForMaskedLM, AutoModel# simcse相似度分数 def get_model_output(model, tokenizer, text_str):"""验证文本向量化表示的输出:param model: 模型的…...

java--贪吃蛇

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Random;public class Snake extends JFrame implements KeyListener, ActionListener, MouseListener {int slong 2;//蛇当前长度//蛇坐标int[] Snakex new int[100];int[] Snakey new…...

录制第一个jmeter性能测试脚本2(http协议)

我们手工编写了一个测试计划&#xff0c;现在我们通过录制的方式来实现那个测试计划。也就是说‘’测试计划目标和上一节类似&#xff1a;让5个用户在2s内登录webtour&#xff0c;然后进入 页面进行查看。 目录 一.性能测试脚本录制的原理 二、性能测试脚本录制的实操&#…...

pip命令大全

pip命令手册 原版 Usage: pip <command> [options]Commands:install Install packages.download Download packages.uninstall Uninstall packages.freeze Output installed packages…...

Redis篇---第二篇

系列文章目录 文章目录 系列文章目录前言一、为什么 使用 Redis 而不是用 Memcache 呢?二、为什么 Redis 单线程模型效率也能那么高?三、说说 Redis 的线程模型前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...