记录基于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,其他参数不填的话,构造出来的报文也是残缺的,那其他我们不关注的参数说实话我们也很难去构造,那我们能不能从已有的一个报文中去提取这些参数然后填入呢

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/165003.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

go学习之简单项目

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

变频器干扰PLC,我们是这么解决的……

PLC是变频器的上位机,但是,在很多工程现场中,经常也会出现这样的问题,就是变频器开始运行后,PLC就开始罢工了,有的时候死机,有的时候指令传达不畅,有的时候会出现通讯时断时续等等&a…

物联网AI MicroPython学习之语法 TIMER硬件定时器

学物联网,来万物简单IoT物联网!! TIMER 介绍 模块功能: 硬件定时器模块 接口说明 Timer - 构建Timer对象 函数原型:Timer(id)参数说明: 参数类型必选参数?说明idintY硬件定时器外设模块id&#xff1a…

chromium通信系统-mojo系统(一)-ipcz系统基本概念

ipcz 是chromium的跨进程通信系统。z可能是代表zero,表示0拷贝通信。 chromium的文档是非常丰富的,关于ipcz最重要的一篇官方文档是IPCZ。 关于ipcz本篇文章主要的目的是通过源代码去分析它的实现。再进入分析前我们先对官方文档做一个总结,…

【C语言基础】分享近期学习到的volatile关键字、__NOP__()函数以及# #if 1 #endif

📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…

IIC 实验

IIC 简介 IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微 控制器以及其外围设备。它是由数据线 SDA 和时钟线 SCL 构成的串行总线,可发送和接收数 据,在 CPU 与被控 IC 之间、IC 与 IC 之间进行双…

02.接口隔离原则(Interface Segregation Principle)

一言 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。 为什么要有接口隔离原则 反例设计 反例代码 public class Segregation1 { }interface Interface1 {void operation1();void operation2();void operation3();void opera…

VUE(一)

1.vue简介 英文官网: Vue.js - The Progressive JavaScript Framework | Vue.js 中文官网: Vue.js - 渐进式 JavaScript 框架 | Vue.js 2.Vue的特点 3.初识VUE 在官网下载VUE.js,有两个版本&#xff0c;一个开发一个生产 <!DOCTYPE html> <html lang"en"…

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

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

打开游戏提示xapofx1_5.dll丢失如何修复?xapofx1_5.dll缺失的修复教程分享

xapofx1_5.dll是一个重要的Windows系统文件&#xff0c;它主要负责处理图形渲染和多媒体功能。如果在计算机中找不到xapofx1_5.dll&#xff0c;可能会导致程序无法正常运行。下面是关于xapofx1_5.dll丢失的4个修复方法以及xapofx1_5.dll的作用和丢失原因的介绍。 一、xapofx1_…

YOLOv8改进 | 2023 | InnerIoU、InnerSIoU、InnerWIoU、FoucsIoU等损失函数

论文地址&#xff1a;官方Inner-IoU论文地址点击即可跳转 官方代码地址&#xff1a;官方代码地址-官方只放出了两种结合方式CIoU、SIoU 本位改进地址&#xff1a; 文末提供完整代码块-包括InnerEIoU、InnerCIoU、InnerDIoU等七种结合方式和其Focus变种 一、本文介绍 本文给…

算法之冒泡排序

算法之冒泡排序 冒泡排序Bubble Sort 交换排序相邻元素两两比较大小&#xff0c;有必要则交换。元素越小或越大&#xff0c;就会在数列中慢慢的交换并“浮”向顶端&#xff0c;如同水泡咕嘟咕嘟往上冒。 核心算法 排序算法&#xff0c;一般都实现为就地排序&#xff0c;输出…

Oracle主备切换,ogg恢复方法(集成模式)

前言: 文章主要介绍Oracle数据库物理ADG主备在发生切换时(switchover,failover)&#xff0c;在主库运行的ogg进程(集成模式)如何进行恢复。 测试恢复场景&#xff0c;因为集成模式不能在备库配置&#xff0c;所以场景都是基于主库端: 1 主备发生switchover切换&#xff0c;主库…

Vue3--Vue Router详解--学习笔记

1. 认识vue-router Angular的ngRouter React的ReactRouter Vue的vue-router Vue Router 是Vue.js的官方路由&#xff1a; 它与Vue.js核心深度集成&#xff0c;让Vue.js构建单页应用&#xff08;SPA&#xff09;变得非常容易&#xff1b;目前Vue路由最新的版本是4.x版本。 v…

图像处理01 小波变换

一.为什么需要离散小波变换 连续小波分解&#xff0c;通过改变分析窗口大小&#xff0c;在时域上移动窗口和基信号相乘&#xff0c;最后在全时域上整合。通过离散化连续小波分解可以得到伪离散小波分解&#xff0c; 这种离散化带有大量冗余信息且计算成本较高。 小波变换的公…

Java拼图

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

LeetCode - 622. 设计循环队列(C语言,顺序存储结构,配图)

622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 设计循环队列&#xff0c;我们可以从顺序结构和链式结构来考虑&#xff0c;但因为链式结构实现起来较为复杂&#xff0c;不易理解&#xff0c;且主流使用顺序存储&#xff0c;所以本文就是用顺序存储结构实现。 因为…

《轻松入门!快速安装PyCharm,打造高效Python编程环境》

「Pycharm安装包和相关插件&#xff08;Windows 64位&#xff09;」https://www.aliyundrive.com/s/jByv6vjShVz 提取码: 1234 视频教程&#xff1a;https://www.douyin.com/video/7303106933521763596?previous_pageapp_code_link 第一步&#xff1a;找到一起下载的Pycharm安…

Linux:安装软件的两种方式rpm和yum

一、rpm方式 1、简单介绍 RPM是RedHat Package Manager的缩写&#xff0c;它是Linux上打包和安装的工具。通过rpm打包的文件扩展名是.RPM。这个安装包就类似Windows系统中的.exe文件。rpm工具实现Linux上软件的离线安装。 2、软件相关信息的查询命令 查询Linux系统上所有已…

数睿通2.0数据接入、数据开发、系统权限、集群监控全面升级

引言 数睿通 2.0 数据中台迎来了11月份的更新&#xff0c;感谢大家的支持&#xff0c;本次更新主要包括以下内容&#xff1a; 数据库支持 MongoDB数据接入支持 MongoDB&#xff0c;支持自定义 SQL 采集&#xff0c;支持停止运行中的任务数据生产支持 FlinkJar 任务&#xff0…