mcpField
T
tls-fingerprint-impersonation

tls-fingerprint-impersonation

github.com/uphiagoセキュリティ1.3k44 回インストール8 週間前に更新
リポジトリ

tls-fingerprint-impersonation について

impit でブラウザーに合わせた TLS フィンガープリントを使い、HTTP リクエストを送るためのスキルです。フルブラウザーを使わずに、TLS の違いによる応答変化を調べる認可済みテストや API 調査に役立ちます。

主な機能

  1. 01ブラウザー TLS フィンガープリント設定
  2. 02JA3/JA4 の検証手順
  3. 03プロキシと Cookie の設定
  4. 04HTTP/3 とフォールバック設定
  5. 05Python、Node.js、Rust での利用

活用シーン

  1. 01TLS 指紋に関係するブロックの調査
  2. 02OkHttp プロファイルによるモバイル API のテスト
  3. 03ブラウザープロファイルごとの応答比較

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/uphiago/recon-skills --skill tls-fingerprint-impersonation

インストール後、Claude Code で/tls-fingerprint-impersonationを入力して読み込まれたか確認します。

詳細

TLS フィンガープリントの偽装

TLS ClientHello のパラメーター(暗号スイート、鍵交換グループ、署名アルゴリズム、拡張機能の順序)を偽装し、JA3/JA4 フィンガープリントレベルで実際のブラウザーに一致させます。パッチ適用済みの rustls を使用し、ブラウザーと同一の設定で TLS レイヤーを再構築します。ブラウザー以外の TLS スタックを検出する TLS フィンガープリント検出(Cloudflare、Akamai、F5)を回避します。Chrome 100-142、Firefox 128-144、Safari iOS 18、OkHttp 3-5(Android)を含む 20 種類のブラウザープロファイルに対応しています。

使用する場面

  • 正しい User-Agent ヘッダーを設定しても、curl/httpx への応答で 403 が返される、またはブロックされる場合。
  • Cloudflare や Akamai が TLS ClientHello をフィンガープリントしている場合(JA3/JA4 がブラウザーと一致しない)。
  • API の調査でモバイルアプリの偽装(Android 用の OkHttp フィンガープリント)が必要な場合。
  • フルブラウザーを起動せずに、TLS フィンガープリントのチェックを通過する高スループットな HTTP リクエストが必要な場合。
  • TLS フィンガープリントに応じて対象の動作が異なる場合(モバイル用とデスクトップ用のエンドポイント)。

前提条件

  • python3 を使用できる terminal。
  • Python:pip install impit(PyO3 経由で Rust ライブラリをラップします)。
  • または Node.js:npm install impit(ネイティブバインディング)。
  • または Rust:Cargo.toml で依存関係にパッチを適用した impit クレート。

迅速な検出

# Check if a target blocks non-browser TLS
curl --max-time 30 --connect-timeout 10 -sk https://target.com | head -1
# If 403, test with browser impersonation:
python3 -c "
from impit import Impit
impit = Impit.builder().with_fingerprint('chrome142').build()
r = impit.get('https://target.com').text
print(r[:200])
"

手順

フェーズ 1 — ブラウザープロファイルの選択

対象に適したフィンガープリントを選択します。

プロファイル用途主な特徴
chrome142最新のデスクトップ環境最新の Chrome、耐量子 KEX(X25519MLKEM768)、GREASE
chrome100レガシーシステム古い暗号スイート、鍵交換で GREASE を使用しない
firefox144Firefox デスクトップ異なる疑似ヘッダー順序、FFDHE グループ、SHA-1 署名
safari_ios18iOS モバイル3DES 暗号、署名アルゴリズムの重複、セッションチケットなし
okhttp4Android アプリBoringSSL プロファイル、GREASE なし、ECH なし、シンプルな暗号スイート
chrome124一般的なデフォルト最新環境との互換性と検出回避率のバランスが良好
from impit import Impit

# Chrome 142 (latest)
client = Impit.builder().with_fingerprint("chrome142").build()

# Firefox 144
client = Impit.builder().with_fingerprint("firefox144").build()

# Safari iOS 18 (mobile API endpoints)
client = Impit.builder().with_fingerprint("ios18").build()

# OkHttp 4 (Android app impersonation)
client = Impit.builder().with_fingerprint("okhttp4").build()
フェーズ 2 — 基本的なリクエスト
from impit import Impit

impit = (
    Impit.builder()
    .with_fingerprint("chrome142")
    .with_ignore_tls_errors(True)  # for self-signed certs during recon
    .with_http3()                   # HTTP/3 support
    .with_fallback_to_vanilla(True) # retry without fingerprint if blocked
    .build()
)

response = impit.get("https://target.com")
print(response.status_code)
print(response.headers)
print(response.text()[:500])
フェーズ 3 — プロキシの使用
impit = (
    Impit.builder()
    .with_fingerprint("chrome142")
    .with_proxy("http://user:pass@residential-proxy:8080")
    .with_default_timeout(15_000)  # 15 seconds in milliseconds
    .build()
)

