3 puntos por GN⁺ 2025-04-04 | 1 comentarios | Compartir por WhatsApp

curl-impersonate

Una compilación especial de curl que puede imitar navegadores específicos, incluyendo Chrome, Edge, Safari y Firefox. curl-impersonate puede realizar los mismos handshakes TLS y HTTP que un navegador real. Puede usarse como herramienta de línea de comandos o integrarse como biblioteca.

¿Por qué es necesario?

  • Cuando un cliente HTTP se comunica con un sitio web con TLS, primero realiza un handshake TLS. El primer mensaje en este proceso se llama Client Hello.
  • El mensaje Client Hello que generan la mayoría de los clientes HTTP y bibliotecas es muy diferente al de un navegador real.
  • Si el servidor usa HTTP/2, además del handshake TLS también se necesita un handshake HTTP/2, y la configuración intercambiada en ese momento también es distinta a la de un navegador real.
  • Por estas razones, algunos servicios web identifican al cliente a través de los handshakes TLS y HTTP, y entregan contenido diferente a otros clientes.
  • Este método se conoce como fingerprinting de TLS y fingerprinting de HTTP/2, y hace que la web sea menos abierta, menos privada y más restrictiva para ciertos clientes web.
  • El curl modificado de este repositorio hace que los handshakes TLS y HTTP se vean exactamente iguales a los de un navegador real.

¿Cómo funciona?

  • curl fue modificado de forma importante para que se vea como un navegador.
  • curl se compila con nss, la biblioteca TLS que usa Firefox, y la versión de Chrome se compila con BoringSSL, la biblioteca TLS de Google.
  • Se modificó la forma de configurar varias extensiones TLS y opciones SSL.
  • Se agregó soporte para nuevas extensiones TLS.
  • Se cambiaron las configuraciones de curl para conexiones HTTP/2.
  • Se ejecuta curl con flags no predeterminados como --ciphers, --curves y algunos headers -H.

Navegadores compatibles

  • Puede imitar varias versiones de Chrome, Edge, Firefox y Safari.
  • Se proporcionan scripts wrapper para cada navegador para ejecutar curl-impersonate.

Uso básico

  • Hay scripts wrapper para cada navegador compatible que ejecutan curl-impersonate con los headers y flags necesarios.
  • Ejemplo: curl_chrome116 https://www.wikipedia.org

Documentación

  • La documentación adicional está en el directorio docs/.

Instalación

  • curl-impersonate tiene dos versiones por razones técnicas. Está la versión chrome, que imita Chrome, Edge y Safari, y la versión firefox, que imita Firefox.
  • Los binarios precompilados para Linux y macOS están disponibles en la página de releases de GitHub.

Uso avanzado

libcurl-impersonate

  • libcurl-impersonate.so es libcurl compilado con los mismos cambios que el curl-impersonate de línea de comandos.
  • Proporciona la función adicional de API curl_easy_impersonate.

Uso de la variable de entorno CURL_IMPERSONATE

  • En aplicaciones que ya usan libcurl, se puede reemplazar la biblioteca existente en tiempo de ejecución usando LD_PRELOAD.
  • Configurando la variable de entorno CURL_IMPERSONATE, es posible establecer automáticamente todas las opciones.

Contribuciones

  • Se puede contribuir revisando los issues abiertos y abriendo pull requests con cambios.

Patrocinio

  • Hay patrocinadores que ayudan a abrir y mantener el proyecto. Si quieres convertirte en patrocinador, puedes contactar directamente.

1 comentarios

 
GN⁺ 2025-04-04
Comentarios de Hacker News
  • Aplausos para el autor y quien lo publicó. Participo en un proyecto de navegador que usa OpenSSL, y pensaba que tendría que analizarlo directamente con WireShark. Ahora ya hay mucho material de referencia. Si el uso más común de OpenSSL es Python, entonces una opción de suplantación de TLS de Firefox es indispensable en la era de Cloudflare.

    • Hay un fork de este proyecto que está mejorado respecto al original y se mantiene activamente: curl-impersonate
    • También hay bindings de Python del fork para quienes usan Python: curl_cffi
  • Ojalá Ladybird reciba atención en el futuro. Actualmente usa cURL para la red. cURL aún puede tener algunas limitaciones (por ejemplo, no puede manejar WebSockets sobre h2). Pero si aparece un nuevo motor de navegador, el tráfico legítimo podría terminar teniendo la misma huella que el cURL base.

  • Me pregunto si configuraron el valor de IP_TTL según la plataforma. Si no lo hicieron, eso puede dejar cierta huella en la capa IP. Si el valor TTL en la capa IP es menor que 64, eso indica que no se está ejecutando en Windows moderno, o que sí se está ejecutando en un dispositivo Windows moderno con el TTL predeterminado modificado. En Windows moderno, el TTL de los paquetes empieza por defecto en 128, mientras que en la mayoría de las demás plataformas empieza en 64. Las otras plataformas no tienen problemas para comunicarse por Internet, así que los paquetes IP de Windows moderno siempre se ven de forma remota con un TTL de 64 o más.

  • Si el handshake de TLS se ve distinto, me pregunto si sería posible tener un filtro a nivel de nginx que permita filtrar tráfico que afirma ser un navegador web (por ejemplo, con user agent de Chrome). Eso representa la mayor parte del tráfico malicioso de bots, y me gustaría bloquearlo.

  • Siempre tengo sentimientos encontrados sobre ver este tipo de cosas aparecer aquí. Por un lado, es bueno que la gente vea que la independencia y el espíritu rebelde siguen vivos. Pero, como con el proyecto "Freedom Is Unstable", atraer atención no deseada puede empeorar las cosas para quienes dependen de ello. Es difícil escribir un navegador, y los actores establecidos siguen haciendo que sea aún más difícil.

  • Esta herramienta, combinada con un pequeño script de bash y gnu parallel, es muy útil en trabajo de red team para mapear endpoints https. La uso en direcciones dentro de un rango que solo responden al navegador adecuado. Se pueden usar switches normales de curl como -H para suplantar headers.

  • En la época de Show HN

  • Ahora estoy esperando la versión MCP :)

  • Extraño los tiempos simples en los que un sitio web permitía o bloqueaba bots.