mcpField
H
http2-header-impersonation

http2-header-impersonation

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

http2-header-impersonation について

http2-header-impersonation は、ブラウザーの HTTP/2 設定、疑似ヘッダーの順序、リクエストヘッダーを再現するセキュリティテスト用スキルです。自動化リクエストとブラウザートラフィックを見分けるシステムの調査に使えます。

主な機能

  1. 01HTTP/2 SETTINGS フレームの偽装
  2. 02疑似ヘッダー順序の再現
  3. 03ブラウザー固有ヘッダーの適用
  4. 04Chrome、Firefox、Safari iOS、OkHttp のプロファイル
  5. 05impit によるプロファイル設定

活用シーン

  1. 01HTTP/2 ベースのボット検出のテスト
  2. 02エンドポイントテストでのブラウザーリクエスト再現
  3. 03HTTP/2 プロファイルと TLS 偽装の併用

インストール

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

$npx skills add https://github.com/uphiago/recon-skills --skill http2-header-impersonation

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

詳細

HTTP/2 ヘッダーの偽装

HTTP/2 SETTINGS フレーム、疑似ヘッダーの順序、ブラウザー固有の HTTP ヘッダーを偽装し、プロトコルレベルで実際のブラウザーに一致させます。TLS フィンガープリント(ClientHello)と JavaScript フィンガープリントの間にある検出の隙間、つまりボット対策システムが分析する HTTP/2 接続のセットアップとヘッダー構造を対象とします。正確なウィンドウサイズ、ヘッダーリストの上限、ヘッダーの順序を含む Chrome、Firefox、Safari iOS、OkHttp(Android)のプロファイルに一致します。

使用する場面

  • TLS フィンガープリントは正しいのに、対象がブラウザー以外の HTTP 動作を検出する場合。
  • 対象が HTTP/2 固有の検出(SETTINGS フレーム分析、疑似ヘッダーの順序)を使用する場合。
  • ブラウザーに正確に合わせた sec-ch-ua、Accept、Accept-Encoding、Priority、sec-fetch-* ヘッダーが必要な場合。
  • モバイル API エンドポイントで Android OkHttp のヘッダープロファイルが必要な場合。
  • TLS の偽装と組み合わせて、ネットワークレベルで完全なブラウザープロファイルを作成する場合。

前提条件

  • python3 を備えた terminal。
  • pip install impit(パッチ適用済みの h2 ライブラリによる HTTP/2 偽装機能を含みます)。
  • または単体で使用する場合:以下のヘッダーリストを使って curl/httpx を手動で設定します。

クイック検出

# Check if target sends different responses based on HTTP headers
# Compare browser-like headers vs curl defaults

python3 -c "
import requests

# curl default headers
r1 = requests.get('https://target.com')
print(f'Default: {r1.status_code}')

# Browser-like headers
r2 = requests.get('https://target.com', headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[REDACTED_IP] Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.9',
    'Accept-Encoding': 'gzip, deflate, br, zstd',
    'sec-ch-ua': '\"Chromium\";v=\"142\", \"Google Chrome\";v=\"142\"',
    'sec-ch-ua-platform': '\"Windows\"',
    'sec-ch-ua-mobile': '?0',
})
print(f'Browser: {r2.status_code}')
"

手順

フェーズ 1 — impit によるブラウザープロファイル全体の設定

impit ライブラリは、単一のプロファイルから HTTP/2 SETTINGS、疑似ヘッダーの順序、HTTP ヘッダーを適用します。

from impit import Impit

# Chrome 142 — complete HTTP/2 + TLS + headers profile
impit = (
    Impit.builder()
    .with_fingerprint("chrome142")
    .build()
)

response = impit.get("https://target.com")
# Headers sent: sec-ch-ua, User-Agent, Accept, Accept-Encoding, Accept-Language,
#              sec-ch-ua-platform, sec-ch-ua-mobile, Priority, sec-fetch-*
# HTTP/2 SETTINGS: stream_window=6291456, conn_window=15663105, max_header=262144
# Pseudo-header order: :method :authority :scheme :path :protocol :status
フェーズ 2 — ヘッダーの手動設定