response = impit.get("https://target.com/api/endpoint")
フェーズ 4 — カスタムヘッダー
# Custom headers are merged with fingerprint defaults
# Fingerprint headers have lower priority — custom headers win on conflict
response = impit.get(
    "https://target.com/api/v1",
    headers={
        "X-Forwarded-For": "[REDACTED_IP]",
        "Authorization": "Bearer token",
    }
)
フェーズ 5 — Cookie セッション
from impit.cookie import Jar

impit = (
    Impit.builder()
    .with_fingerprint("chrome142")
    .with_cookie_store(Jar())  # persistent cookie jar
    .build()
)

# Login
impit.post("https://target.com/login", json={
    "username": "admin", "password": "admin"
})

# Authenticated request — cookies preserved automatically
response = impit.get("https://target.com/dashboard")
フェーズ 6 — フィンガープリント選択ロジック

対象の特徴に基づいて選択します。

def select_fingerprint(target_url):
    """Auto-select browser fingerprint based on target."""
    if "mobile" in target_url or "api/v2" in target_url:
        return "ios18"
    elif "android" in target_url or "play.google" in target_url:
        return "okhttp4"
    elif target_url.startswith("https://"):
        return "chrome142"  # default for modern HTTPS
    return "chrome124"
フェーズ 7 — JA4 ハッシュの検証

TLS フィンガープリントが正しく機能していることを確認します。

# Test against a site that returns JA4 hash in response headers
python3 -c "
from impit import Impit
impit = Impit.builder().with_fingerprint('chrome142').build()
r = impit.get('https://cloudflare.com/cdn-cgi/trace')
print(r.text())
# Look for JA4 hash in trace output or response headers
"

ブラウザーフィンガープリントのリファレンス

ブラウザーごとの TLS 設定
機能Chrome 142Firefox 144Safari iOS 18OkHttp 4
TLS バージョン1.3 + 1.21.3 + 1.21.3 + 1.21.3 + 1.2
GREASE 暗号✅(位置 1)❌✅❌
GREASE 鍵交換✅(位置 1)❌✅❌
耐量子(MLKEM768)✅✅✅❌
FFDHE グループ❌✅(2048/3072)❌❌
SHA-1 署名❌✅✅(レガシー)✅(RSA のみ)
ECH GREASE✅✅❌❌
3DES 暗号❌❌✅❌
証明書圧縮BrotliZlib+Brotli+ZstdZlib❌
委任認証情報❌✅❌❌
セッションチケット✅✅❌✅
署名の重複❌❌✅(RsaPssRsaSha384)❌
ブラウザーごとの HTTP/2 設定
ブラウザーストリームウィンドウ接続ウィンドウ疑似ヘッダーの順序
Chrome6,291,45615,663,105:method :authority :scheme :path
Firefox131,07212,517,377:method :path :authority :scheme
Safari iOS2,097,15210,485,760:method :scheme :authority :path
OkHttp16,777,21616,777,216:method :path :authority :scheme
マルチパート境界形式
ブラウザー形式例
Chrome----WebKitFormBoundary + 英数字 16 文字----WebKitFormBoundaryx8fH3kLm9pQr2sTv
Firefox----geckoformboundary + 16 進数の u64 値----geckoformboundary3fa8c10e5d6b2904
OkHttpUUID v4550e8400-e29b-41d4-a716-446655440000

注意点

  • すべてのサイトが TLS フィンガープリントを使用しているわけではありません。 まず curl でテストしてください。動作する場合、TLS フィンガープリントは障害の原因ではありません。
  • フィンガープリントは User-Agent と一致している必要があります。 Firefox の UA ヘッダーと Chrome の TLS を組み合わせると検出されます。
  • HTTP/1.1 のみをサポートするサイトでは、HTTP/2 の偽装は使用されません。 with_http3() フラグが関係するのは、サイトが HTTP/3 をサポートしている場合のみです。
  • OkHttp 3 がサポートするのは TLS 1.2 のみです。 最新のサーバーの中には、TLS 1.2 接続を拒否するものがあります。
  • TLS フィンガープリントのキャッシュにより、最初のリクエストに最も時間がかかります。 CryptoProvider インスタンスはフィンガープリントごとにキャッシュされるため、2 回目以降のリクエストは高速です。
  • 通常のフォールバックでは、実際の TLS フィンガープリントが漏れる可能性があります。 ステルス性が重要な場合は、vanilla_fallback を無効にしてください。

検証

  1. https://www.howsmyssl.com/ または Cloudflare のトレースエンドポイントを使用して、TLS フィンガープリントが対象ブラウザーと一致していることを確認します。
  2. Cloudflare で保護されたサイトにアクセスするときは、レスポンスヘッダー cf-ja4 を確認します。
  3. ブラウザーフィンガープリントを使用した場合に、レスポンスステータスが 403 から 200 に変わることを確認します。通常の curl と比較してください。
  4. 複数のブラウザープロファイルでテストし、対象の検出を通過するものを見つけます。

関連スキル

  • http2-header-impersonation — HTTP/2 の疑似ヘッダー順序と SETTINGS フレームの一致。
  • stealth-browser-launch — JS を多用する対象向けの、C++ フィンガープリントパッチを使用した完全なブラウザー自動化。
  • humanize-automation — 振る舞いによる検出を回避する、人間らしいインタラクションパターン。

コメント