Curl-impersonate : une build spéciale de curl capable d’imiter les principaux navigateurs
(github.com/lwthiker)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 ?
curla é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,--curveset 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-impersonateavec 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-impersonateexiste 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.soest une version de libcurl compilée avec les mêmes modifications que lecurl-impersonateen 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’utiliserLD_PRELOADpour 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
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.
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_TTLa é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
-Hpour 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.