Python 与JA3 库的应用

发布于:2025-07-17 ⋅ 阅读:(17) ⋅ 点赞:(0)

Python JA3 库在网络安全、流量分析、爬虫开发等领域有广泛应用,以下是几个典型场景:

1. 识别网络中的设备类型

通过分析 TLS 握手的 JA3 指纹,可以识别客户端使用的浏览器、操作系统或设备类型。例如:

from ja3 import parse_ja3_string, generate_ja3_digest

# 解析 JA3 字符串并生成指纹
ja3_string = "771,4865-4866-4867-49195-49199-52393-52392-49196-49200-49162-49161-49171-49172-51-57-47-53,0-23-65281-10-11-35-16-5-51-43-13-45-28-21,29-23-24-25-256-257,0"
digest = generate_ja3_digest(ja3_string)
print(f"JA3 指纹: {digest}")  # 输出 MD5 哈希值

# 通过预定义指纹库匹配设备类型
device_mapping = {
    "297025c9d1b07a1f3f3c5a35f8d82d0": "Chrome 91 on Windows 10",
    "d41d8cd98f00b204e9800998ecf8427e": "Firefox 89 on macOS",
}
device_type = device_mapping.get(digest, "Unknown")
print(f"设备类型: {device_type}")

2. 检测异常或恶意流量

将捕获的 JA3 指纹与已知恶意软件的指纹库比对,识别潜在威胁:

# 模拟从网络流量中提取 Client Hello 数据包并计算 JA3
def detect_malicious_traffic(packet):
    ja3_string = extract_ja3_from_packet(packet)  # 自定义函数解析数据包
    if not ja3_string:
        return False
    
    digest = generate_ja3_digest(ja3_string)
    
    # 已知的恶意软件 JA3 指纹库
    malicious_ja3 = {
        "5a3c9d1b07a1f3f3c5a35f8d82d029": "Emotet 恶意软件",
        "d8cd98f00b204e9800998ecf8427e4": "Mirai 僵尸网络",
    }
    
    if digest in malicious_ja3:
        print(f"⚠️ 检测到恶意流量! 指纹: {digest}, 类型: {malicious_ja3[digest]}")
        return True
    return False

3. 反爬虫与反欺诈

网站可以通过分析 JA3 指纹识别爬虫或自动化工具:

from flask import request

def block_bots():
    # 获取客户端 IP 和 JA3 指纹
    client_ip = request.remote_addr
    ja3_fingerprint = request.headers.get("X-JA3-Fingerprint")  # 假设前端已发送
    
    # 检查是否为已知爬虫指纹
    bot_ja3_signatures = {
        "3a7d9e8c7b6a5f4e3d2c1b0a987654": "常见爬虫框架",
        "1234567890abcdef1234567890abcdef": "可疑自动化工具",
    }
    
    if ja3_fingerprint in bot_ja3_signatures:
        return "访问被拒绝", 403
    
    return "欢迎访问", 200

4. 模拟特定浏览器行为

爬虫开发中,可以通过生成特定的 JA3 指纹伪装成真实浏览器:

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.ssl_ import create_urllib3_context

# 自定义 SSL 上下文,模拟 Chrome 的 JA3 指纹
class ChromeAdapter(HTTPAdapter):
    def init_poolmanager(self, *args, **kwargs):
        context = create_urllib3_context(
            ciphers="ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384",
            ssl_version=ssl.PROTOCOL_TLSv1_3,  # 模拟 Chrome 支持的 TLS 版本
        )
        kwargs['ssl_context'] = context
        return super(ChromeAdapter, self).init_poolmanager(*args, **kwargs)

# 使用自定义适配器发送请求
session = requests.Session()
session.mount('https://', ChromeAdapter())
response = session.get('https://example.com')

5. 流量监控与分析

结合网络抓包工具(如 Scapy)实时分析 TLS 流量:

from scapy.all import *
from ja3 import *

def packet_callback(packet):
    if packet.haslayer("TCP") and packet.haslayer("Raw"):
        payload = packet["Raw"].load
        # 检查是否为 TLS Client Hello 包
        if payload.startswith(b'\x16\x03'):
            try:
                ja3_dict = parse_tls_payload(payload)
                if ja3_dict:
                    ja3_string = dict_to_ja3_string(ja3_dict)
                    digest = generate_ja3_digest(ja3_string)
                    print(f"源 IP: {packet['IP'].src}, JA3 指纹: {digest}")
            except Exception as e:
                pass

# 开始抓包
sniff(filter="tcp port 443", prn=packet_callback, store=0)

6. 构建 JA3 指纹数据库

存储和管理不同客户端的 JA3 指纹,用于后续比对:

import sqlite3

# 创建 JA3 指纹数据库
def create_ja3_db():
    conn = sqlite3.connect('ja3_fingerprints.db')
    c = conn.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS fingerprints
                 (id INTEGER PRIMARY KEY, 
                 digest TEXT UNIQUE, 
                 device_type TEXT,
                 first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')
    conn.commit()
    conn.close()

# 添加新指纹
def add_fingerprint(digest, device_type):
    conn = sqlite3.connect('ja3_fingerprints.db')
    c = conn.cursor()
    try:
        c.execute("INSERT INTO fingerprints (digest, device_type) VALUES (?, ?)", 
                 (digest, device_type))
        conn.commit()
    except sqlite3.IntegrityError:
        # 指纹已存在,更新信息
        pass
    conn.close()

总结

JA3 指纹技术通过分析 TLS 握手的特征参数,为网络通信提供了一种可靠的身份标识方式。在 Python 中,你可以利用 ja3 库结合网络抓包、Web 开发或安全工具,实现设备识别、恶意流量检测、反爬虫等多种功能。


网站公告

今日签到

点亮在社区的每一天
去签到