我之前的文章介绍了SSL指纹识别

https://mp.weixin.qq.com/s/BvotXrFXwYvGWpqHKoj3uQ

很多人来问我BYPass的方法

主流的BYPASS方法有两大类:

  1. 使用定制ja3的网络库 go在这块的库比较流行(比如go的库requests还有cycletls) 缺点在于,就是得用go语言开发(cycletls有nodejs的但是也是开了一个go语言的一个websocket)

  2. 魔改curl,最有名的就是curl-impersonate 对应win版本的 https://github.com/depler/curl-impersonate-win 缺点就是编译复杂,使用方式上,得用包装curl的第三方库,用的多就是python的pycurl 其他语言的比较少

正好五一有时间,站在巨人们的肩膀上我用go语言开发了一个代理服务.

只需要设置这个代理服务,就可以自定义ja3参数

这样任何语言都可以直接用了,而且只需要加一个webproxy即可

具体效果可以往下看

image

解压后如上图,包含2个文件

  • ja3proxy.exe ja3proxy是go开发的一个控制台程序
  • localhost_root.pfx 本地证书

(测试加我要)

为了方便本机测试,先安装localhost_root.pfx证书, (如果不安装证书,也可以运行,只不过你需要将请求忽略ssl verify)

证书密码为123456

image

选择位置为:受信任的根证书颁发机构

image

安装成功后,使用如下命令 运行ja3proxy.exe


ja3proxy.exe -pfxFile=localhost_root.pfx -pfxPwd=123456

image

支持的参数共有如下:

  • pfxFile (pfx类型证书)
  • pfxPwd (pfx证书的密码)
  • authName 如果你要开启ja3proxy代理服务的basicauth认证,可以设置
  • authPwd (同上)
  • httpPort (ja3proxy代理的http端口,默认为8080)
  • httpsPort (ja3proxy代理的https端口,默认为8443)
  • certFile 非pfx类型证书可以设置
  • keyFile 同上

ja3proxy运行成功后,测试代码如下:



var proxy = new WebProxy
{
    // 这就是我们的ja3proxy
 Address = new Uri($"http://localhost:8080")
}; var httpClientHandler = new HttpClientHandler
{
 Proxy = proxy,
}; // 因为我们再上面把证书添加到本机受信任了 所以这行代码不需要,如果你不操作受信任证书的话,就需要
//httpClientHandler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator; var client2 = new HttpClient(handler: httpClientHandler, disposeHandler: true); // 设置ja3指纹
client2.DefaultRequestHeaders.Add("tls-ja3","771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,17513-10-18-11-51-13-27-0-35-65281-43-16-45-5-23-21,29-23-24,0");
// 设置ja3proxy执行请求的超时
client2.DefaultRequestHeaders.Add("tls-timeout","10");
// 设置ja3proxy执行请求用代理,设置后请求目标服务器拿到的就是代理ip
// client2.DefaultRequestHeaders.Add("tls-proxy","http://252.45.26.333:5543"); // 设置当前请求的useragent
client2.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36"); var result = await client2.GetStringAsync("https://kawayiyi.com/tls");
Console.WriteLine(result);

执行后,校验ja3一致

