逆向之Ja3指纹学习
声明
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
tls
tls实际上前身就是 ssl,由于访问 https页面的时候,网络层建立连接过程中,涉及到了tl握手问题,
所以tls指纹就有可能被反爬手段所检测,目前有一些防火墙已经将此技术应用。
目前为止,tls指纹的检测手段依然停留在 将tls内容做哈希操作,由此检测黑名单的方案,而并非使用了白名单手段。
抓包展示
用下某网站做测试 且此网站也有有Ja3指纹加密的
aHR0cHM6Ly9nZ3p5LmppYW5neGkuZ292LmNuL3h3ZHQvMDAxMDAyL3NlYzEuaHRtbA==
fiddler
!注意 fiddler要想抓Ja3-tls指纹 包
要把CONNECTS选项取消勾选,不然抓包指纹包

然后我们抓到了很多指纹包,然后我们挨个打开看看


然后我们看到很多的加密算法,还有加密方式
其实这种包其实本质上就是加入黑名单
已经tls的版本也有

charles
相比较fiddler charles抓到的包就很有限了。
但是操作也更加的简单了
我们直接打开charles 然后刷新网站

这里直接就显示了tls的信息

我们接着点开详细信息 这里显示了tls的加密方式 已经加密的两种方式.
这两种抓包方式终究还是图一乐,真要抓包还得看wireshark
wireshark
步骤如下
- 查询网站IP地址 ======> cmd ======> ping xxx.com =====> 复制IP地址
- 打开wireShark抓包,选择抓取的网卡
- 刷新浏览器
- 在过滤器中输入 ip.addr == 你要查看的ip地址 具体如下图

- 找到一个Client hello的包

- 查看详细信息

最下面的是hash指纹 和详细指纹信息

把这个指纹fullstring复制出来
771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,18-51-35-23-45-5-27-10-13-43-65281-11-16-17513-0-21,29-23-24,0
这个指纹信息就是网站可以运行的指纹信息
指纹分析
指纹信息分析其实很简单,
我们接下来用三种方式去获取这个指纹信息
也就是上文的771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,18-51-35-23-45-5-27-10-13-43-65281-11-16-17513-0-21,29-23-24,0
浏览器
这里我们选择直接用上文抓包抓到的指纹
还有一种方式
https://tls.browserleaks.com/json 直接去网站看自己的浏览器指纹也是可以的
由于上面已经获取了浏览器的指纹了,我们直接就拿来用了
771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,18-51-35-23-45-5-27-10-13-43-65281-11-16-17513-0-21,29-23-24,0
python
接着我们使用requests原生库,即正常访问,携带基本的参数去请求即可
我们使用代码去访问下这个网站https://tls.browserleaks.com/json
import requests
r = requests.get('https://tls.browserleaks.com/json', verify=True)
print(r.text)
结果
{
"ja3_hash": "8d9f7747675e24454cd9b7ed35c58707",
"ja3_text": "771,4866-4867-4865-49196-49200-49195-49199-52393-52392-159-158-52394-49327-49325-49326-49324-49188-49192-49187-49191-49162-49172-49161-49171-49315-49311-49314-49310-107-103-57-51-157-156-49313-49309-49312-49308-61-60-53-47-255,0-11-10-16-22-23-49-13-43-45-51-21,29-23-30-25-24,0-1-2",
"ja3n_hash": "a790a1e311289ac1543f411f6ffceddf",
"ja3n_text": "771,4866-4867-4865-49196-49200-49195-49199-52393-52392-159-158-52394-49327-49325-49326-49324-49188-49192-49187-49191-49162-49172-49161-49171-49315-49311-49314-49310-107-103-57-51-157-156-49313-49309-49312-49308-61-60-53-47-255,0-10-11-13-16-21-22-23-43-45-49-51,29-23-30-25-24,0-1-2",
"akamai_hash": "",
"akamai_text": ""
}
所以这个指纹是
771,4866-4867-4865-49196-49200-49195-49199-52393-52392-159-158-52394-49327-49325-49326-49324-49188-49192-49187-49191-49162-49172-49161-49171-49315-49311-49314-49310-107-103-57-51-157-156-49313-49309-49312-49308-61-60-53-47-255,0-11-10-16-22-23-49-13-43-45-51-21,29-23-30-25-24,0-1-2
python 魔改库
我们再试试 Python有关SSL的魔改库
其实这类库有很多
简单举例两个吧 一个是 curl_cffi 一个是 tls_client
- tls_client : https://pypi.org/project/tls-client/
- curl_cffi: https://pypi.org/project/curl-cffi/
我们这里使用curl_cffi 去访问一下看看这个指纹是什么
from curl_cffi import requests
r = requests.get("https://tls.browserleaks.com/json", impersonate="chrome101")
print(r.text)
结果
{
"ja3_hash": "cd08e31494f9531f560d64c695473da9",
"ja3_text": "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-17513-21,29-23-24,0",
"ja3n_hash": "aa56c057ad164ec4fdcb7a5a283be9fc",
"ja3n_text": "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-5-10-11-13-16-18-21-23-27-35-43-45-51-17513-65281,29-23-24,0",
"akamai_hash": "4f04edce68a7ecbe689edce7bf5f23f3",
"akamai_text": "1:65536;3:1000;4:6291456;6:262144|15663105|0|m,a,s,p"
}
而这个指纹是
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-17513-21,29-23-24,0
总结三种方式
然后我们把这三个指纹拿出来做个对比
浏览器:
771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,18-51-35-23-45-5-27-10-13-43-65281-11-16-17513-0-21,29-23-24,0
python原生库:
771,4866-4867-4865-49196-49200-49195-49199-52393-52392-159-158-52394-49327-49325-49326-49324-49188-49192-49187-49191-49162-49172-49161-49171-49315-49311-49314-49310-107-103-57-51-157-156-49313-49309-49312-49308-61-60-53-47-255,0-11-10-16-22-23-49-13-43-45-51-21,29-23-30-25-24,0-1-2
python魔改库:
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-17513-21,29-23-24,0
可以清楚地看到 python的魔改库和浏览器的指纹是长度是一样的。
这样我们可以知道了,这个指纹长度只要和浏览器相同就可以了。
我们使用魔改库访问开头所要访问的网站实验一下

