深度剖析ja3指纹及突破

逆向之Ja3指纹学习 声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!引言: 在当今互联网时代,保护通信数据的安全性变得至关重要。为了建立安全的通信连接,TLS(Transport Layer Security)协议被广泛应用于Web浏览器、移动应用和其他网络应用程序中。而与此同时,识别和分析这些TLS通信也成为网络安全研究和威胁情报分析的重要任务之一。JA3指纹作为一种独特的指纹识别技术,为我们提供了一种有 阅读详情
AI摘要

本文详细介绍了ja3指纹的概念、工作原理以及如何通过Python和Golang进行突破。Ja3是一种用于SSL/TLS客户端指纹的方法,文章讨论了ja3的起源、工作机制,以及Python和Golang中如何修改ja3指纹以规避反爬机制。作者还探讨了Python在处理ja3时的局限性,并分享了实际案例和解决方案,包括使用golang库ja3transport和CycleTLS来模拟浏览器的ja3签名。

声明

以下只是搬运下我公众号的东西。很早就发过了。原帖地址:

深度剖析ja3指纹及突破 (qq.com)

已经发公众号的为什么还发csdn

有的圈内朋友,不经过我的允许,删减摘录我公众号的内容,这里就不提谁了,心里清楚,还能获得一些关注和流量。很无语,所以我还不如自己也发发。【猛男落泪】

前言

是的,我重新发了,没想到一不小心就过了这么久了,发现这期间有天赋的大佬们现在对于tls指纹研究得比我还透彻了,真的强啊。有种感觉tls未来会出现一个单独的派系。

文章较之前有部分改动,对理解ja3来说不影响的。因为某大佬看了我的文章后说我的方法其实不是完美突破,所以完美两个字没了。可能有朋友会说"你这不是在炒冷饭吗?没意思”,不不,完全没这想法。我想的是:

1.为了留存备份,等我老了可以给子孙后代看,这个是我写的。

2.以后大家不用再拿着那个pdf私下转发了。

3.之前明明答应过给朋友转载的,所以现在重发兑现下承诺。

4.还是有些朋友一搞不定某站就说是ja3指纹,所以重发可以拿来参考下什么是tls,现在用tls指纹的网站可真的不多啊。

5.其实之前有几个朋友希望我能重新发且开启付费,那就发吧,付费就没必要了,毕竟也不是靠这个过日子的。

之前发过ja3相关的文章可以作为初期了解:JS逆向之猿人学第十九题突破ja3指纹验证 ,再来看本篇文章,篇幅略长,如果赶时间的朋友,可以跳过接下来的理论概念介绍,可以直接从后面的【如何突破ja3】开始看

到底什么是ja3

简介

git:https://github.com/salesforce/ja3

官方解释:

JA3 是一种创建 SSL/TLS 客户端指纹的方法,它应该易于在任何平台上生成,并且可以轻松共享以用于威胁情报

 更权威的介绍文章:https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967

浓缩一下大概意思就是:

JA3 是一种对传输层安全应用程序进行指纹识别的方法。它于 2017 年 6 月首次发布在 GitHub 上,是 Salesforce 研究人员 John Althouse、Jeff Atkinson 和 Josh Atkins 的作品。创建的 JA3 TLS/SSL 指纹可以在应用程序之间重叠,但仍然是一个很好的妥协指标 (IoC)。指纹识别是通过创建客户端问候消息的 5 个十进制字段的哈希来实现的,该消息在 TLS/SSL 会话的初始阶段发送。

这.....,2017年就有了,我是2021年才通过阅读青南大佬的文章知道有这么个东西。

然后我猜,ja3名字的由来,是因为有3个研究人员,且他们的姓名缩写都是ja

ja3的由来

其实,John Althouse 自己说过,官方解释:

