การวิเคราะห์ทางเทคนิคของช่องโหว่ Kerberos CVE-2022-33679 และ CVE-2022-33647

หน้าแรก » บล็อก » การวิเคราะห์ทางเทคนิคของช่องโหว่ Kerberos CVE-2022-33679 และ CVE-2022-33647

เขียนโดย Yoav Iellin และ Dor Segal นักวิจัยที่ Silverfort

แพตช์ประจำเดือนกันยายน 2022 ของ Microsoft ในวันอังคารรวมช่องโหว่ระดับสิทธิ์การใช้งานที่มีความเสี่ยงสูง 4 รายการใน Kerberos ซึ่งค้นพบโดย Google Project Zero ช่องโหว่ทั้งสองใช้ประโยชน์จากความสามารถในการบังคับให้ Kerberos ลดระดับการเข้ารหัสจากการเข้ารหัส AES เริ่มต้นเป็น MD4-RC4 ที่ล้าสมัย เมื่อการเข้ารหัสถูกดาวน์เกรด ช่องโหว่ทั้งสองจะเข้ามามีบทบาท และทำให้ผู้โจมตีสามารถใช้จุดอ่อนในการเข้ารหัส MD4-RCXNUMX ในทางที่ผิด

อันแรก CVE-2022-33679 ช่วยให้ผู้โจมตีได้รับเซสชันที่รับรองความถูกต้องในนามของเหยื่อ ซึ่งอาจนำไปสู่การใช้รหัสโดยอำเภอใจ ส่วนที่สอง CVE-2022-33647 ช่วยให้ผู้โจมตีที่ประสบความสำเร็จในการโจมตีแบบ Man-in-the-Middle สามารถออกตั๋วบริการ Kerberos ในนามของผู้ใช้เป้าหมาย ซึ่งจะได้รับสิทธิ์เช่นเดียวกับผู้ใช้

โปรดทราบว่าแม้ว่าช่องโหว่ทั้งสองจะมุ่งเป้าไปที่จุดอ่อนในการเข้ารหัส MD4-RC4 แบบดั้งเดิม แต่ช่องโหว่แต่ละรายการก็ใช้จุดอ่อนที่แตกต่างกัน ซึ่งส่งผลให้มีข้อกำหนดเบื้องต้นและสถานการณ์การโจมตีที่แตกต่างกัน

บทความนี้ประกอบด้วยการวิเคราะห์ทางเทคนิคโดยละเอียดและคำอธิบายเกี่ยวกับทั้ง CVE-2022-33679 และ CVE-2022-33647

CVE-2022-33679 – การวิเคราะห์ช่องโหว่

จุดอ่อน CVE-2022-33679ซึ่งเป็นการพิสูจน์แนวคิดเมื่อไม่นานมานี้ การเผยแพร่อยู่ในวิธีการที่ Kerberos เข้ารหัสคีย์เซสชัน และทำให้เป็นไปได้โดยการใช้ของ Kerberos หากประเภทการเข้ารหัส RC4-MD4 ที่ล้าสมัย การโจมตีประกอบด้วยสองส่วน A) ขอตั๋ว TGT ใหม่โดยใช้ RC4-MD4 etype ตามด้วย B) การทำลายคีย์สตรีมทีละไบต์ต่อไบต์

