3 points par GN⁺ 2025-04-04 | 1 commentaires | Partager sur WhatsApp

curl-impersonate

Une build spéciale de curl capable d’imiter certains navigateurs, notamment Chrome, Edge, Safari et Firefox. curl-impersonate peut effectuer exactement les mêmes handshakes TLS et HTTP qu’un vrai navigateur. Il peut être utilisé comme outil en ligne de commande ou intégré comme bibliothèque.

Pourquoi est-ce nécessaire ?

  • Lorsqu’un client HTTP communique avec un site web en TLS, il effectue d’abord un handshake TLS. Le premier message de cet échange s’appelle le Client Hello.
  • Les messages Client Hello générés par la plupart des clients HTTP et bibliothèques diffèrent fortement de ceux des vrais navigateurs.
  • Si le serveur utilise HTTP/2, un handshake HTTP/2 est également nécessaire en plus du handshake TLS, et les paramètres échangés à ce moment diffèrent eux aussi de ceux des vrais navigateurs.
  • Pour cette raison, certains services web identifient le client via les handshakes TLS et HTTP, puis servent un contenu différent aux autres types de clients.
  • Cette méthode est connue sous le nom de fingerprinting TLS et de fingerprinting HTTP/2, et elle rend le web moins ouvert, moins respectueux de la vie privée et plus restrictif envers certains clients web.
  • La version modifiée de curl dans ce dépôt fait en sorte que les handshakes TLS et HTTP paraissent exactement identiques à ceux d’un vrai navigateur.

Comment cela fonctionne-t-il ?

  • curl a été largement modifié pour ressembler à un navigateur.
  • curl est compilé avec nss, la bibliothèque TLS utilisée par Firefox, et la version Chrome est compilée avec BoringSSL, la bibliothèque TLS de Google.
  • La manière de configurer diverses extensions TLS et options SSL a été modifiée.
  • La prise en charge de nouvelles extensions TLS a été ajoutée.
  • La configuration de curl pour les connexions HTTP/2 a été modifiée.
  • curl est exécuté avec des flags non par défaut comme --ciphers, --curves et certains en-têtes -H.

Navigateurs pris en charge

  • Il peut imiter différentes versions de Chrome, Edge, Firefox et Safari.
  • Des scripts wrapper sont fournis pour chaque navigateur afin d’exécuter curl-impersonate.

Utilisation de base

  • Pour chaque navigateur pris en charge, il existe un script wrapper qui exécute curl-impersonate avec les en-têtes et flags nécessaires.
  • Exemple : curl_chrome116 https://www.wikipedia.org

Documentation

  • Une documentation supplémentaire se trouve dans le répertoire docs/.

Installation

  • curl-impersonate existe en deux versions pour des raisons techniques. Une version chrome qui imite Chrome, Edge et Safari, et une version firefox qui imite Firefox.
  • Des binaires précompilés pour Linux et macOS sont disponibles sur la page GitHub Releases.

Utilisation avancée

libcurl-impersonate

  • libcurl-impersonate.so est une version de libcurl compilée avec les mêmes modifications que le curl-impersonate en ligne de commande.
  • Elle fournit une fonction d’API supplémentaire : curl_easy_impersonate.

Utilisation de la variable d’environnement CURL_IMPERSONATE

  • Dans les applications qui utilisent déjà libcurl, il est possible d’utiliser LD_PRELOAD pour remplacer la bibliothèque existante à l’exécution.
  • En définissant la variable d’environnement CURL_IMPERSONATE, il est possible de configurer automatiquement toutes les options.

Contribution

  • Vous pouvez contribuer en consultant les issues ouvertes et en ouvrant une pull request avec vos modifications.

Sponsors

  • Des sponsors aident à ouvrir et maintenir le projet. Si vous souhaitez devenir sponsor, vous pouvez les contacter directement.

1 commentaires

 
GN⁺ 2025-04-04
Commentaire Hacker News
  • Bravo au développeur et à l’auteur du post. Je participe à un projet de navigateur qui utilise OpenSSL, et je pensais devoir tout analyser moi-même avec WireShark. J’ai maintenant beaucoup de matière de référence. Si l’usage le plus courant d’OpenSSL est Python, alors une option d’usurpation TLS de Firefox est indispensable à l’ère de Cloudflare.

    • Il existe un fork de ce projet qui est amélioré par rapport à l’original et activement maintenu : curl-impersonate
    • Il existe aussi des bindings Python de ce fork pour ceux qui utilisent Python : curl_cffi
  • J’espère que Ladybird attirera l’attention à l’avenir. Il utilise actuellement cURL pour le réseau. cURL peut encore avoir certaines limites (par exemple, il ne peut pas gérer WebSockets sur h2). Mais si un nouveau moteur de navigateur apparaît, un trafic légitime pourrait avoir par défaut la même empreinte que cURL standard.

  • Je me demande si la valeur IP_TTL a été configurée selon la plateforme. Si ce n’est pas le cas, cela peut laisser une certaine empreinte au niveau IP. Si la valeur TTL à la couche IP est inférieure à 64, cela indique que cela ne tourne pas sur un Windows récent, ou sur une machine Windows récente dont le TTL par défaut a été modifié. Les paquets sur les Windows récents partent par défaut avec un TTL de 128, alors que la plupart des autres plateformes partent de 64. Comme les autres plateformes n’ont pas de problème pour communiquer sur Internet, les paquets IP de Windows récents apparaissent toujours à distance avec un TTL d’au moins 64.

  • Si la négociation TLS apparaît différemment, je me demande s’il est possible de mettre en place au niveau de nginx un filtre capable de filtrer le trafic qui prétend venir d’un navigateur web (par exemple avec un user agent Chrome). Cela représente la majorité du trafic de bots malveillants, et j’aimerais pouvoir le bloquer.

  • J’ai toujours des sentiments mitigés quand ce genre de chose apparaît ici. D’un côté, c’est bien de montrer aux gens que l’indépendance et l’esprit de rébellion existent encore. Mais comme avec le projet "Freedom is unstable", attirer une attention non désirée peut empirer la situation pour ceux qui en dépendent. Écrire un navigateur est difficile, et les acteurs en place ne cessent de rendre cela encore plus difficile.

  • Cet outil est très utile, combiné à un petit script bash et à gnu parallel, pour cartographier des endpoints https dans le cadre d’opérations de red team. Je l’utilise sur des adresses dans une plage qui ne répondent qu’à un navigateur approprié. On peut utiliser les options curl habituelles comme -H pour l’usurpation d’en-têtes.

  • À l’époque du Show HN : lien

  • J’attends maintenant une version MCP :)

  • L’époque simple où les sites web autorisaient ou bloquaient les bots me manque.