对这个 TLS 客户端进行指纹识别的主要概念来自 Lee Brotherston 2015 年的研究(https://blog.squarelemon.com/tls-fingerprinting/)和他的 DerbyCon 演讲(https://www.youtube.com/watch?v=XX0FRAy2Mec)。如果不是 Lee ,就不会有JA3的出现

ja3如何工作的

原文解释的很好了,官方解释:

TLS 及其前身 SSL 用于为常见应用程序和恶意软件加密通信,以确保数据安全,因此可以隐藏在噪音中。要启动 TLS 会话,客户端将在 TCP 3 次握手之后发送 TLS 客户端 Hello 数据包。此数据包及其生成方式取决于构建客户端应用程序时使用的包和方法。服务器如果接受 TLS 连接,将使用基于服务器端库和配置以及 Client Hello 中的详细信息制定的 TLS Server Hello 数据包进行响应。由于 TLS 协商以明文形式传输,因此可以使用 TLS Client Hello 数据包中的详细信息来指纹和识别客户端应用程序

更多更专业的,如果很感兴趣,劳烦移步John Althouse发表的文章:

https://engineering.salesforce.com/open-sourcing-ja3-92c9e53c3c41

感觉看了上面的话,是不是有点似懂非懂的感觉,没事,听我慢慢说,来个图吧,要来图的话,先来个三次握手的吧,老图了,相信各位朋友也都看烦了,我也看烦了,因为这图都传包浆了

详细的三次握手流程解释我就不说了,网上能查到的太多了,我就不献丑解释了,本篇文章的重点也不是它

那么按照ja开发者自述,是在三次握手之后,客户端向服务端发起client hello包,这个包里带了客户端这边的一些特征发给服务端,服务端拿来解析数据包,然后回发一个hello给客户端,之后再进行ssl数据交互,下面这个图,就是John Althouse自己画的

 

怎么说?画的很传神很易懂对吧?

更多原文解释,请看这里:https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967

John Althouse有关ja3的ppt讲义,上面的动图就是ppt文件里的,费了老大劲搞到的:链接: https://pan.baidu.com/s/1pfQwRwg3tbOT2Y2nQZYoAA  提取码: ptj6 (链接失效了可以联系我)

识别原理

以下John Althouse的文章里的:

1.JA3 不是简单地查看使用的证书,而是解析在 SSL 握手期间发送的 TLS 客户端 hello 数据包中设置的多个字段。然后可以使用生成的指纹来识别、记录、警报和/或阻止特定流量。

2.JA3 在 SSL 握手中查看客户端 hello 数据包以收集 SSL 版本和支持的密码列表。如果客户端支持,它还将使用所有支持的 SSL 扩展、所有支持的椭圆曲线,最后是椭圆曲线点格式。这些字段以逗号分隔,多个值用短划线分隔(例如,每个支持的密码将在它们之间用短划线列出)

3. JA3 方法用于收集 Client Hello 数据包中以下字段的字节的十进制值:版本、接受的密码、扩展列表、椭圆曲线和椭圆曲线格式。然后按顺序将这些值连接在一起,使用“,”分隔每个字段,使用“-”分隔每个字段中的每个值

其中第一条,也解释了我前一篇请求时尝试提交一个ssl证书为啥没有用的,第二条,服务端会在3次握手之后,收到客户端过来的hello包,然后解包,收集版本、接受的密码、扩展列表、椭圆曲线和椭圆曲线格式,在这时候就可以拿着ja3指纹去比对,哪些是限制了,哪些没有限制的,当确实有在限制名单里,就针对处理,当没有在限制名单里也返回一个hello,接着再继续ssl

ja3已收录指纹/黑名单

  • https://sslbl.abuse.ch/blacklist/sslblacklist.csv  这个没有更新了只有上百条

  • https://github.com/salesforce/ja3/blob/master/lists/osx-nix-ja3.csv  这个不是很全,只有上百条

  • https://ja3er.com/getAllUasJson  这个一直在更新,十几万条

  • https://ja3er.com/getAllHashesJson  同上,只是给定标注字段不同

我猜测,ja3er.com里的十几万ja3指纹,就是所有人访问过该网站的客户端(浏览器或者语言请求库)的指纹,有一条算一条的收集

案例解释

前面说了一堆理论概念,我们做开发的,如果只有概念没有实操或者例子解释是不够的,所以,来个案例,还是猿人学19题,同时继续祭出wireshark方便分析,先浏览器访问网站,拿到ip,提示一下,你们可别拿着ip去干人网站哈,挺好的一个爬虫练习平台,否则后果自负

这边wireshark显示:

此时你会看到很多的数据数据包,过滤一下,直接在过滤器位置输入ip.,就会有很多指令提示和历史记录

全部的命令是啥意思这里就不多说了,更多的可以百度,只介绍几个这里会用到的命令:

ip.dst_host就是目标地址,这里你可以理解为就是访问网站的服务端地址

ip.src_host就是源地址,这里你可以理解为就是你正在操作的电脑的ip,这个ip大多是局域网ip

ip.host 跟上面一样,但是不会区分是src还是dst,只要有指定地址的都会过滤出来

给定过滤指令,回车,此时有可能你输入过滤命令之后,看不到有任何数据包,小问题,可能你打开wireshark完了,没抓到包,重新刷新下网页就行了,此时就看到如下的数据:

注意看,最开始的6个数据包就是上面说的流程,前三个是三次握手,第四个开始到第6个就是ja3的hello数据包,个人感觉这段过程也很像三次握手,再后续的数据包就是实质的ssl数据交互了,

有了这个,看看ja3指纹到底是啥样的,双击这个client hello,然后服务端返回的sever hello就不看了,此时不需要看,忘掉它吧

 展开client hello:

 

滑到最后,就能看到ja3指纹了

然后,看JA3 Fullstring :

771,43690-4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,64250-0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-51914-21,51914-29-23-24,0

对应:

TLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats

以【,】分割,第一个数,771,根据官方解释,就是ssl/tls版本,也就是这个:

python终端跑一下,0x0303就是771,对上了:

 

后续的就不细说了,直接看

 ja3图1

细心的你发现了,我截图这里

是没有第四个数相关的套件, 但是ja自己的文章里是有第四个数EllipticCurves相关的:

其实不是没有的,是现在第四个参数由EllipticCurves改成了supported_groups

ja3图2

注:ja3图1是公司电脑,ja3图2是家里电脑,所以看着ja3字段有点不一样,tls版本也不一样

说到版本,纠正下我前一篇给的说明,ja3指纹不是一定在tls1.3上支持的,上面的截图各位朋友应该也看得到,tls1.2也支持的,不过也确实是需要wireshark的最新版才能看到ja3指纹

有关第三个数Extensions扩展列表,感兴趣的可以看看更详细的解释:https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml

实际的案例作为ja3概念解释就到这里了。

如何突破ja3

终于到了大家都很感兴趣的环节,怎么破它了。

完全突破tls,我知道的有两种,一种是hello包hook改写,一种是自编译openssl重新改默认的指纹

python半突破

在上一篇的解决方案里,修改cipher里的加密算法即可,也就是TLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats里的【Ciphers】,

有关ciphers相关套接字的,可以看看openssl的官方解释:https://www.openssl.org/docs/man1.1.1/man1/ciphers.html,,并且华为官网的waf介绍里也有不同tls版本对应的套接字:https://support.huaweicloud.com/bestpractice-waf/waf_06_0012.html

也就是说,我们要想改,可以直接复制上面的套件覆盖下即可,例如:

 
 

urllib3.util.ssl_.DEFAULT_CIPHERS = 'EECDH+AESGCMEDH+AESGCM'

但是,相信对这个tls有过相关经验的大佬来说,其实在调试requests请求时,调试到这个http/client.py文件库里时,就能看到,在开始connect 时 http版本直接写死成了1.0,还有这个建立连接的tunnel_headers,代码给了个空值

 

  

如果你再配上fiddler或者charles抓包看的时候,明显能看到,在python发送实际请求前的CONNECT请求如下:

 

而浏览器的这个CONNECT请求是http1.1,且headers是有值的,如下:

所以,这很明显的差异好吗?是很容易被识别到的

而且根据我多方查阅,加上咨询了各位大佬之后,python目前只能改Ciphers里面的算法套件,来生成非默认的ja3指纹,然后可以骗过检测不是太高的反爬机制。

但是其他的Extensions,EllipticCurves,EllipticCurvePointFormats是没法改的,原因是  python跟openssl没有很直接的联系,python发https请求最后还是借助openssl库暴露出来的方法,也就是的ssl_.py里的方法create_urllib3_context,因为openssl库对外提供的方法或者接口是没办法这么高度自定义的,Ciphers部分也最多能改改算法,都不能给个自己定义的算法进去的,而chrome可以访问是因为chrome有自己的ssl,且chrome肯定是不会被禁止的(闹呢,禁止了浏览器正常用户怎么访问?)

也就是说这是python自身的缺陷了?所以我之前测试时不管用requests,httpx,还是aiohttp都不行,因为这三个库底层都借助了openssl库发请求。

假如这种反爬手段满天飞的时候,python层面还没有成型的方案解决怎么办?

WTF?python的业务方向中引以为傲的爬虫居然有缺陷?而且这个问题非常致命啊,感觉被降维打击了,伤心的是目前还没法改变局面,你说焦虑不焦虑?

那有朋友估计会想问,“那为啥之前猿人学19题可以过?” ,那是因为19题检测的不严,只要ja3指纹长度小于等于浏览器的指纹长度都可以过,但其实还有很多特征的可以检测到的,来,看图,还是上次的图,看最后一个数有很大区别的,这个我在上一篇的结尾里也把这个问题抛出来了

这么明显的特征,如果是一个实际的网站案例,你觉得他会放过你吗?

所以目前python针对tls指纹的有两个缺陷,第一个发起CONNECT请求时http1.0被写死,headers为空(当然这个可以改源码临时解决),第二个指纹没法完全自定义,有很多特征被识别

说到这里,有朋友可能不信,口说无凭,这次来个实际的案例,一个大佬给我的某网站

浏览器打开(抱歉,我必须马赛克马到位),正常访问是这样的

  

python代码,这里我用之前介绍的简写形式了,只加这两行,其他地方不用改就行的

运行时发现程序卡住且一直没有响应的状态,测试得知原因是这个网站强制验证了http2.0的问题,requests暂不支持http2被该服务器识别一直不响应结果导致卡住。

那换成httpx,(有关httpx详细的代码如何突破ja3的,可以看我之前写的这篇:python爬虫- requests、httpx、aiohttp、scrapy突破ja3指纹识别 )

发现运行还是不行的。

怎么改都不成功的,这个就是实际例子说明了,这是python语言层面的问题啊,难道python真的有缺陷?

golang 之ja3transport库突破ja3

之后在蔡老板朋友圈里,青南大佬评论中说了是可以替换ja3指纹的,我请教青南大佬之后,他给了我一个方案,用golang突破,原文链接:一日一技:Golang 如何突破 JA3?

核心就是,代码里加了第三方库,ja3transport,这个库可以直接伪造ja3,刺不刺激?

一执行,一看,就发现真的改变了ja3指纹,惊呆!激动!刺激!兴奋!

大概的看了下ja3transport的介绍,它在发起请求的时候,会将请求的client hello数据包里的ja3指纹修改为我们自己的给定的,这样就达到了修改 JA3指纹的目的,妙啊

ja3transport简介

这个大佬给了一段解释:

JA3 的问题在于它仅比基于用户代理字符串的指纹识别客户端好一点。到目前为止,用户代理字符串比 TLS ClientHello 数据包更容易更改。JA3 签名的参数仍由 TLS 客户端控制,因此不能作为可信的信息来源。在 Jeff 和 John 的 ShmooCon 谈话中,他们提到 JA3 不是灵丹妙药。他们提出的颠覆 JA3 检测的方法是使用操作系统的 HTTPS 客户端绕过 TLS 客户端特定的 JA3 签名。我们提出了另一种通过制作与其他 TLS 客户端(如浏览器)匹配的 ClientHello 数据包来破坏 JA3 检测的方法

ja3transport突破原理

官方解释:

要想颠覆JA3,需要修改5个JA3参数,可以在Refraction Networking的utls项目ClientHelloSpec提供的struct中修改。该包允许用户构建和执行 ClientHello 握手。第一个参数,TLS 版本,可以用和成员修改。第二个参数,可用密码套件,可以通过更新成员来更改。第三个参数 TLS 扩展可以通过更新成员来更改。参数的一个问题是所有参数都必须遵循 TLSVersionMinTLSVersionMaxCipherSuitesExtensionsExtensionsTLSExtension界面。第四个和第五个参数,椭圆曲线和椭圆曲线点格式,分别是 TLS 扩展SupportedCurvesExtension和 的一部分SupportedPointsExtension


我们不是根据 JA3 字符串创建客户端,而是可以生成与 Web 浏览器等良性签名匹配的 JA3 签名。有一些预设允许 JA3 签名匹配 Chrome 或 Firefox,甚至更多。我们仅限于屏蔽使用 Go 可用的相同扩展的应用程序。例如,如果 Chrome 使用 Go 不支持的扩展程序,我们无法屏蔽它。屏蔽密码套件比较棘手,因为任何密码套件都可以进行广告,即使它没有实现。如果执行握手的服务器接受客户端通告但实际上并不支持的密码套件,则会出现问题。只要服务器接受实际支持的密码套件,虚假宣传比可用密码套件多的密码套件就不是问题

Go 的net/http库有一个名为Transport. 传输结构负责编写如何将数据包发送到目标服务器。由于 JA3 的签名是基于 ClientHello 数据包的,我们可以进行 TLS 握手,让 Go 完成剩下的工作。该Transport对象是一个参数http.Client结构其中大部分进入开发人员都很熟悉。通过生成Transport结构体,我们的库应该可以与任何现有的 Go 项目无缝协作

浓缩下梗概,意思就是在go构建请求,三次握手之后,到实际要发起client hello包之前,ja3transport把数据包拦截了,即上面说的hello包hook的方法,然后把原来的ja3指纹修改成了自传递的ja3字段发出client hello,服务端就认了,然后就通过了。

太牛逼了,他不是直接修改的tls里的那五个数组套件,因为ja3transport作者自己也说了,要想突破ja3,他认为的方法和选择的方法也是避开了直接改5个JA3参数,而是在5个JA3参数创建好之后进行拦截替换

那么也就是说,其实golang跟python比也并没有在语言上占有很大优势,唯一就是golang多了这么一群人提前就研究并写好了这个第三方库,而python没法解决只是还没有人写出能够拦截数据包并替换ja3指纹的库,也就是这个并不是python的缺陷啊。当然,如果你急于求得结果,我建议你还是学一下golang来解决问题。

更多的解释请看原文:https://medium.com/cu-cyber/impersonating-ja3-fingerprints-b9f555880e42

ja3transport后续问题

作者也说了,如果你随意地伪造ja3,假如服务端通过一些方式得知你客户端访问进程跟实际的ja3不匹配,那应该也会屏蔽你

我们能想到的最简单的检测改进是将 JA3 签名与生成 TLS ClientHello 数据包的进程映像配对。如果有客户端生成与 Firefox 匹配的 JA3 签名,但该进程不是 Firefox,则可能会发生一些奇怪的事情

ja3transport缺陷

但是,用这个库ja3transport执行的刚才那个案例网站的时候发现报了如下错,提示就是说这个服务器不支持版本304的协议

tls: server selected unsupported protocol version 304

一搜这个报错,就看到有个大佬说是因为不支持http2.0导致的:

对啊,这个网站上面它强制http2了,那也就是说,ja3transport不支持http2.0,这就是他的缺陷啊

golang之CycleTLS库http2.0+ja3指纹突破

那只要能解决http2这个问题,是不是就破了这个站呢?再看上面这个大佬发的日期:

7 May,那现在已经过去这么久了,大胆猜测一下,是不是这个大佬已经解决了呢?此时估计有朋友应该回想,“你这个人怎么这么不严谨,什么都靠猜吗?上一篇解决猿人学19题删一大片cipher加密算法解决问题也是猜的”

哈哈哈,是啊,因为我个人觉得,爬虫跟前后端开发还是有点区别的,前后端开发,按照我的理解,讲究的逻辑严密,事先考虑各个层面的问题,尽量少bug然后服务能够长期稳定运行,但是爬虫的话,有时候没思路的情况下真的是大胆猜测出来的,我现在的思维已经转向这个方面了,虽然以前也干过后端开发,但是思维已经回不去了。

我开始尝试了这个库:git地址:https://github.com/Danny-Dasilva/CycleTLS,真的就是抱着试一试的心态,执行,结果真的跟浏览器访问一样的,搞定,牛逼!

代码就不贴了,git地址上有。

所以,也就是说,之前用的库github.com/CUCyber/ja3transport,不够适合当下场景 http2+ja3双重验证

这辈子没想到搞了几年爬虫逆向开发会为了解决ja3问题去学golang

nodejs

还是用上面大佬Danny-Dasilva的CycleTLS库即可,他也开发了node的库:https://github.com/Danny-Dasilva/CycleTLS#example-cycletls-request-jsts

直接npm install cycletls,然后照着案例的代码来就行了,可能对于大部分爬虫开发来说,node相对golang来说会更熟悉一点的。

验证python指纹

既然已经可以随意改了对吧,那我改成python默认的指纹访问下这个网站看看呢?我下面只改了ja3指纹,看运行结果,果然是被拉黑了,哈哈哈哈

  

换接口验证

为了验证真的成功了,哈哈,该严谨的地方确实得严谨一点,还是用的golang,我换了另一个接口地址执行,确实有结果了。

用wireshark做最后的验证

那边go程序在执行,还是这个被马死的目标,这边wireshark抓包看结果,是的,相信你也看出猫腻了,它居然发了两次client hello包

  

而之前我们看到的,比如猿人学19题,内部题22,29题的那个,实际只会发一次的,这里发两次就很奇怪,然后,这两次发出去的ja3指纹还不一样:

哪里不一样,以逗号作为分割,除了第一个数和最后一个数,其他的字段的开头一个数组都不一样(以【-】作为分割)

然后,此时此刻,我们先去ja3官网看看浏览器本来的指纹呢?

chrome访问ja3官网返回得到的:
    771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-21,29-23-24,0

chrome访问目标网站用wireshark抓包得到:

  第一个:
    771,43690-4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,60138-0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-51914-41,14906-29-23-24,0

  第二个:
    771,10794-4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,14906-0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-2570-21,60138-29-23-24,0

仔细对比之后,也就刚好多了标记的

去掉上面标记出来的,其实第一个和第二个是一样的,仅仅是这个被我马赛克马死的平台是这样,我猜应该是这个平台自己多加了一层握手流程,所以会有2个client hello,具体为啥有两个不纠结了,我也不是该平台的开发,也没法得知具体原因,不重要了,能获取数据就行了。

不过等等,突然有个疑问?为啥wireshark的ja3指纹,同一个golang脚本啊,就算两个client hello,也应该是两个一样的ja3指纹啊,为了进一步分析,先用浏览器访问ja3后,同时看看wireshark抓包的是啥,这?我该信哪个?怎么wireshark多了点其他的东西

这引出了一个新的问题,哪个才是对的

ja3到底存在吗? 

按理来说,应该信ja3官方,因为这玩意儿就是别人搞出来的,那既然如此,是wireshark在搞事咯?(此时此刻突然想起了学生时代的一个数学逻辑题,假如你是侦探,现在有几个嫌疑人,已知里面有个人说了谎,从几个嫌疑人的供词里找出真凶。。。扯远了)

为了进一步确认这个问题,根据青南大佬给文章的方案,可以伪造ja3指纹,那此时此刻,试下吧,现在的逻辑就是,我用一个我已知的指纹去请求ja3,然后看看ja3官方的返回,再看wireshark的ja3指纹对比,如果wireshark里的ja3不全等于我们自定义的ja3,那就确认是wireshark在他喵的搞事了

首先澄清,没作弊哈,我用的第一个,跟我浏览器里的ja3是不一样的

  

这里我用的ja3transport库了,因为ja3官网没有强制HTTP2了,运行下面的代码,发现返回的确实改变了的,且值正是我们给定的

再看wireshark这边:

发现也是自定义的那个值,没有奇怪的数组了

相信有朋友会问,这就奇怪了,为啥这里又一样了?难道wireshark没有骗我们?啊这。。。,不是吧,忘了吗?ja3transport这个库会在在三次握手后,即将发起client hello数据包时,拦截这个包,然后把自定义的ja3指纹替换原有的啊,这是ja3transport库的原理,所以,这里wireshark能跟我们给定的ja3指纹对应上

那么,也就是说,wireshark有一套的自己的ja3指纹解析套件解析并显示了,但是这个解析套件跟ja3官网是不一样的,所以显示不一样。当然这是我经过多次分析推理得出来的结论,查了wireshark的文档,暂时没找到相关的介绍和解释,姑且这么理解吧,肯定信ja3官方不能信wireshark啊,毕竟这ja3是别人搞出来的。

而且仔细看下面这个图,我鼠标放到ja3上面的时候,下面的进制数据并不会对应显示

 

用微信好友chao的话,"所有真实的信息都有二进制的数据,而wireshark的ja3都没有对应的二进制数据"

所以我跟chao讨论之后,认为ja3其实并不存在(上一次这么醍醐灌顶还是读到《三体》里的那句台词"物理学不存在",不好意思又扯远了。。。),或者说ja3并不是实质性存在的字符,而是通过TLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats这五个tls组件根据自己的加密算法另类存在的,因为wireshark都能通过自己的解析逻辑解析显示啊。以上推论仅代表个人观点,有误请指正

需要注意的点

1.有没有发现,其实ja3在2017年就有了,据我了解,有很多公司的开发正在研究中。 

2.有了一个ja3,那我觉得后续肯定会出现升级版或者替代版了,红蓝对抗,反爬与反反爬,一直在对抗中进步,是好是坏,只能用时间来判定了。很多新东西靠自己一个人摸索是没法走到更远的,好比这个ja3,如果一开始没有Lee Brotherston大佬在2015公开讲解,也就不会有这么牛逼的ja3指纹出现了,很喜欢微信好友Regionover在一篇文章里的一句话:【故事要留给过去,但成长要用于分享】

3.另外,希望国内外能有大神可以仿照这个ja3transport库或者CycleTLS库写一个python的库出来,唉,我自己也想写出来啊,过去这么久了,我也在看原理,还得花时间研究啊。

后续怎么继续学习tls指纹

  1. 练习题:猿人学外部题19题,内部题22,29,32题,32题是app版的tls指纹校验,强的一批,网洛者练习平台第9题(这个题正常的浏览器都会返回假数据,作者看了一会儿我的文章一晚上就搞了这道题出来,强的一批),只提示下,有几页假数据。 

  2. 志远大佬的最新课程里有tls指纹的,感兴趣可以整一个。他的方法就是自编译openssl

  3. 感兴趣可以读下openssl源码

之前说的tls指纹研究怎么样了

说来惭愧,搞了这么久,也没搞出个所以然来,我越去了解,就越觉得这个东西不是那么容易的,资料太少,全靠摸索,只能慢慢来了,因为我想实现的是完全自定义tls指纹,这个想法说实话,越来越觉得难实现了,不过一有空就在研究的。不仅研究突破tls,也在研究怎么利用它更好实现反爬,欢迎有兴趣的朋友一起讨论。

结语

1.真诚感谢一路下来认识的大佬们。以上都是个人见解,如果有误还望指正,有任何问题,我很乐意跟各位大佬们交流,我微信id:geekbyte,备注来意

2.另外应有些朋友的建议建了个群,里面很多大佬,安全渗透,爬虫,web+app逆向,前后端开发,ios开发的大佬都有,已满200人,想进群的可以加我微信

3.推荐下蔡老板的星球,web逆向必须学的ast技术。他虽然不在爬虫圈,但是在爬虫圈一直有他的传说,我能有今天,能认识这么多大佬,很大一部分原因是因为他。真的很感谢蔡老板。

akamai TLS指纹(即JA3) akamai1.75 TLS指纹 ja3 akamai2.0 Cloudflare 5秒盾 阅读详情

相关推荐

js逆向知识-Ja3指纹学习

目录 一、ja3指纹介绍 二、ja3指纹解决方案 一、ja3指纹介绍 1、指纹:通过一些算法将一些特征加密得到的值,这些值往往能够区分你是谁。每个客户端会生成特定的ja3指纹,并不会随ip和useragent改变,通过ja3指纹可以定位识别到某个客户端(不限于浏览器、python等) 2、chrome浏览器查看ja3指纹:https://ja3er.com/json,或者https://ja3er.com/ 3、python的requests包查看ja3指纹 imp

m0_67391401的博客 1637

Python工程师之JA3 指纹

有些小伙伴在爬取网站的时候,是不是觉得爬取数据的时候,把代理加好,header设置得和网站请求一样,是不是网站就不会知道是谁爬取的呢? 其实不然,就算设置好代理IP和header一样可能会被网站检测到的,这个东西就是ja3指纹。 那什么是JA3指纹呢?A3指纹又叫做浏览器指纹,它是不会随着你更换 IP 或者 User-Agent 而改变的。而且即使你不使用模拟浏览器,你直接使用 Golang、使用 Python,它们也有自己各自的指纹,并且他们的指纹每次请求也是固定的。只要网站发现某个拥有特定指纹的客户端.

weixin_36723038的博客 6107

Burpsuite绕过检测实战:TLS指纹伪装与HTTP特征修复指南

在网络安全领域,TLS/SSL协议是保障数据传输安全的基础,其握手过程中生成的JA3指纹如同客户端的唯一身份证。网站通过分析TLS指纹、HTTP请求头等特征,能够识别并拦截自动化测试工具,这是现代Web应用防御体系的重要原理。掌握绕过这些检测的技术,对于渗透测试人员而言具有极高的工程实践价值,能有效提升安全测试的深度与成功率。本文聚焦于Burpsuite这一主流安全工具,针对其常见的TLS指纹和HTTP头特征被识别的问题,提供了一套从原理到实战的解决方案。通过使用BypassWAF等插件修改TLS栈模拟浏览

342

tls指纹之ja4发布!!!

距离深度剖析ja3指纹及突破这篇文章发布有一年多时间了,我也由js和app逆向,来回切换了有段时间了,说实话,已经在躺平了卧槽了,突然看到ja3作者在十几天前发了个ja4,我以为闹着玩的呢,点开是ja3作者发布的,垂死病中惊坐起!!!接下来就来浅浅的剖析下这ja4是怎么个事,暂时就不深度剖析了JA4 / S/H/L/X/SSH,简称JA4+,所以,也就是说,这个ja4+是一整套产品的名字而已JA4+提供了一套易于使用和共享的模块化网络指纹,取代了3年的JA2017 TLS指纹标准。

app安全逆向、移动开发、tls/ja3、爬虫、反爬 7599

HVV攻防实战:远控工具与Webshell流量特征深度解析与溯源

网络流量分析是网络安全防御与事件响应的核心技术,它通过对网络通信数据的深度解析,识别异常行为与潜在威胁。其原理在于,任何网络活动都会在协议层留下可观测的元数据和行为模式,即使通信内容被加密,其通信频率、数据包大小、TLS握手指纹等特征依然暴露了意图。这项技术的核心价值在于为被动防守的蓝队提供了最客观、难以篡改的“犯罪现场”记录,是从海量业务流量中精准定位攻击活动的关键。在HVV(护网行动)、应急响应及高级威胁狩猎等场景中,掌握主流攻击工具的流量特征成为溯源反制的必备技能。例如,Cobalt Strike等远

weixin_34332905的博客 398

Python爬虫实战:亚马逊中国模拟登录与二次验证全解析(2026最新版)

在数据驱动的商业时代,亚马逊作为全球最大的电商平台,其商品数据、价格波动、评论信息、库存状态等对市场分析、竞品研究、价格监控具有极高的价值。然而,亚马逊的反爬虫机制堪称行业标杆——从请求指纹校验、动态令牌、行为分析到二次验证(2FA),层层设防。本篇文章将带你从零开始,使用2026年最新的Python技术栈,完整实现亚马逊中国(z.cn)的模拟登录,并攻克二次验证难题。郑重声明:本文仅限技术研究与个人学习用途,严禁用于批量抓取、价格劫持、账户爆破等违法违规行为。

2201_76125261的博客 377

tls/ja3指纹补充说明

之前我查到的是已知的只能改ciphers加密套件,然后根据微信好友渔滒的发现,用pyqt可以改第三个扩展列表和第四个椭圆算法,最后一个椭圆标准还是没法改,相关链接:https://doc.qt.io/qt-5/qsslconfiguration.html目前我有空就在研究,没有结果之前,不好意思暂不便多说geekbyte。

app安全逆向、移动开发、tls/ja3、爬虫、反爬 1254

小芒电商逆向自动化下单助手

在电商自动化交易场景中,如何构建一个既具备友好交互界面,又能突破复杂Web端加密签名的工具,是许多开发者面临的挑战。本文不谈空泛的理论,而是基于一次真实的开发实战,深度剖析一个“电商下单助手”的实现过程。我们将从Tkinter多线程GUI设计跨语言JS环境调用以及高仿真TLS网络请求三个维度,对系统核心模块进行拆解分析。重点探讨了在Python中还原JS加密逻辑时遇到的JSON序列化陷阱及解决方案。本文展示了一个完整的电商自动化工具的开发流程。通过模块化。

猫敷雪 1248

python完美突破tls/ja3

时隔一个多月我又发文了,我还是只发好文的geekbyte,前几天有朋友跟我说我断更一个多月了,哈哈,这不就来了吗不多废话,进入正题。如果你偶尔看到这篇文章,而对tls还一脸懵的朋友,可以先阅读以下文章了解一下JS逆向之猿人学第十九题突破ja3指纹验证深度剖析ja3指纹及突破ja3指纹补充说明距离我上次发深度剖析ja3指纹及突破已时隔半年多(因为之前删过重新发的),我当时抛出一个问题,就是python由于依赖的openssl库没法高度自定义,导致针对tls那5个组件没法改动太大。

app安全逆向、移动开发、tls/ja3、爬虫、反爬 3315

实战!用Python爬取海关总署进出口贸易数据 —— 从反爬突破到数据可视化全流程指南

{"period": "2026-05", "country": "美国", "import_val": 123.4, "export_val": 567.8, ...}研究员可构建领先指标模型;fig = px.bar(top, x="country", y="total_usd", title="贸易总额TOP10")html.H1("海关进出口数据看板", style={"textAlign": "center"}),"""发起带签名的POST请求(实际为GET + query param)"""

2201_76125261的博客 588

从模组到集装箱:手把手拆解一个储能BMS的软硬件架构设计与通信组网

本文深入解析储能BMS的软硬件架构设计与通信组网,从电芯采样到系统集成的全链条技术实现。详细介绍了三级硬件架构(AFE、CMU、BMU)的设计要点,以及软件分层实现中的驱动层、应用层核心算法和通信协议栈。通过实战案例分享CAN网络搭建、调试工具链和系统验证测试经验,为储能系统开发提供实用指导。

weixin_30752699的博客 462

tls指纹之chrome新版功能/近期问题汇总/目前能直接使用的tls对抗库

今天在找某个东西的时候,无意间,想看看ja3相关的东西,有没有啥值得研究的,然后就突然想起chrome随机指纹那个事,这个其实在2023年开年上班那几天的时候,就我群里看到群友说,chrome新版,自带随机ja3指纹,卧槽?我当时是不信的,结果试了半天,确实是不一样了????我用的以下网站测试,ja3官网现在经常无法访问了这是什么个情况?我反复确认,确实是不一样了,具体哪里不一样了呢?颠覆了啊,卧槽,为啥,ja3官网之前不是说一个浏览器客户端ja3指纹基本是固定的吗?

app安全逆向、移动开发、tls/ja3、爬虫、反爬 2981

2024年上半年网络工程师下午真题及答案解析

位于MPLS域边缘、连接其他网络的LSR称为( 3 ),区域内部的LSR称为核心LSR(CoreLSR)IP报文进入MPLS网络时,MPLS入口设备分析IP报文的内容并为其添加合适的标签,所有MPLS网络中的LSR根据标签转发数据,当该IP报文离开MPLS网络时,标签由出口LER弹出。LSP的出口LER称为( 6 )。某高校网络拓扑如下图所示,两校区核心(CORE-1、CORE-2),出口防火墙(NGFW-1、NGFW-2)通过校区间光缆互联,配置OSPF实现全校路由收敛,两校区相距40km。

bsefef的博客 2471

猿人学第十九题(tls指纹特性)

curl_cffi下载 pip install curl_cffi代码cookies = {自己的cookie}headers = {自己的headers}nums=0#这个网站可以查看ja3指纹params={if page>3:print(res)

Mr_yuhan6的博客 837

从零到一:3D Slicer与MONAI在医学影像中的AI革命

本文探讨了3D Slicer与MONAI在医学影像分析中的革命性应用,展示了如何通过开源工具实现高效的三维影像处理和AI增强分析。结合临床案例,详细介绍了从数据准备到AI分析的全流程,显著提升诊断效率和精度,推动医学影像技术迈向新纪元。

tcp8optimizer的博客 340

SA8155P QCOM 车载系统介绍

高通车载相机开发

qq_37057338的博客 5223

tls指纹之到底怎么判断是否有tls、到底怎么对抗tls

其实自从大概一年前,发了tls/ja3那篇文章之后开始 ,就时不时有朋友找我私聊,让我帮忙看看某某平台,“怎么回事啊?”,“怎么python请求不到?”,“到底是不是tls?”,“怎么过tls?”,等等...真的还挺多的所以,这篇文章,我把我想的写出来,还不太懂的,请仔细看,一个字一个字的看,因为有的朋友问的问题,之前的文章其实都有的,所以我希望各位朋友,这篇文章请认真看如果看完我这篇文章,还是无法确定是否是tls的话,也可以继续问我,但我希望你是经过自己思考还是没搞定的情况下再来的。

app安全逆向、移动开发、tls/ja3、爬虫、反爬 4913

纳米尺度仿真软件:Quantum Espresso_(13).非线性光学性质计算

通过 Quantum Espresso,可以高效地计算材料的非线性光学性质,包括二阶和三阶非线性极化率。这些性质在许多现代技术中具有重要的应用价值。在准备输入文件时,需要详细描述系统的晶格结构和原子位置,选择合适的基组和赝势,并设置计算参数和微扰设置。通过优化计算参数和使用并行计算,可以提高计算效率和精度。最后,使用适当的工具进行结果分析和可视化,可以更好地理解材料的非线性光学行为。

kkchenjj的博客 1277

突破Cloudflare防护:curl_cffi爬虫实战指南

TLS指纹识别是现代Web安全防护的核心技术之一,通过分析客户端握手特征来识别自动化流量。Cloudflare等CDN服务商利用JA3指纹检测等技术构建智能防护系统,传统爬虫工具因固定的加密套件顺序和TLS扩展特征容易被拦截。curl_cffi作为基于libcurl的Python绑定,能完美模拟浏览器级TLS握手特征,支持动态JA3指纹生成和HTTP/2协议。该技术在跨境电商数据采集、价格监控等场景展现极高价值,实测成功率可达98.7%,比selenium方案内存占用降低93%。合理使用该技术时需注意遵守r

weixin_30702441的博客 223

微信公众号网页H5跳转小程序实战指南(开放标签wx-open-launch-weapp)微信H5跳转小程序、wx-open-launch-weapp、小程序跳转按钮、微信开放标签、H5打开小程序

跳转小程序(wx-open-launch-weapp)唤起App显示支付按钮等等……而我们这次要用的,就是跳转小程序的标签。场景是否支持服务号网页✅ 支持小程序静态网页托管✅ 支持订阅号❌ 不支持微信外部浏览器❌ 不支持这个“开放标签”功能其实很强大,除了跳转小程序,还有唤起APP、跳支付、调用客服等能力。但可惜资料零散,很多坑等着你亲自踩一遍。这篇文章我整理的流程基本涵盖了从“能不能跳”到“怎么跳”的完整路径,希望你能像我一样省下几个小时的踩坑时间。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1163

深度学习论文: Towards Total Recall in Industrial Anomaly Detection

在大规模工业制造中,能够准确检测出有缺陷的零件至关重要。我们在这项工作中面临的一个特殊挑战是冷启动问题:仅使用正常的示例图像来训练模型。虽然可以针对每个类别手动设计解决方案,但我们的目标是构建能够自动适用于多个任务的系统。最佳的方法是将ImageNet模型的嵌入特征与异常检测模型结合起来。在本文中,我们在这一研究基础上进行了扩展,并提出了PatchCore,它利用了一个具有最大代表性的正常补丁特征内存库。通过这种方法,我们能够更好地解决冷启动问题,并提高系统在多任务上的性能。

mingo_敏 1874

代理反爬案例爬取实战:突破网站IP封禁的高级技巧

代理反爬案例爬取实战:突破网站IP封禁的高级技巧

KE17RS的博客 2385

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深度剖析Amnesia RAT定向攻击:从钓鱼诱饵到双重勒索的完整攻防实战

在网络安全领域,高级持续性威胁(APT)攻击往往采用多阶段、模块化的攻击链,以规避传统安全设备的检测。其核心原理在于将社会工程学、漏洞利用、恶意软件开发和反检测技术无缝衔接,构建出一条从初始入侵到持久控制的完整路径。这种攻击方式的技术价值在于其高度的隐蔽性和破坏性,能够绕过基于特征码的静态防御,实现对目标系统的长期控制与数据窃取。在实际应用场景中,攻击者常利用高度本地化的钓鱼邮件作为初始入口,通过恶意宏或伪装的可执行文件投递下载器,最终部署功能全面的远程访问木马(RAT)如Amnesia RAT,并可能结合

weixin_30785593的博客 377

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

突破动态渲染与反爬限制:现代网页变更监控系统的架构演进与实践

《突破动态渲染与反爬限制:现代网页监控系统架构演进》分析了当前网页监控面临的三大挑战:动态渲染与异步加载、反爬风控策略以及精准状态比对。文章指出传统爬虫技术已无法应对现代Web环境,建议采用Playwright等无头浏览器技术,并详细介绍了专业SaaS工具PageWatch.tech的解决方案,包括内置反爬能力、智能降噪算法和云原生调度。作者强调,对于非核心业务监控需求,使用专业监控平台比自建系统更具性价比,能有效降低维护成本。文末推荐了开箱即用的PageWatch.tech工具,帮助用户专注于业务逻辑而非

DJun的博客 989

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: tls指纹之chrome新版功能/近期问题汇总/目前能直接使用的tls对抗库
下一篇: 能过tls检测的curl-impersonate win版,搞起来啊
geekbyte.
博客等级 码龄11年 308粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值