Jenkins RCE分析(CVE-2018-1000861)

前言

总体看下来,在没有任何插件的情况下,更像是一个越权漏洞
然后通过插件的cve去rce
参考文章有些地方没有吃透,在此做个记录

漏洞范围

  • ANONYMOUS_READ disable
    • Jenkins version < 2.138
  • ANONYMOUS_READ enable(or with a normal user account)
    • Jenkins build time < 2019-01-28

本文采用的环境为2.137

漏洞分析

动态路由

首先在WEB-INFO/web.xml中查看入口

查看org.kohsuke.stapler#service

servletPath为输入的路径,根据不同的路径到相应的语句中.这里直接进invoke方法


继续跟进tryInvoke

在此进行遍历找到相应的方法
/securityRealm/user/test为例
它会执行jenkins.model.Jenkins.getSecurityRealm() .getUser("test")
跟进dispatch方法


继续跟进发现跳转到了getSecurityRealm

之后进行递归获取节点,相关资料可以看参考

权限绕过

如果直接访问/user/test的话可以看到跳转到登录页面
但是如果使用/securityRealm/user/test就可以访问
回到之前org.kohsuke.stapler.Stapler#tryInvoke方法

跟进getTarget

发现会进行检查访问请求是否具有读的权限,
由于ANONYMOUS_READ=False
会执行isSubjectToMandatoryReadPermissionCheck

1
2
3
4
5
6
7
8
9
10
11
12
13
private static final ImmutableSet<String> ALWAYS_READABLE_PATHS = ImmutableSet.of(
"/login",
"/logout",
"/accessDenied",
"/adjuncts/",
"/error",
"/oops",
"/signup",
"/tcpSlaveAgentListener",
"/federatedLoginService/",
"/securityRealm",
"/instance-identity"
);

发现/securityRealm在白名单里有读权限

为何/securityRealm/user/test会显示/user/test的页面

这里可以我们正常登录,访问/user/test动调一下



如果访问的是/securityRealm/user/test


两者都调用了getOrCreate
返回相同页面

exp

https://github.com/orangetw/awesome-jenkins-rce-2019

参考

https://paper.seebug.org/836/
https://devco.re/blog/2019/01/16/hacking-Jenkins-part1-play-with-dynamic-routing/
https://devco.re/blog/2019/02/19/hacking-Jenkins-part2-abusing-meta-programming-for-unauthenticated-RCE/