CVE-2022-33679 및 CVE-2022-33647 Kerberos 취약점에 대한 기술적 분석

» 블로그 » CVE-2022-33679 및 CVE-2022-33647 Kerberos 취약점에 대한 기술적 분석

Yoav Iellin과 Dor Segal, 연구원 Silverfort

Microsoft의 2022년 4월 패치 화요일에는 Google Project Zero에서 발견된 Kerberos의 고위험 권한 상승 취약점 4개가 포함되었습니다. 두 취약점은 Kerberos가 기본 AES 암호화에서 오래된 MD4-RC4로 인코딩을 다운그레이드하도록 하는 기능을 이용합니다. 암호화가 다운그레이드되면 두 가지 취약점이 작용하여 공격자가 MDXNUMX-RCXNUMX 암호화의 약점을 악용할 수 있습니다.

첫 번째는 CVE-2022-33679로 공격자가 피해자를 대신하여 인증된 세션을 얻을 수 있도록 허용하여 임의 코드 실행으로 이어질 수 있습니다. 두 번째 CVE-2022-33647은 중간자 공격에 이미 성공한 공격자가 대상 사용자를 대신하여 Kerberos 서비스 티켓을 발급할 수 있도록 허용하여 사용자와 동일한 권한을 얻습니다.

두 취약점 모두 레거시 MD4-RC4 암호화의 약점을 대상으로 하지만 각각 다른 취약점을 악용하므로 전제 조건과 공격 시나리오가 다릅니다.

이 문서에는 CVE-2022-33679 및 CVE-2022-33647에 대한 자세한 기술 분석 및 설명이 포함되어 있습니다.

CVE-2022-33679 – 취약점 분석

취약점 CVE-2022-33679, 최근에 개념 증명이 출시, Kerberos가 세션 키를 암호화하는 방법에 상주하며 오래된 RC4-MD4 암호화 유형인 경우 Kerberos의 사용으로 가능해집니다. 공격은 A) RC4-MD4 etype을 사용하여 새 TGT 티켓을 요청하고 B) 키 스트림을 한 바이트씩 분할하는 두 부분으로 구성됩니다.

착취 과정:

  1. AS-REQ 패킷을 KDC 서버로 전송하여 TGT 티켓을 얻습니다. 요청은 RC4-MD4 암호화 유형을 요청해야 합니다. 공격이 성공하려면 다음 두 가지 요구 사항이 충족되어야 합니다.
    1. Kerberos 암호화를 기본 AES에서 더 약한 RC4-MD4로 명시적으로 다운그레이드합니다. 키가 IV나 솔트가 없는 8바이트에 불과하기 때문에 공격이 가능합니다.  
    2. 사용자 개체의 "Kerberos 사전 인증이 필요하지 않음" 플래그가 활성화되었습니다. 이를 통해 사용자의 비밀번호를 알 필요 없이 암호화된 세션 키로 TGT를 얻을 수 있습니다. 사전 인증 클라이언트가 입력된 비밀번호로 현재 타임스탬프를 암호화하고 KDC로 전송하여 세션 키와 TGT를 생성하기 전에 비밀번호의 무결성을 검증하는 메커니즘입니다. "Kerberos 사전 인증이 필요하지 않음" 플래그로 인해 KDC를 직접 대상으로 삼을 수 있으며 Man In The Middle과 같은 특별한 공격 기술이 필요하지 않습니다.
  2. 공격자가 성공적으로 암호화된 티켓을 얻은 후 AS-REP 패킷은 40비트 길이의 암호화된 TGT 세션 키로 구성됩니다. 오래된 RC4-MD4 암호화 유형을 사용하여 공격자는 암호화된 패킷의 고정 시작에 대한 지식을 활용하여 키 스트림의 45바이트를 추출할 수 있습니다.
  3. 이제 공격자는 이 키 스트림을 사용하여 키 스트림이 올바른지 여부를 확인하고 다음 40비트 TGT 세션 키의 나머지 부분을 깨는 데 사용되는 맞춤형 사전 인증을 사용하여 KDC에서 TGT 티켓을 재암호화하고 요청할 수 있습니다. 바이트 단위로. 이는 Kerberos 인코딩에 사용되는 ASN.1 프로토콜의 두 가지 약점을 악용하여 사전 인증 필드 크기에 대한 공격자의 제한된 제어를 활용함으로써 수행됩니다.
    1. KDC 파서는 개체 끝에서 NUL 종료 문자열을 무시합니다. 이렇게 하면 KerberosTime 개체 끝에 NUL 문자를 추가할 수 있습니다. 이것은 XNUMX바이트 추측에 대해 작동하지만 추가로 XNUMX바이트를 추측해야 합니다.
    2. KDC 구문 분석기는 인코딩된 길이의 길이를 확인하지 않습니다. ASN.1 문자열 길이는 1-4바이트로 표시되며 KDC ASN.1 파서는 최단 방법을 적용하지 않습니다. 따라서 원하는 대로 1-4바이트 크기로 타임스탬프 문자열 길이를 나타낼 수 있습니다. 이는 일반 텍스트의 길이를 훨씬 더 확대하고 NUL 바이트를 다음 위치로 푸시하고 키 스트림의 다음 바이트를 추측할 수 있음을 의미합니다.
  4. 마지막으로 공격자는 타임스탬프를 다시 암호화하고 암호화된 사전 인증과 함께 AS-REQ를 전송하여 각 추측의 유효성을 검사할 수 있으며 암호화된 사전 인증 날짜가 올바르지 않으면 오류를 수신하게 됩니다. 사전 인증이 성공한 경우 각 바이트에 대해 최대 256개의 추측 옵션이 있으므로 공격자는 키스트림에서 다른 바이트를 발견할 수 있습니다. 이 프로세스를 반복하면 원래 티켓에 저장된 세션 키를 해독하는 데 필요한 모든 키 스트림 바이트를 얻을 수 있습니다.

