绕过TLS/akamai指纹护盾

admin 2023年5月2日01:01:37评论130 views字数 7084阅读23分36秒阅读模式


  • 前言

  • TLS指纹相关

    • 方法零:使用原生urllib

    • 方法一:使用其他成熟库🌟

    • 方法二:挂一层客户端代理

    • 方法三:修改requests底层代码

    • 什么是TLS指纹

    • 测试TLS指纹

    • 绕过TLS指纹

  • Akamai指纹相关(HTTP/2指纹)

    • 方法一:使用其他成熟库🌟

    • 什么是Akamai指纹

    • 测试Akamai指纹

    • 绕过Akamai指纹

  • 最终效果

  • 参考

前言

在之前的项目中,发现一些网站使用不同的客户端会得到不同的结果,比如使用浏览器访问正常没问题,但使用 python 写脚本或者 curl 请求就会被拦截,当时也尝试数据包 1:1 还原,但还是不能解决。

测试指纹拦截站点:https://ascii2d.net

最近拜读了师傅的文章《绕过 Cloudflare 指纹护盾[1]》,很有感触,感觉之前遇到的应该就是这个问题;之前写爬虫遇到类似这种指纹护盾(反爬机制),也都是尝试通过 selenium 模拟浏览器来绕过的,这一次也算是见了世面,学到了一些新的东西。

本次内容主要分为 2 部分,1 是绕过 TLS 指纹识别,2 是绕过 Akamai 指纹(HTTP/2 指纹)识别

TLS 指纹相关

什么是 TLS 指纹

TLS 指纹是一种用于识别和验证 TLS(传输层安全)通信的技术。

TLS 指纹可以通过检查 TLS 握手过程中使用的密码套件、协议版本和加密算法等信息来确定 TLS 通信的特征。由于每个 TLS 实现使用的密码套件、协议版本和加密算法不同,因此可以通过比较 TLS 指纹来判断通信是否来自预期的源或目标。

TLS 指纹可以用于检测网络欺骗、中间人攻击、间谍活动等安全威胁,也可以用于识别和管理设备和应用程序。

TLS 指纹识别原理(ja3 算法):https://github.com/salesforce/ja3

绕过TLS/akamai指纹护盾
ja3算法

测试 TLS 指纹

测试一下不同客户端之间的指纹差异(ja3_hash)

深入分析的话可以用 wireshark 抓 TLS 包进行对比分析

测试网站:https://tls.browserleaks.com/json

  • CURL v7.79.1
绕过TLS/akamai指纹护盾
curl v7.79.1
  • CURL 7.68.0
绕过TLS/akamai指纹护盾
CURL 7.68.0
  • Chrome 112.0.5615.137(正式版本) (x86_64)
绕过TLS/akamai指纹护盾
Chrome 112.0.5615.137(正式版本) (x86_64)
  • Burp Chromium 103.0.5060.114(正式版本) (x86_64)
绕过TLS/akamai指纹护盾
Burp Chromium
  • Python 2.11.1
绕过TLS/akamai指纹护盾
Python 2.11.1

可见不同的客户端都存在区别,针对最后一个 python 的 ja3_text 做一个简单的说明

  • 第一个值 771:表示 JA3 版本,即用于生成指纹的 JA3 脚本的版本。
  • 第二个值 4866-4867-4865-49196-49200-49195-49199-163-159-162-158-49327-49325-49188-49192-49162-49172-49315-49311-107-106-57-56-49326-49324-49187-49191-49161-49171-49314-49310-103-64-51-50-52393-52392-49245-49249-49244-49248-49267-49271-49266-49270-52394-49239-49235-49238-49234-196-195-190-189-136-135-69-68-157-156-49313-49309-49312-49308-61-60-53-47-49233-49232-192-186-132-65-255:表示加密套件,即客户端可以支持的加密算法。
  • 第三个值 0-11-10-35-22-23-13-43-45-51-21:表示支持的压缩算法。
  • 第四个值 29-23-30-25-24:表示支持的 TLS 扩展,如 SNI。
  • 第五个值 0-1-2:表示支持的 elliptic curves,即椭圆曲线算法。

绕过 TLS 指纹

既然都知道原理了,那么绕过就是伪造成合法客户端就行,简单来说,就是伪装 ja3_text 值,让其不被拦截即可,以修改支持的加密算法为主。

方法零:使用原生 urllib

import urllib.request
import ssl

url = 'https://tls.browserleaks.com/json'
req = urllib.request.Request(url)
resp = urllib.request.urlopen(req)
print(resp.read().decode())

# 伪造TLS指纹
context = ssl.create_default_context()
context.set_ciphers("ECDHE-RSA-AES128-GCM-SHA256+ECDHE+AESGCM")

