
Uma ferramenta de detecção MITM (monstro-no-meio). Usada para construir o MALCOLM:
O objetivo deste projeto é permitir a detecção precisa de interceptação HTTPS e uma impressão digital TLS robusta. Este projeto é baseado em O Impacto de Segurança da Interceptação HTTPS, e começou como uma porta para Go dos seus scripts de processamento e impressões digitais.
Mais contexto sobre o MITMEngine está disponível neste post do blog da Cloudflare. Links rápidos:
wireshark -v para verificar)A documentação detalhada está com o código (copie o pacote para $(GOPATH)/src/github.com/cloudflare/mitmengine primeiro).
godoc -http=:6060
http://localhost:6060/pkg/github.com/cloudflare/mitmengine
Neste projeto, as impressões digitais mapeiam para instâncias concretas de um objeto, enquanto as assinaturas podem representar múltiplos objetos. Usamos essa convenção porque uma impressão digital é geralmente uma propriedade inerente de um objeto, enquanto uma assinatura pode ser escolhida. Da mesma forma, uma requisição real de cliente vista por um servidor teria uma impressão digital, enquanto o software que gera a requisição pode escolher sua própria assinatura (por exemplo, escolhendo quais cipher suites suporta).
Uma impressão digital de requisição do cliente é derivada de uma requisição do cliente a um servidor e contém características de TLS e HTTP. Uma assinatura de requisição do cliente representa todas as impressões digitais possíveis que um software pode gerar. O objetivo é tornar cada assinatura específica o suficiente para identificar exclusivamente um software.
Uma assinatura de User Agent representa um conjunto de User Agents gerados por um navegador. Uma assinatura de User Agent para um navegador permite uma faixa de versões do navegador e permite especificar o nome do SO, plataforma do SO, faixa de versão do SO e tipo de dispositivo para criar assinaturas mais detalhadas.
Uma assinatura de navegador contém tanto uma assinatura de User Agent quanto uma assinatura de requisição do cliente. Isso permite que uma assinatura represente todas as impressões digitais possíveis geradas pelo Chrome 31-38 no Windows 10, por exemplo.
Uma assinatura MITM contém uma assinatura de requisição do cliente junto com detalhes adicionais sobre o software MITM, incluindo um grau de segurança que pode ser afetado por fatores externos à requisição do cliente, como se o software valida certificados.
Consideramos que uma conexão HTTPS está interceptada quando há uma incompatibilidade entre a assinatura de requisição do cliente esperada correspondente ao navegador identificado pelo User Agent, e a impressão digital real da requisição do cliente.
Se uma assinatura for imprecisa ou desatualizada para um determinado software cliente, é possível que a assinatura sinalize falsamente uma conexão como interceptada.
Se um proxy imitar de perto a requisição do cliente, pode ser que não detectemos uma incompatibilidade. Se as assinaturas do navegador forem excessivamente amplas, também falharemos em detectar a interceptação.
As impressões digitais de referência de navegador e software MITM usadas no MALCOLM podem ser encontradas em reference_fingerprints/mitmengine/.
Este conjunto de impressões digitais é uma combinação do que é extraído dos pcaps TLS Client Hello em reference_fingerprints/pcaps/, bem como dos 500 principais pares de User Agent + TLS Client Hello
observados na rede da Cloudflare e rotulados com alta confiabilidade (ou seja, tráfego correspondente a atividade humana e de bots amigáveis).
Idealmente, não dependemos de impressões digitais de referência amostradas da rede da Cloudflare; em vez disso, teríamos um conjunto abrangente de pcaps para construir nosso conjunto de referência de TLS Client Hellos. Interessado em nos ajudar a expandir nosso conjunto de dados? Veja como você pode contribuir!
Primeiro, o usuário deve criar uma estrutura mitmengine.Config para passar para mitmengine.NewProcessor. Uma estrutura mitmengine.Config
pode especificar nomes de arquivos contendo impressões digitais de navegador, impressões digitais MITM e cabeçalhos
MITM. Alternativamente, pode especificar um arquivo de configuração para ler os arquivos mencionados de qualquer outra
fonte; atualmente, o MITMEngine suporta a leitura desses arquivos de bancos de dados compatíveis com o cliente Amazon S3 (incluindo
Amazon S3 e Ceph). Leitores de arquivos adicionais para bancos de dados (que chamamos de "loaders") podem ser definidos no pacote
loaders, e desde que novos loaders implementem a interface Loader, eles devem funcionar com o restante do MITMEngine imediatamente.
O ponto de entrada pretendido para o pacote MITMEngine é através da função Processor.Check, que recebe um User Agent e uma impressão digital de requisição do cliente, e retorna um relatório de detecção MITM. Funções adicionais da API serão adicionadas no futuro para permitir, por exemplo, adicionar novas assinaturas a um processo em execução.
Um exemplo de uso da API está abaixo. Uma aplicação mais completa está disponível em cmd/demo/main.go, e pode ser compilada executando make bin/demo.
rawUa := "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"
requestFingerprintString := "303:dada,1301,1302,1303,c02b,c02f,c02c,c030,cca9,cca8,c013,c014,9c,9d,2f,35,a:aaaa,0,17,ff01,a,b,23,10,5,d,12,33,2d,2b,1b,dada,15:9a9a,1d,17,18:0::"
uaFingerprintString := "1:72.0.3626:2:3:10.14.3:1:"
requestFingerprint, _ := fp.NewRequestFingerprint(requestFingerprintString)
uaFingerprint, _ := fp.NewUAFingerprint(uaFingerprintString)
report := mitmProcessor.Check(uaFingerprint, rawUa, requestFingerprint)
O requestFingerprintString do TLS tem o seguinte formato:
<tls_version>:<cipher_suites>:<extension_names>:<curves>:<ec_point_fmts>:<http_headers>:<quirks>
O uaFingerprint tem o seguinte formato:
# <browser_name>:<browser_version>:<os_platform>:<os_name>:<os_version>:<device_type>:<quirks>
Um exemplo de como analisar User Agents no formato para o uaFingerprint está no arquivo cmd/demo/main.go.
Para usar o MITMEngine, lembre-se de obter suas dependências. Você provavelmente vai querer executar a lógica de vendoring ou gomod antes de executar os testes no MITMEngine.
Para testar, execute make test e para ver a cobertura de código, execute make cover.
Como as impressões digitais de navegadores e MITM rapidamente se tornam desatualizadas, estamos buscando ativamente atualizar o repositório de impressões digitais com novas amostras.
Ao contribuir com uma amostra de impressão digital (a "Amostra"), você (em seu próprio nome ou em nome da organização que você representa ou é patrocinado (se houver)) concede à Cloudflare, Inc. e suas subsidiárias e afiliadas uma licença perpétua, irrevogável, não exclusiva, livre de royalties e mundial sob todos os direitos de propriedade intelectual na Amostra, para: (1) copiar, publicar, exibir e distribuir a Amostra; e (2) preparar trabalhos derivados baseados na Amostra ou que façam parte dela."
Para contribuir com amostras de impressões digitais, siga estas etapas:
(testado no macOS Mojave 10.14.3)
Crie um par de certificado RSA e chave do servidor:
openssl req -new -x509 -sha256 -out server.crt -nodes -keyout server.pem -subj /CN=localhost
Inicie o servidor na porta 4433:
openssl s_server -www -cipher AES256-SHA -key server.pem -cert server.crt
Inicie a captura TShark para descriptografar cabeçalhos HTTP (TShark >= 3.0.0):
tshark -i loopback -o tls.keys_list:"127.0.0.1,4433,http,server.pem" -Tjson -e http.request.line -Y http > header.json
Inicie a captura TShark do TLS Client Hello:
tshark -i loopback -f "tcp port 4433" -w handshake.pcap
Acesse https://localhost:4433 a partir do cliente TLS que você deseja identificar. Por exemplo,
echo -e "GET /test HTTP/1.1\r\nHost:example.com\r\n\r\n" | openssl s_client -connect localhost:4433
Gere uma amostra de impressão digital (header.json, handshake.pcap) conforme descrito acima e coloque no diretório reference_fingerprints/pcaps/<desc>, onde <desc> é um nome único e descritivo.
Adicione uma linha a reference_fingerprints/fingerprint_metadata.jsonl com os campos abaixo. As opções reconhecidas para os campos os, device, platform e browser são aquelas definidas no pacote uasurfer. As opções reconhecidas para mitm_fingerprint.type estão listadas abaixo. Consulte reference_fingerprints/fingerprint_metadata.jsonl para exemplos; campos desconhecidos podem ser deixados em branco ou omitidos.
{ "desc": "<nome único e descritivo para a amostra>", "comment": "<informações adicionais sobre a amostra>", "handshake_pcap": "", "header_json": "<(opcional) caminho para o arquivo contendo a requisição HTTP do cliente", "ua_fingerprint": {"raw_ua": "", "os": "<WindowsPhone|Windows|MacOSX|iOS|Android|...>", "os_version": "..", "device": "<Windows|Mac|Linux|...>", "platform": "<Computer|Tablet|Phone|...>", "browser": "<Chrome|IE|Safari|Firefox|...>", "browser_version": ".."}, "mitm_fingerprint": { "name": "<descrição do mitm>", "type": "<Antivirus|FakeBrowser|Malware|Parental|Proxy>" }}
Outros PRs e solicitações de recursos são bem-vindos!
mergeDB (em cmd/mergedb) é um utilitário para mesclar impressões digitais TLS ClientHello semelhantes em várias versões próximas de navegadores ou software MITM.
Use mergeDB para consolidar grandes listas de impressões digitais de User Agent / Client Hello:
go run cmd/mergedb/main.go
Por padrão, o mergeDB será executado nas impressões digitais do diretório reference_fingerprints/mitmengine.
Envie um pull request com as alterações acima.