Curl-impersonate: 主要ブラウザを模倣できる特別なcurlビルド
(github.com/lwthiker)curl-impersonate
特定のブラウザを模倣できる特別な curl のビルドで、Chrome、Edge、Safari、Firefox を模倣できます。curl-impersonate は実際のブラウザと同一の TLS および HTTP ハンドシェイクを実行できます。コマンドラインツールとして使用することも、ライブラリとして統合することも可能です。
なぜ必要か?
- HTTP クライアントが TLS Web サイトと通信するとき、最初に TLS ハンドシェイクを行います。このときの最初のメッセージを Client Hello と呼びます。
- ほとんどの HTTP クライアントやライブラリが生成する Client Hello メッセージは、実際のブラウザと大きく異なります。
- サーバーが HTTP/2 を使用する場合、TLS ハンドシェイクに加えて HTTP/2 ハンドシェイクも必要で、このときにやり取りされる設定も実際のブラウザとは異なります。
- こうした理由から、一部の Web サービスは TLS および HTTP ハンドシェイクを通じてクライアントを識別し、他のクライアントには異なるコンテンツを提供します。
- この手法は TLS フィンガープリンティングおよび HTTP/2 フィンガープリンティングとして知られており、Web をより閉鎖的で、よりプライベートではなく、特定の Web クライアントに対してより制限的なものにしています。
- このリポジトリの修正版 curl は、TLS および HTTP ハンドシェイクが実際のブラウザと 正確に 同一に見えるようにします。
どのように動作するのか?
curlをブラウザのように見せるために大幅に改変しています。- Firefox が使用する TLS ライブラリである nss で curl をコンパイルし、Chrome バージョンは Google の TLS ライブラリである BoringSSL でコンパイルしています。
- さまざまな TLS 拡張や SSL オプションの構成方法を変更しています。
- 新しい TLS 拡張のサポートを追加しています。
- HTTP/2 接続に対する curl の設定を変更しています。
--ciphers、--curves、および一部の-Hヘッダーのような非デフォルトフラグ付きで curl を実行します。
サポートされるブラウザ
- さまざまなバージョンの Chrome、Edge、Firefox、Safari を模倣できます。
- 各ブラウザ向けに
curl-impersonateを実行するラッパースクリプトが提供されています。
基本的な使い方
- サポートされる各ブラウザについて、必要なヘッダーとフラグ付きで
curl-impersonateを実行するラッパースクリプトがあります。 - 例:
curl_chrome116 https://www.wikipedia.org
ドキュメント
- 追加ドキュメントは docs/ ディレクトリにあります。
インストール
curl-impersonateには技術的な理由から 2 つのバージョンがあります。Chrome、Edge、Safari を模倣する chrome バージョンと、Firefox を模倣する firefox バージョンがあります。- Linux および macOS 向けの事前コンパイル済みバイナリは GitHub のリリースページで提供されています。
高度な使い方
libcurl-impersonate
libcurl-impersonate.soは、コマンドライン版curl-impersonateと同じ変更を加えてコンパイルされた libcurl です。- 追加の API 関数
curl_easy_impersonateを提供します。
CURL_IMPERSONATE 環境変数の使用
- すでに
libcurlを使用しているアプリケーションでは、LD_PRELOADを使って既存のライブラリを実行時に置き換えることができます。 CURL_IMPERSONATE環境変数を設定することで、すべてのオプションを自動設定できます。
コントリビューション
- オープンな Issue を確認し、変更を含むプルリクエストを作成して貢献できます。
スポンサー
- プロジェクトの公開と維持を支援するスポンサーがいます。スポンサーになりたい場合は直接連絡できます。
1件のコメント
Hacker News のコメント
コーダーと投稿者に賛辞を送る。OpenSSL を使うブラウザープロジェクトに参加しており、WireShark を通して自分で直接分析しなければならないと思っていた。今では参考にできる資料がたくさんある。OpenSSL のもっとも一般的な利用先が Python であるなら、Cloudflare 時代には Firefox の TLS スプーフィングオプションは必須だ。
Ladybird が将来注目されることを願う。現在ネットワーキングに cURL を使っている。cURL にはまだいくつか制限があるかもしれない(例: WebSockets を h2 で処理できない)。ただし、新しいブラウザーエンジンが登場すれば、正当なトラフィックがデフォルトの cURL と同じフィンガープリントを持つ可能性がある。
IP_TTL 値をプラットフォームに合わせて設定したのか気になる。設定していないなら、IP レイヤーである程度フィンガープリントを残せる。IP レイヤーの TTL 値が 64 未満なら、これは最新の Windows 上で動いていないか、デフォルト TTL が変更された最新の Windows デバイス上で動いていることを示す。最新の Windows のパケット TTL はデフォルトで 128 から始まり、他のほとんどのプラットフォームは 64 から始まる。他のプラットフォームはインターネット通信に問題がないため、最新の Windows の IP パケットはリモートから見ると常に 64 以上の TTL に見える。
TLS ハンドシェイクが異なって見えるなら、Web ブラウザー(例: Chrome のユーザーエージェント)を名乗るトラフィックをフィルタリングできる nginx レベルのフィルターが可能なのか気になる。これは悪意あるボットトラフィックの大部分を占めており、これをブロックしたい。
こうした内容がここに出てくることには、いつも複雑な気持ちになる。一方では、人々に独立心と反骨精神がまだ生きていると知らせるのは良いことだ。しかし、「自由は不安定」プロジェクトのように望まない注目を集めると、それに依存する人たちにとってはかえって悪くなるかもしれない。ブラウザーを書くのは難しく、既存のプレイヤーたちはそれをさらに難しくし続けている。
このツールは、小さな bash スクリプトや gnu parallel と組み合わせることで、red team 作業で https エンドポイントをマッピングするのに非常に有用だ。適切なブラウザーにしか応答しない範囲内アドレスで使っている。ヘッダースプーフィング用に
-Hのような通常の curl スイッチも使える。Show HN 当時のリンク
今は MCP バージョンを待っている :)
ウェブサイトがボットを許可するかブロックするかだけだったシンプルな時代が恋しい。