3 điểm bởi GN⁺ 2025-04-04 | 1 bình luận | Chia sẻ qua WhatsApp

curl-impersonate

Một bản dựng đặc biệt của curl có thể giả lập các trình duyệt cụ thể như Chrome, Edge, Safari và Firefox. curl-impersonate có thể thực hiện bắt tay TLS và HTTP giống hệt trình duyệt thật. Có thể dùng như công cụ dòng lệnh hoặc tích hợp dưới dạng thư viện.

Tại sao lại cần nó?

  • Khi một HTTP client giao tiếp với website dùng TLS, bước đầu tiên là thực hiện bắt tay TLS. Thông điệp đầu tiên ở đây được gọi là Client Hello.
  • Thông điệp Client Hello do hầu hết HTTP client và thư viện tạo ra khác khá nhiều so với trình duyệt thật.
  • Nếu máy chủ sử dụng HTTP/2, ngoài bắt tay TLS còn cần bắt tay HTTP/2, và các thiết lập được trao đổi lúc này cũng khác với trình duyệt thật.
  • Vì những lý do đó, một số dịch vụ web nhận diện client thông qua bắt tay TLS và HTTP, rồi cung cấp nội dung khác nhau cho các client khác nhau.
  • Cách làm này được biết đến với tên gọi TLS fingerprinting và HTTP/2 fingerprinting, khiến web trở nên kém mở hơn, kém riêng tư hơn và bị hạn chế hơn đối với một số web client nhất định.
  • Bản curl đã được chỉnh sửa trong kho lưu trữ này khiến bắt tay TLS và HTTP trông chính xác giống như trình duyệt thật.

Nó hoạt động như thế nào?

  • curl đã được chỉnh sửa đáng kể để trông giống trình duyệt.
  • Curl được biên dịch với nss, thư viện TLS mà Firefox sử dụng; còn phiên bản Chrome được biên dịch với BoringSSL, thư viện TLS của Google.
  • Điều chỉnh cách cấu hình nhiều extension TLS và tùy chọn SSL khác nhau.
  • Bổ sung hỗ trợ cho các extension TLS mới.
  • Thay đổi các thiết lập của curl cho kết nối HTTP/2.
  • Chạy curl với các cờ không mặc định như --ciphers, --curves và một số header -H.

Các trình duyệt được hỗ trợ

  • Có thể giả lập nhiều phiên bản của Chrome, Edge, Firefox và Safari.
  • Có các script wrapper cho từng trình duyệt để chạy curl-impersonate.

Cách dùng cơ bản

  • Với mỗi trình duyệt được hỗ trợ, đều có script wrapper để chạy curl-impersonate cùng các header và cờ cần thiết.
  • Ví dụ: curl_chrome116 https://www.wikipedia.org

Tài liệu

  • Tài liệu bổ sung nằm trong thư mục docs/.

Cài đặt

  • Vì lý do kỹ thuật, curl-impersonate có hai phiên bản. Phiên bản chrome để giả lập Chrome, Edge, Safari và phiên bản firefox để giả lập Firefox.
  • Các binary biên dịch sẵn cho Linux và macOS được cung cấp trên trang GitHub Releases.

Cách dùng nâng cao

libcurl-impersonate

  • libcurl-impersonate.so là libcurl được biên dịch với cùng các thay đổi như curl-impersonate dòng lệnh.
  • Nó cung cấp thêm hàm API curl_easy_impersonate.

Sử dụng biến môi trường CURL_IMPERSONATE

  • Trong các ứng dụng đã dùng libcurl, có thể dùng LD_PRELOAD để thay thế thư viện hiện có vào lúc chạy.
  • Có thể đặt biến môi trường CURL_IMPERSONATE để tự động cấu hình mọi tùy chọn.

Đóng góp

  • Có thể kiểm tra các issue đang mở và mở pull request kèm thay đổi để đóng góp.

Nhà tài trợ

  • Có các nhà tài trợ giúp dự án được mở và duy trì. Nếu muốn trở thành nhà tài trợ, bạn có thể liên hệ trực tiếp.

1 bình luận

 
GN⁺ 2025-04-04
Ý kiến trên Hacker News
  • Xin gửi lời khen tới tác giả và người đăng bài. Tôi đang tham gia một dự án trình duyệt dùng OpenSSL và từng nghĩ mình sẽ phải tự phân tích trực tiếp qua WireShark. Giờ thì đã có rất nhiều tài liệu để tham khảo. Nếu cách dùng OpenSSL phổ biến nhất là qua Python, thì trong thời đại Cloudflare, tùy chọn giả mạo TLS của Firefox là thứ không thể thiếu.

    • Có một bản fork của dự án này tốt hơn bản gốc và đang được duy trì rất tích cực: curl-impersonate
    • Cũng có Python binding của bản fork dành cho người dùng Python: curl_cffi
  • Hy vọng Ladybird sẽ được chú ý trong tương lai. Hiện tại nó đang dùng cURL cho phần mạng. cURL có thể vẫn còn một số hạn chế (ví dụ: không thể xử lý WebSockets trên h2). Nhưng nếu một engine trình duyệt mới xuất hiện, lưu lượng hợp lệ có thể sẽ mang cùng fingerprint với cURL mặc định.

  • Tôi tự hỏi họ có thiết lập giá trị IP_TTL phù hợp theo từng nền tảng hay không. Nếu không, vẫn có thể để lộ fingerprint ở tầng IP ở một mức độ nào đó. Nếu giá trị TTL ở tầng IP thấp hơn 64, điều đó cho thấy nó không chạy trên Windows hiện đại, hoặc đang chạy trên một máy Windows hiện đại đã bị thay đổi TTL mặc định. Trên Windows hiện đại, TTL gói tin mặc định bắt đầu từ 128, còn hầu hết nền tảng khác bắt đầu từ 64. Các nền tảng khác không gặp vấn đề gì khi giao tiếp trên Internet, nên từ xa, gói IP của Windows hiện đại luôn sẽ được nhìn thấy với TTL từ 64 trở lên.

  • Nếu TLS handshake trông khác đi, tôi tự hỏi liệu có thể có bộ lọc ở cấp nginx để lọc lưu lượng tự nhận là trình duyệt web (ví dụ: Chrome user agent) hay không. Đây là nguồn của phần lớn lưu lượng bot độc hại, và tôi muốn chặn nó.

  • Tôi luôn có cảm xúc lẫn lộn khi thấy những thứ như thế này xuất hiện ở đây. Một mặt, thật tốt khi cho mọi người thấy rằng tính độc lập và tinh thần phản kháng vẫn còn sống. Nhưng mặt khác, nếu nó thu hút sự chú ý không mong muốn như dự án "tự do là bất ổn", thì điều đó có thể khiến tình hình tệ hơn cho những người đang phụ thuộc vào nó. Viết trình duyệt là việc khó, và các bên đương nhiệm vẫn liên tục khiến nó khó hơn.

  • Công cụ này rất hữu ích khi kết hợp với một bash script nhỏ và gnu parallel để lập bản đồ các endpoint https trong công việc red team. Dùng nó trên các địa chỉ trong phạm vi chỉ phản hồi với đúng trình duyệt phù hợp. Bạn cũng có thể dùng các switch curl thông thường như -H để giả mạo header.

  • Thời điểm Showhn: liên kết

  • Giờ chỉ còn chờ phiên bản MCP :)

  • Tôi nhớ thời đơn giản khi website либо cho phép bot, либо chặn bot.