Curl-impersonate: build especial do curl capaz de imitar os principais navegadores
(github.com/lwthiker)curl-impersonate
Um build especial do curl capaz de imitar navegadores específicos, incluindo Chrome, Edge, Safari e Firefox. O curl-impersonate consegue realizar handshakes TLS e HTTP idênticos aos de navegadores reais. Pode ser usado como ferramenta de linha de comando ou integrado como biblioteca.
Por que isso é necessário?
- Quando um cliente HTTP se comunica com um site TLS, ele primeiro realiza um handshake TLS. A primeira mensagem desse processo é chamada de Client Hello.
- As mensagens Client Hello geradas pela maioria dos clientes e bibliotecas HTTP são bem diferentes das de navegadores reais.
- Quando o servidor usa HTTP/2, além do handshake TLS também é necessário um handshake HTTP/2, e as configurações trocadas nesse momento também diferem das de navegadores reais.
- Por isso, alguns serviços web identificam o cliente por meio dos handshakes TLS e HTTP e entregam conteúdo diferente para outros clientes.
- Esse método é conhecido como fingerprinting de TLS e fingerprinting de HTTP/2, tornando a web menos aberta, menos privada e mais restritiva para determinados clientes web.
- O curl modificado deste repositório faz com que os handshakes TLS e HTTP pareçam exatamente iguais aos de navegadores reais.
Como funciona?
- O
curlé bastante modificado para se parecer com um navegador. - O curl é compilado com nss, a biblioteca TLS usada pelo Firefox, e a versão para Chrome é compilada com o BoringSSL, biblioteca TLS do Google.
- A forma de configurar várias extensões TLS e opções de SSL é modificada.
- Suporte a novas extensões TLS é adicionado.
- As configurações do curl para conexões HTTP/2 são alteradas.
- O curl é executado com flags fora do padrão, como
--ciphers,--curvese alguns headers-H.
Navegadores compatíveis
- É possível imitar várias versões de Chrome, Edge, Firefox e Safari.
- Scripts wrapper para cada navegador são fornecidos para executar o
curl-impersonate.
Uso básico
- Há scripts wrapper para cada navegador compatível que executam o
curl-impersonatecom os headers e flags necessários. - Exemplo:
curl_chrome116 https://www.wikipedia.org
Documentação
- Documentação adicional está no diretório docs/.
Instalação
- O
curl-impersonatetem duas versões por motivos técnicos. Há a versão chrome, que imita Chrome, Edge e Safari, e a versão firefox, que imita o Firefox. - Binários pré-compilados para Linux e macOS estão disponíveis na página de releases do GitHub.
Uso avançado
libcurl-impersonate
libcurl-impersonate.soé uma libcurl compilada com as mesmas alterações da versão de linha de comandocurl-impersonate.- Ela fornece a função de API adicional
curl_easy_impersonate.
Uso da variável de ambiente CURL_IMPERSONATE
- Em aplicações que já usam
libcurl, é possível usarLD_PRELOADpara substituir a biblioteca existente em tempo de execução. - Definindo a variável de ambiente
CURL_IMPERSONATE, é possível configurar automaticamente todas as opções.
Contribuição
- Você pode contribuir verificando as issues abertas e abrindo um pull request com alterações.
Patrocinadores
- Há patrocinadores que ajudam a abrir e manter o projeto. Se quiser se tornar um patrocinador, é possível entrar em contato diretamente.
1 comentários
Comentários no Hacker News
Aplausos ao autor e ao publicador. Participo de um projeto de navegador que usa OpenSSL e achei que teria que analisar tudo diretamente com o WireShark. Agora há muito material de referência. Se o uso mais comum do OpenSSL for em Python, então uma opção de spoofing de TLS do Firefox é essencial na era Cloudflare.
Espero que o Ladybird ganhe atenção no futuro. No momento ele usa cURL para rede. O cURL ainda pode ter algumas limitações (por exemplo, não consegue lidar com WebSockets em h2). Mas, se surgir um novo mecanismo de navegador, tráfego legítimo pode acabar tendo a mesma impressão digital do cURL padrão.
Fico curioso se o valor de IP_TTL foi configurado de acordo com a plataforma. Se não foi, isso pode deixar uma certa impressão digital na camada IP. Se o valor de TTL na camada IP for menor que 64, isso indica que não está rodando em um Windows moderno ou que está rodando em um dispositivo Windows moderno com o TTL padrão alterado. Em versões modernas do Windows, o TTL dos pacotes começa em 128 por padrão, enquanto a maioria das outras plataformas começa em 64. Como as outras plataformas não têm problema para se comunicar pela internet, os pacotes IP de um Windows moderno sempre aparecem remotamente com TTL de 64 ou mais.
Se o handshake TLS parecer diferente, fico imaginando se seria possível ter um filtro no nível do nginx capaz de filtrar tráfego que afirma ser de um navegador web (por exemplo, user agent do Chrome). Isso representa a maior parte do tráfego malicioso de bots, e eu gostaria de bloquear isso.
Sempre tenho sentimentos ambíguos quando esse tipo de coisa aparece aqui. Por um lado, é bom mostrar às pessoas que independência e espírito de rebeldia ainda existem. Mas, se isso atrair atenção indesejada, como no projeto "liberdade é instabilidade", pode piorar a situação para quem depende disso. Escrever navegadores é difícil, e os players já estabelecidos continuam tornando isso ainda mais difícil.
Esta ferramenta é muito útil para mapear endpoints https em trabalho de red team quando combinada com pequenos scripts bash e gnu parallel. Eu a uso em endereços dentro de um escopo que só respondem ao navegador apropriado. Dá para usar switches normais do curl, como
-H, para spoofing de cabeçalhos.Na época do Show HN: link
Agora estou esperando a versão MCP :)
Sinto falta da época simples em que um site permitia ou bloqueava bots.