红队开发:利用Golang突破ja3检测

admin 2025年3月10日22:44:35评论20 views字数 1984阅读6分36秒阅读模式

红队开发:利用Golang突破ja3检测

关于什么是ja3以及ja3如何生成的等基础知识,可以自行谷歌学习,几个关键点:

  1. 1. 可以理解为ja3就是tls的指纹。
  2. 2. 同一平台下同客户端默认情况下,这个东西是固定的。
  3. 3. 默认发起请求时,无法更改,需要一些手段。

一般自己写一些网络请求的功能,一般会用一些库啊之类的,然后你的代码最终编译运行,平台基本也就那些固定的,基本上是符合上面的模式,比如之前有针对Cobaltstrike的JA3指纹检测,所以有时候还是可以搞一搞这方面的对抗检测。

如何查看ja3

1.通过wireshark

红队开发:利用Golang突破ja3检测
红队开发:利用Golang突破ja3检测

2.通过代码验证

package main

import (
"crypto/tls"
"fmt"
"io/ioutil"
"net/http"
)

funcreq() {
    client := &http.Client{
        Transport: &http.Transport{
            TLSClientConfig: &tls.Config{
                InsecureSkipVerify: true,
            },
        },
    }
    req, _ := http.NewRequest("GET""https://ja3er.com/json"nil)
    resp, err := client.Do(req)
if err != nil {
        fmt.Println(err)
    }

defer resp.Body.Close()
    content, err := ioutil.ReadAll(resp.Body)
if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(content))
}
/// 能不能用不知道,by gpt

如何修改

如果你需要自定义 JA3 指纹,可以考虑以下几种方案:

- 使用第三方库 utls
uTLS 是一个对标准库 TLS 的封装,允许你修改 ClientHello 的各个部分。通过 uTLS,你可以模拟其他客户端(例如浏览器)的 ClientHello,从而改变 JA3 指纹。

- 修改标准库或实现自定义 TLS
理论上,你可以 fork 标准库的 crypto/tls 模块并修改 ClientHello 构造逻辑,但这将带来维护上的额外成本,而且很容易与 Go 语言后续版本不兼容。

- 使用代理或中间件
另外一种方法是通过在 TLS 层前加一层代理,将 ClientHello 进行修改后再转发给目标服务器,不过这通常比使用 uTLS 更复杂。

//上述方案byGPT

其实我们如果自己想在代码中用起来的话,直接用三方库就好了:

  • • https://github.com/CUCyber/ja3transport
  • • https://github.com/Danny-Dasilva/CycleTLS
  • • https://github.com/refraction-networking/utls

挑一个自己想用的,如果你想要深度定制,那你就按gpt说的第二条,自己去改。

其实上述库中的方案,还是中转了一下tls通信,在其中修改了自定义的ja3,有兴趣可以看看代码学习一下。

第一个库感觉用起来可能最方便一点(其实里面是封装了别的库):

import(
  tls "github.com/refraction-networking/utls"
)
....
....
    config := tls.Config{
        InsecureSkipVerify: true,
    }
    ja3string := "771,49195-49199-49196-49200-52393-52392-49161-49171-49162-49172-49170-4865-4866-4867,5-10-11-13-65281-23-18-43-51,29-23-24-25,0"
    tr, _ := ja3transport.NewTransportWithConfig(ja3string, &config)
    client := &http.Client{
        Transport: tr,
    }
    req, _ := http.NewRequest("GET""https://192.168.8.1"nil)
    resp, err := client.Do(req)
if err != nil {
        fmt.Println(err)
    }

defer resp.Body.Close()
    content, err := ioutil.ReadAll(resp.Body)
if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(content))
    ....
    ....

推荐阅读

这是一个纯粹,开放,前沿的技术交流社区,成员主要有互联网大厂安全部门任职的成员,乙方红队专家,以及正在学习入门的小白等,目前主题主要以红队研发为主(有经验的都知道是什么意思),以及其他涉及到红队进攻侵入性技术,如果你想学习技术,认识不同的人或者寻求一个机会之类的,可以来看看👇👇👇

红队开发:利用Golang突破ja3检测
红队开发:利用Golang突破ja3检测

欢迎加入交流圈

扫码获取更多精彩

红队开发:利用Golang突破ja3检测
红队开发:利用Golang突破ja3检测
红队开发:利用Golang突破ja3检测

原文始发于微信公众号(黑晶):红队开发:利用Golang突破ja3检测

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年3月10日22:44:35
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   红队开发:利用Golang突破ja3检测https://cn-sec.com/archives/3825231.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息