{
  "sni": "kawayiyi.com",
  "tlsVersion": "Tls13",
  "tcpConnectionId": "0HMQ8N2PQCRQE",
  "random": "AwN2jHvxe/TKafrfmZ1KG2JWrD7u6M1N4dpeIGdYQwA=",
  "sessionId": "FvNiwCLizsA2JZt0/8865tX2A5VsfbgjlCu4Qg4jPjg=",
  "tlsHashOrigin": "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,17513-10-18-11-51-13-27-0-35-65281-43-16-45-5-23-21,29-23-24,0",
  "tlsHashMd5": "05556c7568c3d3a65c4e35d42f102d78",
  "cipherList": [
    "TLS_AES_128_GCM_SHA256",
    "TLS_AES_256_GCM_SHA384",
    "TLS_CHACHA20_POLY1305_SHA256",
    "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
    "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
    "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
    "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
    "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
    "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
    "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
    "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
    "TLS_RSA_WITH_AES_128_GCM_SHA256",
    "TLS_RSA_WITH_AES_256_GCM_SHA384",
    "TLS_RSA_WITH_AES_128_CBC_SHA",
    "TLS_RSA_WITH_AES_256_CBC_SHA"
  ],
  "extentions": [
    "extensionApplicationSettings",
    "supported_groups",
    "signed_certificate_timestamp",
    "ec_point_formats",
    "key_share",
    "signature_algorithms",
    "compress_certificate",
    "server_name",
    "session_ticket",
    "renegotiation_info",
    "supported_versions",
    "application_layer_protocol_negotiation",
    "psk_key_exchange_modes",
    "status_request",
    "extended_master_secret",
    "padding"
  ],
  "supportedgroups": [
    "X25519",
    "CurveP256",
    "CurveP384"
  ],
  "ecPointFormats": [
    "uncompressed"
  ],
  "proto": "HTTP/2",
  "h2": {
    "SETTINGS": {
      "1": "65536",
      "3": "1000",
      "4": "6291456",
      "5": "16384",
      "6": "262144"
    },
    "WINDOW_UPDATE": "15663105",
    "HEADERS": [
      ":method",
      ":authority",
      ":scheme",
      ":path"
    ]
  },
  "user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36",
  "clientIp": "103.219.192.197"
}

nodejs测试

const request = require('request');

const options = {
    url:'https://kawayiyi.com/tls',
    method: 'GET',
    headers: {
        'tls-ja3':'771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,17513-10-18-11-51-13-27-0-35-65281-43-16-45-5-23-21,29-23-24,0',
        'tls-timeout':'10',
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36', // 设置请求头中的 User-Agent
    },
    proxy: 'http://localhost:8080',
    strictSSL:false
}; request.get(options, (error, response, body) => {
    if (error) {
        console.error(error);
        return;
    }
    console.log('body:', body);
});

image

h2的header顺序:m,a,s,p 和chrome保持一致

原理

image

ja3proxy(是一个中间人)接管你的请求,然后自己去目标建立tls,clienthello就用你指定的ja3参数

突破tls/ja3新轮子的更多相关文章

  1. fir.im Weekly - 从 iOS 10 SDK 新特性说起

    从 iOS 7 翻天覆地的全新设计,iOS 8 中 Size Classes 的出现,应用扩展,以及 Cloud Kit 的加入,iOS 9 的分屏多任务特性,今年的 WWDC iOS 10 SDK ...

  2. 总结一下公司项目使用各种较新的前端技术和 Api 的一些经验。

    关于 ES6: 需要注意 ES6 的一些特性和 API 是需要一个 200k 的 Polyfill 才能得到支持的,特性如 for ... of 循环,generator,API 如 Object.a ...

  3. 安装cloudermanager时如何正确Configuring TLS Security for Cloudera Manager

    不多说,直接上干货! 参考官网 https://www.cloudera.com/documentation/enterprise/5-2-x/topics/cm_sg_config_tls_secu ...

  4. 谷歌 AI 负责人谈2020 年机器学习趋势:多任务和多模态会有大突破

    ​在上周加拿大温哥华举行的NeurIPS会议上,机器学习成为了中心议题. 来自世界范围内约1.3万名研究人员集中探讨了神经科学.如何解释神经网络输出以及人工智能如何帮助解决现实世界中的重大问题等焦点话 ...

  5. SHA-1退休:数千万用户通向加密网站之路被阻

    ​ Facebook和Cloudflare警告道:上千万用户将无法访问只使用SHA-2签名证书的HTTPS网站.2016年-2017年是SHA-1算法的缓冲期.2017年开始CA机构将不能颁发含有sh ...

  6. 手把手教你学Dapr - 2. 必须知道的概念

    Sidecar 边车 Dapr API提供Http和gRPC两种通讯方式. 运行方式则可以是容器也可以是进程(Windows开发推荐使用Self Hosted,后续会解释). 这样的好处是与运行环境无 ...

  7. Bootstrap 4-alpha 初体验

    What is Bootstrap? 第一句话就是废话了,作为新时代有理想有节操的开发人员无人不知无人不晓.可能就是熟悉程度因为各种原因不尽相同,有人只是知道他大概是个什么东西,有些人可能基本可以使用 ...

  8. 【转】2016/2017 Web 开发者路线图

    链接:知乎 [点击查看大图] 原图来自LearnCodeAcademy最火的视频,learncode是YouTube上最火的Web开发教学频道,介绍包括HTML/CSS/JavaScript/Subl ...

  9. .NET轻量级RPC框架:Rabbit.Rpc

    最近准备写一个.NET的管理平台应用在公司,由于存在大量的Client => Server,Server => Client的请求需求在加上之前一直接触了解过RpcClient组件的开发, ...

  10. AnguarJS测试的实施步骤整理

    最近开发用到了AngularJS,据说目前大型系统都用这个作为前端.最近参与的一个项目,web部分重度使用了AngularJS,整个前端架构有组织有纪律.所谓的有纪律就是说,有比较完善的测试用例,用上 ...