url = 'https://tls.browserleaks.com/json'
req = urllib.request.Request(url)
resp = urllib.request.urlopen(req, context=context)
print(resp.read().decode())
绕过TLS/akamai指纹护盾
urllib

方法一:使用其他成熟库 🌟

可以试试`curl_cffi`[2]这个库,主打的就是模拟各种指纹

Python binding for curl-impersonate via cffi. A http client that can impersonate browser tls/ja3/http2 fingerprints.

除了这个,也可以去尝试下 pyhttpx、pycurl

pip install --upgrade curl_cffi

测试代码:

from curl_cffi import requests

print("edge99:", requests.get("https://tls.browserleaks.com/json", impersonate="edge99").json().get("ja3_hash"))
print("chrome110:", requests.get("https://tls.browserleaks.com/json", impersonate="chrome110").json().get("ja3_hash"))
print("safari15_3:", requests.get("https://tls.browserleaks.com/json", impersonate="safari15_3").json().get("ja3_hash"))

# 支持代理
proxies = {"https""http://localhost:7890"}
r = requests.get("https://tls.browserleaks.com/json", impersonate="chrome101", proxies=proxies)
print(r.json().get("ja3_hash"))

效果如下:

绕过TLS/akamai指纹护盾
curl_cffi

支持伪造的浏览器列表如下:

# curl_cffi.requests.session.BrowserType
class BrowserType(str, Enum):
    edge99 = "edge99"
    edge101 = "edge101"
    chrome99 = "chrome99"
    chrome100 = "chrome100"
    chrome101 = "chrome101"
    chrome104 = "chrome104"
    chrome107 = "chrome107"
    chrome110 = "chrome110"
    chrome99_android = "chrome99_android"
    safari15_3 = "safari15_3"
    safari15_5 = "safari15_5"

方法二:挂一层客户端代理

这里是用 burp 去完成 TLS 认证过程,前提是 burp 的 TLS 指纹不会被拦截。

绕过TLS/akamai指纹护盾
burp

Burp 的 TLS 指纹可通过如下方式进行修改

绕过TLS/akamai指纹护盾
修改burp TLS指纹

方法三:修改 requests 底层代码

requests 库的 SSL/TLS 认证是基于 urllib3 库实现的,所以改底层就是改 urllib3 的代码

查看urllib3安装位置

python3 -c "import urllib3; print(urllib3.__file__)"

/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/__init__.py

修改相关 SSL 代码,文件地址一般为site-packages/urllib3/util/ssl_.py

DEFAULT_CIPHERS = ":".join(
    [
        "ECDHE+AESGCM",
        "ECDHE+CHACHA20",
        "DHE+AESGCM",
        "DHE+CHACHA20",
        "ECDH+AESGCM",
        "DH+AESGCM",
        "ECDH+AES",
        "DH+AES",
        "RSA+AESGCM",
        "RSA+AES",
        "!aNULL",
        "!eNULL",
        "!MD5",
        "!DSS",
    ]
)

操作的空间很多,像我这种脚本小子一般就以删除和调换位置为主,对比如下:

绕过TLS/akamai指纹护盾
vs

Akamai 指纹相关(HTTP/2 指纹)

什么是 Akamai 指纹

Akamai Fingerprint 是 Akamai Technologies 公司提供的一种防止恶意机器人和自动化攻击的技术,它基于浏览器指纹识别技术。

浏览器指纹是一种用于识别 Web 浏览器的技术,它通过收集并分析浏览器的各种属性和行为,如用户代理字符串、插件、字体、语言、屏幕分辨率等信息来识别浏览器。浏览器指纹在互联网安全领域得到了广泛应用,可以用于检测和识别恶意机器人、欺诈行为、网络钓鱼等。

Akamai Fingerprint 利用了浏览器指纹技术,将其与其他安全技术结合起来,以识别和拦截自动化攻击。它可以在不影响用户体验的情况下,对访问网站的浏览器进行识别和验证,防止自动化攻击、账户滥用和数据泄露等安全问题。


可以在 https://tls.peet.ws/api/all 看到详细的指纹,主要有如下内容

绕过TLS/akamai指纹护盾
HTTP2