发现可以正常访问
那该如何不借助魔改库去完成Ja3网站的解密呢
可以通过修改ssl的套接字 使得防火墙黑名单失效
从而保证指纹长度一致 即可完成解密
tls 检测的绕过方案
**临时方案: **
注意 requests库必须在2.4 以上版本 不然会失败
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS ='ALL'
修改了requests内部包的 ssI里面的套接字设置,使防火墙黑名单失效
动态 DEFAULT CIPHERS :
https://www.openssl.org/docs/man1.1.1/man1/openssl-ciphers.html
https://support.huaweicloud.com/bestpractice-waf/waf_06_0012.html
这种方法国内处理就已经够了
非临时方案:
自设ssl,并覆写requests中的类的一些方法
https://stackoverflow.com/questions/60407057/python-requests-being-fingerprinted
深入理解requests中 建立 tls的过程
先抓包看下正常的访问 tls,和requests访问的区别
我们需要单步调试requests源码,并且想办法修改 tls访问过程中的UA
按照上面的思路,加上对 ssl的理解,就可以实现一个针对于 *ka**i tls检测的高并发方案
逆向之Ja3指纹学习的更多相关文章
- android 逆向project smail 语法学习
众所周知,android 是开源的.如今市场上反编译别人的劳动果实的人也不少.所以我们也是有必要学习下smail语言,(就是androidproject反编译后出的语法语音),看看改怎么给我们的代码 ...
- Anroid逆向学习从编写so到静动态调试分析arm的一次总结
Anroid逆向学习从编写so到静动态调试分析arm的一次总结 一.前言 最近跟着教我兄弟学逆向这篇教程学习Android逆向,在第七课后作业反复折腾了好几天,正好在折腾的时候对前面的学习总结一波,动 ...
- 2021年正确的Android逆向开发学习之路
2021年正确的Android逆向开发学习之路 说明 文章首发于HURUWO的博客小站,本平台做同步备份发布.如有浏览或访问异常或者相关疑问可前往原博客下评论浏览. 原文链接 2021年正确的Andr ...
- 20145325张梓靖 《网络对抗技术》 PC平台逆向破解
20145325张梓靖 <网络对抗技术> PC平台逆向破解 学习任务 shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并 ...
- 20145336张子扬 《网络对抗》逆向及bof基础
20145336张子扬 <网络对抗>逆向及bof基础 学习知识点 缓冲区溢出 缓冲区溢出 一种非常普遍.非常危险的漏洞,在各种操作系统.应用软件中广泛存在.利用缓冲区溢出攻击,可以导致程序 ...
- Android无需权限显示悬浮窗, 兼谈逆向分析app
前言 最近UC浏览器中文版出了一个快速搜索的功能, 在使用其他app的时候, 如果复制了一些内容, 屏幕顶部会弹一个窗口, 提示一些操作, 点击后跳转到UC, 显示这个悬浮窗不需要申请android. ...
- Android逆向工程师的黑科技
你们发现了吗?Android逆向.安全方面的工程师真的越来越"稀有"了. 以腾讯.美团.百度为代表的大厂们,在某招聘网站上居然薪酬高达30-60k. 现在移动端市场越来越火热,AP ...
- 【reverse】逆向1 数据宽度
[reverse]逆向1 数据宽度 前言 感觉学逆向的都是大佬,正好最近在看java视频的时候,发现讲课的老师居然是从逆向行业转行来的,顿时肃然起敬.于是想在暑假的最后发光发热,把逆向的基础知识学习稳 ...
- Syscan360会议胸牌破解揭秘
Syscan360会议胸牌破解揭秘 背景 有幸参加今年11月份的上海Syscan360安全会议,会议期间有一个亮点就是360的独角兽团队设计了一款电子badge(胸牌)供参加人员进行破解尝试,类似于美 ...
- 华为V-ISA信誉安全体系:对付新型DDoS攻击的利器
华为Anti-DDoS解决方案基于华为颇具传统优势的专业软硬件平台开发,在防护机制中,引入先进的检测机制,提供了业内首创的“V-ISA”信誉安全体系,是业界唯一单机可提供超百G DDoS防御能 ...
随机推荐
- [Python]【Form Data vs Request Payload】之 python 爬虫如何实现 POST request payload 形式的请求
1 问题描述 欲使用Python的requests库(requests.session().request(...))实现对此Ajax的POST请求进行模拟实现. 但在chrome发现其请求的形式不一 ...
- [SrpingBoot]初步搭建springboot应用,报错:Failed to configure a DataSource: 'url' attribute is not specified and no embedd[转载]
1 错误信息 Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource ...
- Nordic芯片烧录指南
本文讲介绍Nordic系列芯片的烧录方式 一.准备工作 1.硬件 首先需要准备一块Nordic的DK或者Jlink,但是需要注意的是x宝购买的盗版Jlink因为没有license,用一段时间可能会被锁 ...
- oracle数据对比--用户,索引,分区,dblink,同义词,视图
问题描述:需要对比用户数据一般在数据库迁移之后,需要对比一下两个库之间的差距,如果登上去一条命令的执行,去统计,就会比较麻烦,这里整理了一些脚本可用.通过创建dblink的方式快速查询,也可以整合到一 ...
- JVM的内存分配及各种常量池的区别(静态常量池、运行时常量池、字符串常量池)
JVM内存分配 先了解下JVM中的内存分配,此处以hotspot vm为例(官方jdk采用的vm) 程序计数器 栈 1. 虚拟机栈 2. 本地方法栈 Java堆 堆内存是各个线程共享的区域 方法区 它 ...
- React框架使用
一:使用Vite创建React项目 二:React中组件使用 import React, { Component, useState } from "react"; //使用cla ...
- day05-优惠券秒杀01
功能03-优惠券秒杀01 4.功能03-优惠券秒杀 4.1全局唯一ID 4.1.1全局ID生成器 每个店铺都可以发布优惠券: 当用户抢购时,就会生成订单,并保存到tb_voucher_order这张表 ...
- element-ui Table 表格行间隔及行边框效果
<el-table :data="tableData" style="width: 100%" :cell-class-name="tableC ...
- [双目视差] 单双目MATLAB 相机标定(一)单目摄像机标定
文章目录 单双目MATLAB 相机标定(一)单目摄像机标定 一.环境准备 二.标定过程 单双目MATLAB 相机标定(一)单目摄像机标定 一.环境准备 MATLAB R2014a+windows7 6 ...
- Mastering Regular Expressions(精通正则表达式) 阅读笔记:前言
General Concept(一般概念) If you master the general concept of regular expressions, it's a short step to ...