随机推荐

  1. SAP B1 增加或删除单据,或者是新增修改BOM清单,报错‘出现内部错误时’,一般是控制过程 SBO_SP_TransactionNotification 里面的代码有问题,执行不下去了,因此一行行检查SQL代码,一般就能发现错误所在。

    SAP B1 增加或删除单据,或者是新增修改BOM清单,报错'出现内部错误时',一般是控制过程 SBO_SP_TransactionNotification 里面的代码有问题,执行不下去了,因此一行行 ...

  2. python-GUI-tkinter之excel密码破解工具

    python gui 之熟悉tkinter部分控件使用.一个简单的excel暴力密码破解,核心很简单,基本就是一个函数外面加了GUI,写的很啰嗦,希望大家可以在优化改良下,主要是为了再熟悉下tkint ...

  3. Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hive.DELETEME1643159643943' doesn't exist

    Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'hive.DELETEME1643159643 ...

  4. sql函数的用法

    1.codename 作为翻译函数 CREATE DEFINER=`root`@`localhost` FUNCTION `codename`(`sys_code` varchar(20),`stat ...

  5. .Net中跨域问题的解决方案

    开发中前端与后端完全分离并分开发布,遇到跨域问题,一通百度之后,解决方案如下: 把下面的代码放在web.config文件中的 System.WebServer 节点下 <httpProtocol ...

  6. 学习记录--C++多态性简答+编程题

    #include<iostream> #include<string> //双目运算符:运算符作用域两个操作数 //定义一个复数类,重载"+",作为复数类的 ...

  7. Centos6、7修改主机名

    centos6 1.临时修改 hostname node1 2.永久生效 , 修改/etc/sysconfig/network 文件 HOSTNAME=node1 3.修改 /etc/hosts文件 ...

  8. Python学习笔记--循环的知识以及应用

    while循环 代码: 结果: 案例:求1-100的和 实现: 案例:while循环猜数字 实现: while循环的嵌套使用 案例:打印九九乘法表 (注意:要是想要输出不换行,代码可以这样写:prin ...

  9. ElasticSearch的常用API

    ElasticSearch的常用API 1.在服务器上怎么查ES的信息 # 通过使用_cat可以查看支持的命令 ### curl localhost:9200/_cat eg: /_cat/alloc ...

  10. Java 遍历方式

    一.遍历方式 迭代器 增强for循环 普通for循环 二.使用 迭代器: public class IteratorMethod { public static void main(String[] ...