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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AOT:一个.Net 8最牛逼和最受欢迎关注的功能!

这次.Net 8发布,更新了诸多功能,但从各个编程社区看到大家讨论和交流最多的,还是AOT这个功能。 AOT本身在.Net 7就开始引入了,但这次.Net 8做了诸多更新: 1、增加了macOS 平台的 x64 和 Arm64 体系结构的支持&#x…

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

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

VBA之Word应用:文档(Document)的书签

《VBA之Word应用》(版权10178982),是我推出第八套教程,教程是专门讲解VBA在Word中的应用,围绕“面向对象编程”讲解,首先让大家认识Word中VBA的对象,以及对象的属性、方法,然后通过实…

Java入门篇 之 抽象类接口

本篇碎碎念:个人认为压力是一种前进的动力,但是不要有太多压力,不然会使心情烦躁,会控制不住自己的情绪,会在一个临界值爆发,一旦爆发,将迟迟不能消散 今日份励志文案: 努力的背后必有加倍的赏赐…

【算法每日一练]-分块(保姆级教程 篇1)POJ3648

插讲一下分块 题目:(POJ 3648) 一个简单的整数问题 前缀和往往用于静态的不会修改的区间和。遇到经常修改的区间问题,就要用分块或线段树来维护了。 分块算法是优化后的暴力,分块算法有时可以维护一些线段树维护不了的…

mysql的行列互转

mysql的行列互转 多行转多列思路实现代码 多列转多行思路代码 多行转多列 多行转多列,就是数据库中存在的多条具有一定相同值的行数据,通过提取相同值在列头展示来实现行数据转为列数据,一般提取的值为枚举值。 思路 转换前表样式 -> 转…

《洛谷深入浅出基础篇》 P5250 木材仓库————集合应用实例

上链接: P5250 【深基17.例5】木材仓库 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P5250上题干: 题目描述 博艾市有一个木材仓库,里面可以存储各种长度的木材,但是保证没有两个木材的长度是…

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

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

LeetCode【13】罗马数字转整数

题目: 思路: 第十二题的逆运算,方法同理。需要注意的是IV、IX、XL、XC、CD、CM这六种特殊的情况。正常情况下每个字符找到对应的数值累加,这六种特殊字符都是左边的数值比右边的数值小。 这里以IV举例,IV对应数字是1和…

分享禁止Win10更新的两种方法

深恶痛绝 Windows更新简直就是毒瘤,总是在某些不需要的时候提示更新,而且关闭服务后总有办法重启。老是关不掉。 如果每次都是正常更新,好像也没啥所谓,但是总有那么一两次会蓝屏、黑屏、开不了机…… 52出品 下面是吾爱社区找…

算法之冒泡排序

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

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

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