กระบวนการเอารัดเอาเปรียบ:

  1. รับตั๋ว TGT โดยส่งแพ็คเก็ต AS-REQ ไปยังเซิร์ฟเวอร์ KDC คำขอต้องขอประเภทการเข้ารหัส RC4-MD4 เพื่อให้การโจมตีสำเร็จ ต้องปฏิบัติตามข้อกำหนดสองประการต่อไปนี้:
    1. ดาวน์เกรด Kerberos การเข้ารหัสอย่างชัดเจนจาก AES เริ่มต้นจาก RC4-MD4 ที่อ่อนแอกว่า สิ่งนี้ทำให้การโจมตีเป็นไปได้เพราะคีย์มีขนาดเพียง 8 ไบต์โดยไม่มี IV หรือเกลือ  
    2. เปิดใช้งานการตั้งค่าสถานะ "ไม่ต้องการการรับรองความถูกต้องล่วงหน้าของ Kerberos" ของออบเจ็กต์ของผู้ใช้ ซึ่งช่วยให้สามารถรับ TGT พร้อมคีย์เซสชันที่เข้ารหัสโดยไม่จำเป็นต้องทราบรหัสผ่านของผู้ใช้ ก่อน การรับรอง เป็นกลไกที่ไคลเอนต์เข้ารหัสการประทับเวลาปัจจุบันด้วยรหัสผ่านที่ป้อน และส่งไปยัง KDC ซึ่งจะตรวจสอบความสมบูรณ์ของรหัสผ่านก่อนที่จะสร้างคีย์เซสชันและ TGT เนื่องจากแฟล็ก "ไม่ต้องการการตรวจสอบสิทธิ์ล่วงหน้าของ Kerberos" KDC จึงสามารถกำหนดเป้าหมายได้โดยตรง และไม่ต้องใช้เทคนิคการโจมตีพิเศษใดๆ เช่น Man In The Middle
  2. หลังจากที่ผู้โจมตีได้รับตั๋วที่เข้ารหัสเรียบร้อยแล้ว แพ็กเก็ต AS-REP จะประกอบด้วยเซสชันคีย์ TGT ที่เข้ารหัสซึ่งมีความยาว 40 บิต การใช้ประเภทการเข้ารหัส RC4-MD4 ที่ล้าสมัย ผู้โจมตีสามารถใช้ประโยชน์จากความรู้ของตนเกี่ยวกับการเริ่มต้นแพ็กเก็ตที่เข้ารหัสแบบคงที่เพื่อแยก 45 ไบต์ของคีย์สตรีม
  3. ตอนนี้ผู้โจมตีสามารถใช้สตรีมคีย์นี้เพื่อเข้ารหัสใหม่และขอตั๋ว TGT จาก KDC ด้วยการตรวจสอบสิทธิ์ล่วงหน้าที่กำหนดเองซึ่งจะใช้ในการตรวจสอบว่าสตรีมคีย์ถูกต้องหรือไม่ และทำลายคีย์เซสชัน TGT 40 บิตที่เหลือต่อไปนี้ ไบต์ต่อไบต์ สิ่งนี้ทำได้โดยใช้จุดอ่อนสองข้อในทางที่ผิดในโปรโตคอล ASN.1 ที่ใช้สำหรับการเข้ารหัส Kerberos เพื่อใช้ประโยชน์จากการควบคุมที่จำกัดของผู้โจมตีเกี่ยวกับขนาดฟิลด์การตรวจสอบสิทธิ์ล่วงหน้า:
    1. ตัวแยกวิเคราะห์ KDC ละเว้นสตริงที่สิ้นสุดด้วย NUL ที่ส่วนท้ายของวัตถุ สิ่งนี้ทำให้เราสามารถเพิ่มอักขระ NUL ที่ส่วนท้ายของวัตถุ KerberosTime สิ่งนี้จะใช้ได้กับการเดาไบต์เดียว แต่เรายังต้องเดาอีกสี่ไบต์
    2. ตัวแยกวิเคราะห์ KDC ไม่ได้ตรวจสอบความยาวของความยาวที่เข้ารหัส ความยาวสตริง ASN.1 แสดงด้วย 1-4 ไบต์ และตัวแยกวิเคราะห์ KDC ASN.1 ไม่ได้บังคับใช้วิธีที่สั้นที่สุด ดังนั้นเราจึงสามารถแสดงความยาวสตริงการประทับเวลาของเราด้วยขนาด 1-4 ไบต์ตามที่เราต้องการ หมายความว่าเราสามารถขยายความยาวของข้อความธรรมดาให้ใหญ่ขึ้นอีกได้ และดันไบต์ NUL ไปยังตำแหน่งถัดไป และคาดเดาไบต์ถัดไปของคีย์สตรีม
  4. สุดท้าย ผู้โจมตีสามารถเข้ารหัสการประทับเวลาอีกครั้งและตรวจสอบการคาดเดาแต่ละครั้งโดยส่ง AS-REQ พร้อมการยืนยันตัวตนล่วงหน้าที่เข้ารหัส และจะได้รับข้อผิดพลาดหากวันที่ก่อนการตรวจสอบสิทธิ์ที่เข้ารหัสไม่ถูกต้อง ในกรณีที่การตรวจสอบสิทธิ์ล่วงหน้าสำเร็จ ผู้โจมตีสามารถค้นพบไบต์อื่นจากคีย์สตรีมได้ เนื่องจากแต่ละไบต์มีตัวเลือกการคาดเดามากถึง 256 ตัวเลือก การทำขั้นตอนนี้ซ้ำจะทำให้ได้รับไบต์สตรีมคีย์ที่จำเป็นทั้งหมดเพื่อถอดรหัสคีย์เซสชันที่จัดเก็บไว้ในตั๋วต้นฉบับ