impit を使わずに curl/httpx を使用する場合は、ブラウザープロファイルに合わせてヘッダーを手動で設定します。

Chrome 142 デスクトップのヘッダー
curl --max-time 30 --connect-timeout 10 -sk "https://target.com" \
  -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/[REDACTED_IP] Safari/537.36" \
  -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" \
  -H "Accept-Language: en-US,en;q=0.9" \
  -H "Accept-Encoding: gzip, deflate, br, zstd" \
  -H "sec-ch-ua: \"Chromium\";v=\"142\", \"Google Chrome\";v=\"142\", \"Not?A_Brand\";v=\"99\"" \
  -H "sec-ch-ua-arch: \"x86\"" \
  -H "sec-ch-ua-bitness: \"64\"" \
  -H "sec-ch-ua-full-version-list: \"Chromium\";v=\"142.0.7444.176\", \"Google Chrome\";v=\"142.0.7444.176\", \"Not?A_Brand\";v=\"[REDACTED_IP]\"" \
  -H "sec-ch-ua-mobile: ?0" \
  -H "sec-ch-ua-model: \"\"" \
  -H "sec-ch-ua-platform: \"Windows\"" \
  -H "sec-ch-ua-platform-version: \"15.0.0\"" \
  -H "sec-ch-ua-wow64: ?0" \
  -H "sec-fetch-dest: document" \
  -H "sec-fetch-mode: navigate" \
  -H "sec-fetch-site: none" \
  -H "sec-fetch-user: ?1" \
  -H "Upgrade-Insecure-Requests: 1" \
  -H "Priority: u=0, i"
Firefox 144 デスクトップのヘッダー
curl --max-time 30 --connect-timeout 10 -sk "https://target.com" \
  -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:144.0) Gecko/20100101 Firefox/144.0" \
  -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" \
  -H "Accept-Language: en-US,en;q=0.5" \
  -H "Accept-Encoding: gzip, deflate, br, zstd" \
  -H "sec-ch-ua: \"Firefox\";v=\"144\", \"Not?A_Brand\";v=\"99\"" \
  -H "sec-ch-ua-mobile: ?0" \
  -H "sec-ch-ua-platform: \"Windows\"" \
  -H "sec-fetch-dest: document" \
  -H "sec-fetch-mode: navigate" \
  -H "sec-fetch-site: none" \
  -H "sec-fetch-user: ?1" \
  -H "TE: trailers" \
  -H "Upgrade-Insecure-Requests: 1" \
  -H "Priority: u=0, i"
Safari iOS 18 のヘッダー
curl --max-time 30 --connect-timeout 10 -sk "https://target.com" \
  -H "User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.7 Mobile/15E148 Safari/604.1" \
  -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \
  -H "Accept-Language: en-US,en;q=0.9" \
  -H "Accept-Encoding: gzip, deflate, br" \
  -H "sec-fetch-dest: document" \
  -H "sec-fetch-mode: navigate" \
  -H "sec-fetch-site: none"
OkHttp 4(Android)のヘッダー
curl --max-time 30 --connect-timeout 10 -sk "https://target.com" \
  -H "User-Agent: okhttp/4.12.0" \
  -H "Accept: application/json, text/plain, */*" \
  -H "Accept-Language: en-US,en;q=0.9" \
  -H "Accept-Encoding: gzip, deflate, br" \
  -H "Connection: Keep-Alive"
フェーズ 3 — HTTP/2 SETTINGS フレームの偽装

HTTP/2 SETTINGS フレームは接続のセットアップ中に送信されます。curl では設定できないため、impit またはパッチ適用済みの HTTP クライアントを使用します。

from impit import Impit

# Chrome HTTP/2 SETTINGS:
#   SETTINGS_MAX_CONCURRENT_STREAMS: 1000
#   SETTINGS_INITIAL_WINDOW_SIZE: 6291456
#   SETTINGS_MAX_HEADER_LIST_SIZE: 262144
# Firefox HTTP/2 SETTINGS:
#   SETTINGS_MAX_CONCURRENT_STREAMS: 125
#   SETTINGS_INITIAL_WINDOW_SIZE: 131072

