Escrito por Yoav Iellin e Dor Segal, pesquisadores da Silverfort
O patch de terça-feira de setembro de 2022 da Microsoft incluiu duas vulnerabilidades de elevação de privilégio de alto risco no Kerberos, que foram descobertas pelo Google Project Zero. As duas vulnerabilidades aproveitam a capacidade de forçar o Kerberos a fazer o downgrade de sua codificação da criptografia AES padrão para o MD4-RC4 desatualizado. Depois que a criptografia é rebaixada, as duas vulnerabilidades entram em ação e permitem que um invasor abuse dos pontos fracos da criptografia MD4-RC4.
O primeiro, CVE-2022-33679, permite que um invasor obtenha uma sessão autenticada em nome da vítima, o que pode levar à execução arbitrária de código. O segundo, CVE-2022-33647, permite que um invasor que já tenha conseguido realizar um ataque Man-in-the-Middle emita quaisquer tickets de serviço Kerberos em nome do usuário alvo, ganhando assim os mesmos privilégios que o usuário.
É importante observar que, embora ambas as vulnerabilidades tenham como alvo os pontos fracos da criptografia MD4-RC4 herdada, cada uma delas abusa de uma fraqueza diferente, resultando em diferentes pré-requisitos e cenários de ataque.
Este artigo inclui uma análise técnica detalhada e explicação sobre CVE-2022-33679 e CVE-2022-33647.
CVE-2022-33679 – Análise de Vulnerabilidade
A vulnerabilidade CVE-2022-33679, para o qual uma prova de conceito foi recentemente liberado, reside em como o Kerberos criptografa sua chave de sessão e é possível pelo uso do Kerberos se o tipo de criptografia RC4-MD4 estiver desatualizado. O ataque consiste em duas partes: A) solicitação de novo ticket TGT usando o tipo RC4-MD4 seguido por B) uma quebra byte por byte do fluxo de chaves.
Processo de exploração:
- Obtenha o ticket TGT enviando o pacote AS-REQ para o servidor KDC. a solicitação deve solicitar o tipo de criptografia RC4-MD4. Para que o ataque seja bem-sucedido, os dois requisitos a seguir devem ser atendidos:
- Faça o downgrade explicitamente da criptografia Kerberos de seu AES padrão ou do RC4-MD4 mais fraco. Isso torna o ataque possível porque sua chave tem apenas 8 bytes sem IV ou salt.
- O sinalizador “Não requer pré-autenticação Kerberos” do objeto do usuário está ativado. Isto permite obter um TGT com uma chave de sessão criptografada sem a necessidade de saber a senha do usuário. Pré autenticação é um mecanismo onde o cliente criptografa o carimbo de data/hora atual com a senha inserida e o envia ao KDC onde valida a integridade da senha antes de gerar uma chave de sessão e um TGT. Devido ao sinalizador “Não requer pré-autenticação Kerberos”, o KDC pode ser direcionado diretamente e não requer nenhuma técnica de ataque especial, como Man In The Middle.
- Depois que o invasor obtém com sucesso um ticket criptografado, o pacote AS-REP consiste em uma chave de sessão TGT criptografada com 40 bits de comprimento. Usando o tipo de criptografia RC4-MD4 desatualizado, o invasor pode aproveitar seu conhecimento do início fixo do pacote criptografado para extrair 45 bytes do fluxo de chaves.
- Agora o invasor pode usar esse fluxo de chaves para criptografar novamente e solicitar um ticket TGT do KDC com uma pré-autenticação personalizada que será usada para verificar se o fluxo de chaves está correto e quebrar o restante da seguinte chave de sessão TGT de 40 bits byte por byte. Isso é feito abusando de dois pontos fracos no protocolo ASN.1 usado para codificação Kerberos, para aproveitar o controle limitado do invasor sobre o tamanho do campo de pré-autenticação:
- O analisador KDC ignora strings terminadas em NUL no final do objeto. Isso nos permite adicionar um caractere NUL no final do objeto KerberosTime. Isso funcionará para adivinhar um único byte, mas ainda precisamos adivinhar quatro bytes adicionais.
- O analisador KDC não valida o comprimento dos comprimentos codificados. Os comprimentos de string ASN.1 são representados por 1 a 4 bytes e o analisador KDC ASN.1 não impõe o caminho mais curto. Portanto, podemos representar o comprimento da string de carimbo de data/hora com um tamanho de 1 a 4 bytes, conforme desejarmos. Isso significa que podemos aumentar ainda mais o comprimento do texto simples e empurrar o byte NUL para a próxima posição e adivinhar o próximo byte do fluxo de chaves.
- Por último, o invasor pode criptografar novamente o carimbo de data/hora e validar cada suposição enviando um AS-REQ com pré-autenticação criptografada e receberá um erro se a data de pré-autenticação criptografada estiver incorreta. Caso a pré-autenticação seja bem-sucedida, o invasor será capaz de descobrir outro byte do fluxo de chaves, pois há até 256 opções de adivinhação para cada byte. A repetição desse processo permite obter todos os bytes de fluxo de chaves necessários para descriptografar a chave de sessão armazenada no ticket original.
A chave de sessão obtida dá ao invasor a capacidade de solicitar um ticket para qualquer SPN em nome do usuário visado.
CVE-2022-33647 Análise Técnica
Felizmente para o invasor, a vulnerabilidade CVE-2022-33647 funciona com pré-autenticação, ao contrário da CVE-2022-33679. Isso é importante porque a pré-autenticação está habilitada por padrão para cada objeto criado no Active Directory. O principal requisito para este ataque é um Man-In-The-Middle entre o cliente e o controlador de domínio (este tipo de ataque é comum e há muitas maneiras de alcançá-lo, como falsificação de DNS, envenenamento de ARP, etc.). O MITM é usado para forçar o cliente a fazer downgrade da criptografia para MD4-RC4.
Fluxo de exploração
Quando a primeira solicitação AS é enviada do cliente, o KDC responde com a mensagem 'pré-autenticação necessária'. Porém, o invasor pode alterar a resposta do KDC porque nesta fase da autenticação não há verificação. Modificaremos a criptografia suportada pelo KDC para RC4-MD4 conforme mostrado na figura. Como resultado, (se RC4 estiver habilitado), o cliente enviará um AS_REQ com pré-autenticação usando o algoritmo MD4-RC4.
A partir deste ponto, o invasor tem duas opções:
- Força bruta na chave de sessão de 5 bytes, o que pode não ser tão eficiente e pode levar muito tempo.
- A outra opção é aproveitar o conhecimento dos dados de texto simples - a pré-autenticação. No Kebreros, o adversário MITM pode ter uma estimativa precisa do carimbo de data / hora de pré-autenticação de texto simples criado pelo cliente na solicitação AS. O mecanismo de criptografia não possui um vetor de inicialização ou nonce e ignora o valor de uso da chave. Como resultado, o mesmo fluxo de chaves é usado em diferentes partes da troca de autenticação. Portanto, a maior parte do fluxo de chaves usa o mesmo fluxo de chaves RC4. A pré-autenticação contém um carimbo de data/hora criptografado, portanto, usando nosso conhecimento da hora atual, o invasor pode descobrir parte do fluxo de chaves. Se o invasor tiver sorte, o mesmo fluxo de chaves será usado para descriptografar 4 bytes da chave da sessão TGT na resposta AS. O último byte se sobrepõe ao menor byte do carimbo de data/hora, que representa microssegundos, que são desconhecidos para o invasor. O último byte será quebrado em um ataque de força bruta contra uma solicitação de TGS realizada pela vítima, conforme descrito abaixo.
Ampliar serialização ASN.1
A codificação ASN.1 DER é um sistema de codificação de tag, comprimento e valor para cada elemento. O carimbo de data/hora de pré-autenticação é codificado usando este método. A estrutura do timestamp codificado consiste em uma sequência com dois elementos. O primeiro, um objeto GeneralizedTime (KerberosTime) em formato Zulu. O segundo elemento é um número inteiro que representa os microssegundos.
Cada elemento possui sua própria tag e comprimento seguindo o valor. Por este motivo, podemos identificar 10 bytes constantes que representam todas as tags e comprimentos.
- 30 -> Tag de sequência
- 1A – (int) 26 (comprimento de toda a estrutura)
- A0 – tag do 1º elemento
- 11 – comprimento do elemento
- 18 – Generalize o time tag
- 0F – (int) comprimento do valor (15)
- A1 – tag do 2º elemento
- 05 – (int) comprimento do elemento
- 02 – Tag tipo INTEGER
- 03 – (int) comprimento do valor
A quantidade total de bytes constantes é 10, adicionaremos mais 15 bytes de comprimento para adivinhar o carimbo de data/hora. Os últimos três bytes são o elemento microssegundos que não é eficiente para adivinhar. Finalmente, 24 bytes adicionais de zeros antes da parte criptografada fornecerão um fluxo de chaves de 49 bytes. A chave de sessão TGT está localizada entre os bytes 46 a 50 da resposta AS. O último byte do fluxo de chave ausente pode ser forçado com força bruta contra um ticket de serviço interceptado da vítima.
Remendo
Essas vulnerabilidades foram eliminadas pela Microsoft na atualização de segurança de setembro. A atualização desativou o tipo de criptografia RC4-MD4 (-128) juntamente com o tipo de criptografia RC4-HMAC-OLD (-133). Uma vez corrigido, futuros AS-REQ/TGS-REQ usando um desses dois tipos de criptografia receberão o erro “Tipo de criptografia não suportado”.
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2022-33679
Informação adicional
https://bugs.chromium.org/p/project-zero/issues/detail?id=2310&q=label%3ACVE-2022-33647 – análise de James Forshaw