คีย์เซสชันที่ได้รับช่วยให้ผู้โจมตีสามารถขอตั๋วไปยัง SPN ใดๆ ในนามของผู้ใช้เป้าหมายได้

ขั้นตอนการแบ่งไบต์แรกของคีย์เซสชัน AS-REQ โดยใช้ CVE-2022-33679 ควรตามด้วยไบต์ที่เหลือ
กระแสการโจมตีต่อเนื่อง ทำลายไบต์สุดท้ายและรับ TGT ใหม่โดยใช้คีย์เซสชันที่เสียหาย
เครดิต: POC โดย James Forshaw และ Rubeus โดย GhostPack

CVE-2022-33647 การวิเคราะห์ทางเทคนิค

โชคดีสำหรับผู้โจมตี ช่องโหว่ CVE-2022-33647 ทำงานร่วมกับการตรวจสอบสิทธิ์ล่วงหน้า ซึ่งแตกต่างจาก CVE-2022-33679 สิ่งนี้มีความสำคัญเนื่องจากการตรวจสอบสิทธิ์ล่วงหน้าถูกเปิดใช้งานตามค่าเริ่มต้นสำหรับทุกออบเจกต์ที่สร้างขึ้นใน Active Directory. ข้อกำหนดหลักสำหรับการโจมตีนี้คือ Man-In-The-Middle ระหว่างไคลเอ็นต์และตัวควบคุมโดเมน (การโจมตีประเภทนี้พบได้ทั่วไปและมีหลายวิธีที่จะบรรลุผลได้ เช่น การปลอมแปลง DNS, ARP Poisoning เป็นต้น) MITM ใช้เพื่อบังคับให้ไคลเอนต์ดาวน์เกรดการเข้ารหัสเป็น MD4-RC4

กระแสการเอารัดเอาเปรียบ

เมื่อคำขอ AS แรกถูกส่งมาจากไคลเอนต์ KDC จะตอบกลับด้วยข้อความ 'ต้องตรวจสอบสิทธิ์ล่วงหน้า' อย่างไรก็ตาม ผู้โจมตีสามารถเปลี่ยนแปลงการตอบสนองของ KDC ได้ เนื่องจากในขั้นตอนนี้ของการตรวจสอบไม่มีการตรวจสอบ เราจะแก้ไขการเข้ารหัสที่สนับสนุนโดย KDC เป็น RC4-MD4 ดังแสดงในรูป ด้วยเหตุนี้ (หากเปิดใช้งาน RC4) ไคลเอนต์จะส่ง AS_REQ พร้อมการตรวจสอบสิทธิ์ล่วงหน้าโดยใช้อัลกอริทึม MD4-RC4

จากจุดนี้ ผู้โจมตีมีสองทางเลือก:

  1. กำลังดุร้ายคีย์เซสชัน 5 ไบต์ซึ่งอาจไม่มีประสิทธิภาพและอาจใช้เวลานาน
  2. อีกทางเลือกหนึ่งคือการใช้ประโยชน์จากความรู้ของข้อมูลข้อความธรรมดา - การยืนยันตัวตนล่วงหน้า ใน Kebreros ฝ่ายตรงข้ามของ MITM สามารถประมาณเวลาที่แม่นยำของการประทับเวลาล่วงหน้าของข้อความธรรมดาที่สร้างโดยไคลเอ็นต์ในคำขอ AS กลไกการเข้ารหัสไม่มีเวกเตอร์การเริ่มต้นหรือไม่มี และไม่สนใจค่าการใช้คีย์ ด้วยเหตุนี้ คีย์สตรีมเดียวกันจึงถูกใช้ในส่วนต่างๆ ของการแลกเปลี่ยนการตรวจสอบความถูกต้อง ดังนั้น คีย์สตรีมส่วนใหญ่จึงใช้คีย์สตรีม RC4 เดียวกัน การตรวจสอบสิทธิ์ล่วงหน้ามีการประทับเวลาที่เข้ารหัส ดังนั้นการใช้ความรู้ของเราเกี่ยวกับเวลาปัจจุบัน ผู้โจมตีสามารถค้นพบส่วนหนึ่งของคีย์สตรีมได้ หากผู้โจมตีโชคดี คีย์สตรีมเดียวกันจะถูกใช้เพื่อถอดรหัส 4 ไบต์ของคีย์เซสชัน TGT ในการตอบสนอง AS ไบต์สุดท้ายซ้อนทับกับไบต์ที่น้อยที่สุดของการประทับเวลา ซึ่งหมายถึงไมโครวินาที ซึ่งผู้โจมตีไม่รู้จัก ไบต์สุดท้ายจะถูกทำลายในการโจมตีแบบเดรัจฉานต่อคำขอ TGS ที่ประสบความสำเร็จของเหยื่อ ดังที่อธิบายไว้ด้านล่าง