impit = Impit.builder().with_fingerprint("chrome142").build()
response = impit.get("https://target.com")
フェーズ 4 — 疑似ヘッダーの順序

ブラウザーは特定の順序で HTTP/2 疑似ヘッダーを送信します。この順序は h2 ライブラリのレベルで適用されます。

ブラウザー疑似ヘッダーの順序
Chrome:method、:authority、:scheme、:path、:protocol、:status
Firefox:method、:path、:authority、:scheme、:protocol、:status
Safari iOS:method、:scheme、:authority、:path、:protocol、:status
OkHttp:method、:path、:authority、:scheme、:protocol、:status

**検出:**一部のリバースプロキシは、ブラウザーを識別するために疑似ヘッダーの順序を調べます。Firefox は :path を :authority より前に配置します。これは固有のフィンガープリントです。Safari は :scheme を 2 番目に配置し、これも識別要素になります。

フェーズ 5 — ヘッダーの優先順位

競合を避けるため、カスタムヘッダーはフィンガープリントのデフォルト値より優先されます。

impit = Impit.builder().with_fingerprint("chrome142").build()

# Custom headers WIN over fingerprint defaults for same header name
response = impit.get("https://target.com", headers={
    "Authorization": "Bearer custom-token",
    "X-Custom-Header": "value",
})
# Authorization is added; all fingerprint headers still applied for unset names
フェーズ 6 — Accept-Encoding の戦略

ブラウザーによって Accept-Encoding の値は大きく異なります。

ブラウザーAccept-Encoding
Chrome 142gzip, deflate, br, zstd
Chrome 100-116gzip, deflate, br
Firefoxgzip, deflate, br, zstd
Safari iOSgzip, deflate, br
OkHttp 4gzip, deflate, br

**検出:**一部の CDN は Accept-Encoding に応じて異なるコンテンツを返します(Brotli と zstd の対応状況によるプロファイリング)。エンコーディングの対応状況を対象のブラウザーに合わせてください。

注意点

  • curl では HTTP/2 SETTINGS フレームを偽装できません。 curl ベースのヘッダーは、HTTP/1.1 の対象、または HTTP/2 ではなく TLS フィンガープリントが主な懸念事項である場合にのみ使用してください。
  • HTTP/2 ではヘッダーの順序が重要です。 一部の検出システムは、ヘッダーの有無だけでなく、ヘッダーフィールドの順序も確認します。
  • sec-ch-ua は User-Agent と一致させる必要があります。 Firefox UA に Chrome のヘッダーを使用すると、不整合として検出されます。
  • sec-ch-ua の形式はバージョンによって異なります。 Chrome 100 以降では、Chrome 124 以降とは異なるブランド文字列が使われます。
  • TLS を一致させずにモバイルヘッダーを使用すると検出されます。 デスクトップの TLS フィンガープリントで Safari iOS のヘッダーを使用すると、検出されます。
  • カスタムヘッダーは大文字と小文字を区別せず重複排除されます。 カスタムヘッダーとして User-Agent を追加すると、フィンガープリントの User-Agent が上書きされます。

検証

  1. https://httpbin.org/headers を使用してテストし、送信されたすべてのヘッダーが意図したブラウザプロファイルと一致することを確認します。
  2. HTTP/2 SETTINGS を検証するには、https://nghttp2.org/httpbin/headers またはローカルの nghttp2 サーバーを使用します。
  3. browser-impostor と実際のブラウザのレスポンスサイズ/内容を比較します。同一のレスポンスであれば、ヘッダーが受け入れられていることを示します。
  4. Cloudflare の cf-ja4 ヘッダーを確認します。TLS とともに HTTP/2 フィンガープリントがエンコードされています。

関連するスキル

  • tls-fingerprint-impersonation — TLS ClientHello および JA3/JA4 フィンガープリントの偽装。
  • stealth-browser-launch — C++ フィンガープリントパッチを適用した、完全なブラウザー自動化。

コメント