획득한 세션 키를 통해 공격자는 대상 사용자를 대신하여 모든 SPN에 대한 티켓을 요청할 수 있습니다.

CVE-2022-33679를 사용하여 AS-REQ 세션 키의 첫 번째 바이트를 깨는 흐름. 나머지 바이트가 뒤에 와야 합니다.
지속적인 공격 흐름, 마지막 바이트를 깨고 깨진 세션 키를 사용하여 새로운 TGT 획득
출처: James Forshaw의 POC 및 GhostPack의 Rubeus

CVE-2022-33647 기술적 분석

공격자에게 다행스럽게도 CVE-2022-33647 취약점은 CVE-2022-33679와 달리 사전 인증에서 작동합니다. 이는 다음에서 생성된 모든 객체에 대해 사전 인증이 기본적으로 활성화되기 때문에 중요합니다. Active Directory. 이 공격의 주요 요구 사항은 클라이언트와 도메인 컨트롤러 간의 중간자입니다(이 공격 유형은 일반적이며 DNS 스푸핑, ARP 포이즈닝 등과 같이 이를 달성하는 방법은 많습니다). MITM은 클라이언트가 암호화를 MD4-RC4로 다운그레이드하도록 강제하는 데 사용됩니다.

착취 흐름

클라이언트에서 첫 번째 AS 요청을 보내면 KDC는 'pre-auth is required' 메시지로 응답합니다. 그러나 이 인증 단계에서는 검증이 없기 때문에 공격자는 KDC의 응답을 변경할 수 있습니다. 그림과 같이 KDC에서 지원하는 암호화를 RC4-MD4로 수정합니다. 결과적으로 (RC4가 활성화된 경우) 클라이언트는 MD4-RC4 알고리즘을 사용하여 사전 인증으로 AS_REQ를 보냅니다.

이 시점에서 공격자는 두 가지 옵션이 있습니다.

  1. 효율적이지 않고 시간이 오래 걸릴 수 있는 5바이트 ​​세션 키를 무차별 대입합니다.
  2. 다른 옵션은 일반 텍스트 데이터(사전 인증)에 대한 지식을 활용하는 것입니다. Kebreros에서 MITM 공격자는 AS 요청에서 클라이언트가 생성한 일반 텍스트 사전 인증 타임스탬프를 정확하게 추정할 수 있습니다. 암호화 메커니즘에는 초기화 벡터 또는 nonce가 없으며 키 사용 값을 무시합니다. 결과적으로 동일한 키 스트림이 인증 교환의 다른 부분에서 사용됩니다. 따라서 대부분의 키 스트림은 동일한 RC4 키 스트림을 사용합니다. 사전 인증에는 암호화된 타임스탬프가 포함되어 있으므로 현재 시간에 대한 지식을 사용하여 공격자가 키스트림의 일부를 발견할 수 있습니다. 공격자가 운이 좋다면 동일한 키스트림을 사용하여 AS 응답에서 TGT 세션 키의 4바이트를 해독합니다. 마지막 바이트는 공격자가 알 수 없는 마이크로초를 나타내는 타임스탬프의 최소 바이트와 겹칩니다. 마지막 바이트는 아래에 설명된 대로 피해자의 달성된 TGS 요청에 대한 무차별 대입 공격에서 깨집니다.

ASN.1 직렬화 확대

ASN.1 DER 인코딩은 각 요소에 대한 태그, 길이, 값 인코딩 시스템입니다. 사전 인증 타임스탬프는 이 방법을 사용하여 인코딩됩니다. 인코딩된 타임스탬프의 구조는 두 개의 요소가 있는 시퀀스로 구성됩니다. 첫 번째는 Zulu 형식의 GeneralizedTime 개체(KerberosTime)입니다. 두 번째 요소는 마이크로초를 나타내는 정수입니다.

각 요소에는 값 뒤에 고유한 태그와 길이가 있습니다. 이러한 이유로 모든 태그와 길이를 나타내는 10개의 상수 바이트를 식별할 수 있습니다.

  • 30 -> 시퀀스 태그
  • 1A – (정수) 26(전체 구조의 길이)
  • A0 – 첫 번째 요소 태그
  • 11 – 요소 길이
  • 18 – 시간 태그 일반화
  • 0F – (int) 값 길이(15)
  • A1 – 두 번째 요소 태그
  • 05 – (int) 요소 길이
  • 02 – INTEGER 유형 태그
  • 03 – (int) 값 길이

상수 바이트의 총량은 10이며, 타임스탬프를 추측하기 위해 15바이트 길이를 추가합니다. 마지막 24바이트는 추측하기에 효율적이지 않은 마이크로초 요소입니다. 마지막으로 암호화된 부분 앞의 추가 49바이트 46은 50바이트의 키 스트림을 제공합니다. TGT 세션 키는 AS 응답의 바이트 XNUMX~XNUMX 사이에 있습니다. 마지막으로 누락된 키 스트림 바이트는 가로챈 피해자의 서비스 티켓에 대해 무차별 공격을 받을 수 있습니다.

패치

이 취약점은 4월 보안 업데이트에서 Microsoft에 의해 폐쇄되었습니다. 이 업데이트는 RC4-HMAC-OLD(-128) 암호화 유형과 함께 RC4-MD133(-XNUMX) 암호화 유형을 비활성화했습니다. 패치가 적용되면 이 두 가지 암호화 유형 중 하나를 사용하는 향후 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의 분석

인증 공격 막기