指纹为:1:65536,2:0,3:1000,4:6291456,6:262144|15663105|0|m,a,s,p

  1. 1:65536: HEADER_TABLE_SIZE,即头部表大小为 64KB,指的是用于存储请求头和响应头的大小,它是可以调整的。这个字段指明了使用 64KB 的头部表大小。
  2. 2:0: HTTP2_VERSION,指示此请求使用的 HTTP/2 版本。0 表示 H2,表示启用了 HTTP/2 协议。
  3. 3:1000: MAX_CONCURRENT_STREAMS,即最大并发流数,指的是在任何给定时间内,客户端和服务器端可以并行发送的最大请求数量。这个字段指明了最大并发流数为 1000。
  4. 4:6291456: INITIAL_WINDOW_SIZE,即初始流窗口大小,指的是初始的流控窗口大小,即客户端可以发送的最大字节数量。这个字段指明了初始流窗口大小为 6MB(即 6291456 字节)。
  5. 6:262144|15663105|0|m,a,s,p: 以竖杠“|”分隔。具体含义如下:
    • 6:262144: max header list size,即动态表大小,指的是接收方可以接收的最大 HTTP 头部大小。这个字段指明了动态表大小为 256KB(即 262144 字节)。
    • 15663105: WINDOW_UPDATE,表示收到了WINDOW_UPDATE帧,并且窗口大小增加了 15663105 个字节。
    • 0: no compression,表示不启用头部压缩。
    • : 开头的 header 的第一个字符参与编码,多个逗号隔开。如 :method:authority:scheme:path 编码为 m,a,s,p

可在Passive Fingerprinting of HTTP/2 Clients[3]中查看详细细节

测试 Akamai 指纹

测试网站:https://tls.browserleaks.com/json

  • CURL
绕过TLS/akamai指纹护盾
curl
  • Chrome
绕过TLS/akamai指纹护盾
chrome
  • Python
绕过TLS/akamai指纹护盾
python

可以看到用 python requests 直接为空,爬虫小子直接被拦截在外了。

绕过 Akamai 指纹

伪造指纹中特定的字段即可。

方法一:使用其他成熟库 🌟

还是刚才的`curl_cffi`[4]这个库,因为这个库主打的就是模拟各种指纹

Python binding for curl-impersonate via cffi. A http client that can impersonate browser tls/ja3/http2 fingerprints.

pip install --upgrade curl_cffi

测试代码:

from curl_cffi import requests

print("edge99:", requests.get("https://tls.browserleaks.com/json", impersonate="edge99").json().get("akamai_hash"))
print("chrome110:", requests.get("https://tls.browserleaks.com/json", impersonate="chrome110").json().get("akamai_hash"))
print("safari15_3:", requests.get("https://tls.browserleaks.com/json", impersonate="safari15_3").json().get("akamai_hash"))

效果如下:

绕过TLS/akamai指纹护盾
akamai

支持伪造的浏览器列表如下:

# curl_cffi.requests.session.BrowserType
class BrowserType(str, Enum):
    edge99 = "edge99"
    edge101 = "edge101"
    chrome99 = "chrome99"
    chrome100 = "chrome100"
    chrome101 = "chrome101"
    chrome104 = "chrome104"
    chrome107 = "chrome107"
    chrome110 = "chrome110"
    chrome99_android = "chrome99_android"
    safari15_3 = "safari15_3"
    safari15_5 = "safari15_5"

最终效果

https://ascii2d.net 存在 CloudFlare 的指纹护盾,拒绝爬虫,测试一下。

直接 CURL,被拦截

绕过TLS/akamai指纹护盾
banned

绕过

from curl_cffi import requests

req = requests.get("https://ascii2d.net", impersonate="chrome110")
print(req.text)

可正常获取页面

绕过TLS/akamai指纹护盾
normal

参考

  • 绕过 Cloudflare 指纹护盾[5]

  • SSL 指纹识别和绕过[6]

  • HTTP2 指纹识别(一种相对不为人知的网络指纹识别方法)[7]

参考资料

[1]

绕过 Cloudflare 指纹护盾: https://sxyz.blog/bypass-cloudflare-shield/

[2]

curl_cffi: https://github.com/yifeikong/curl_cffi

[3]

Passive Fingerprinting of HTTP/2 Clients: https://www.blackhat.com/docs/eu-17/materials/eu-17-Shuster-Passive-Fingerprinting-Of-HTTP2-Clients-wp.pdf

[4]

curl_cffi: https://github.com/yifeikong/curl_cffi

[5]

绕过 Cloudflare 指纹护盾: https://sxyz.blog/bypass-cloudflare-shield/

[6]

SSL 指纹识别和绕过: https://ares-x.com/2021/04/18/SSL-%E6%8C%87%E7%BA%B9%E8%AF%86%E5%88%AB%E5%92%8C%E7%BB%95%E8%BF%87/

[7]

HTTP2 指纹识别(一种相对不为人知的网络指纹识别方法): https://www.cnblogs.com/yudongdong/p/16654636.html


原文始发于微信公众号(初始安全):绕过TLS/akamai指纹护盾

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月2日01:01:37
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   绕过TLS/akamai指纹护盾https://cn-sec.com/archives/1698054.html

发表评论

匿名网友 填写信息