ASN.1 การทำให้เป็นอนุกรมซูมเข้า

การเข้ารหัส ASN.1 DER คือแท็ก ความยาว ระบบการเข้ารหัสค่าสำหรับแต่ละองค์ประกอบ การประทับเวลาการตรวจสอบสิทธิ์ล่วงหน้าจะถูกเข้ารหัสโดยใช้วิธีนี้ โครงสร้างของการประทับเวลาที่เข้ารหัสประกอบด้วยลำดับที่มีสององค์ประกอบ สิ่งแรกคือวัตถุ GeneralizedTime (KerberosTime) ในรูปแบบซูลู องค์ประกอบที่สองคือจำนวนเต็มซึ่งแสดงถึงไมโครวินาที

แต่ละองค์ประกอบมีแท็กของตัวเองและมีความยาวตามหลังค่า ด้วยเหตุนี้ เราสามารถระบุ 10 ไบต์คงที่ซึ่งแสดงถึงแท็กและความยาวทั้งหมด

  • 30 -> แท็กลำดับ
  • 1A – (int) 26 (ความยาวของโครงสร้างทั้งหมด)
  • A0 – แท็กองค์ประกอบที่ 1
  • 11 – ความยาวขององค์ประกอบ
  • 18 – สรุปแท็กเวลา
  • 0F – (int) ความยาวค่า (15)
  • A1 – แท็กองค์ประกอบที่ 2
  • 05 – (int) ความยาวขององค์ประกอบ
  • 02 – แท็กประเภท INTEGER
  • 03 – (int) ความยาวค่า

จำนวนไบต์คงที่ทั้งหมดคือ 10 เราจะเพิ่มความยาวอีก 15 ไบต์สำหรับการคาดเดาการประทับเวลา สามไบต์สุดท้ายคือองค์ประกอบไมโครวินาทีซึ่งไม่สามารถเดาได้อย่างมีประสิทธิภาพ สุดท้าย เพิ่ม 24 ไบต์ของศูนย์ก่อนที่ส่วนที่เข้ารหัสจะให้คีย์สตรีม 49 ไบต์ คีย์เซสชัน TGT อยู่ระหว่างไบต์ 46 ถึง 50 ของการตอบสนอง AS ไบต์คีย์สตรีมสุดท้ายที่ขาดหายไปอาจถูกบังคับโดยดุร้ายกับตั๋วบริการที่สกัดกั้นของเหยื่อ

ปะ

ช่องโหว่เหล่านี้ถูกปิดโดย Microsoft ในการอัปเดตความปลอดภัยในเดือนกันยายน การอัปเดตปิดใช้งานประเภทการเข้ารหัส RC4-MD4 (-128) ควบคู่ไปกับประเภทการเข้ารหัส RC4-HMAC-OLD (-133) เมื่อแพตช์แล้ว AS-REQ/TGS-REQ ในอนาคตที่ใช้หนึ่งในสองประเภทการเข้ารหัสนี้จะได้รับข้อผิดพลาด "ประเภทการเข้ารหัสที่ไม่รองรับ"

https://msrc.microsoft.com/update-guide/vulnerability/CVE-2022-33679

ข้อมูลเพิ่มเติม

https://bugs.chromium.org/p/project-zero/issues/detail?id=2310&q=label%3ACVE-2022-33647 – บทวิเคราะห์โดย James Forshaw

หยุดการคุกคามตัวตนเดี๋ยวนี้