首页 > 其他分享 >CVE-2017-1000353分析

CVE-2017-1000353分析

时间:2024-02-29 15:24:21浏览次数:28  
标签:remoting HTTP setup hudson 1000353 Jenkins 2017 CVE 通道

影响版本

Jenkins主版本<=2.56版本)
Jenkins LTS<=2.46.1版本)

漏洞分析

漏洞发生在jenkins cli采用http方式进行通信的时候,处理url为http://127.0.0.1:8080/cli,其处理逻辑在hudson.cli.CLIAction中
jenkins采用的是Stapler框架,CLIAction实现了两个接口,分别是UnprotectedRootAction, StaplerProxy
image.png

UnprotectedRootAction接口

在Stapler框架中,UnprotectedRootAction是一个标记接口,用于表示一个可以不通过Jenkins安全认证就能访问的动作(或页面)。实现了UnprotectedRootAction接口的类可以被匿名用户访问,即使Jenkins实例配置为安全模式。简单说就是这个action不需要通过Jenkins安全认证就能访问
实现UnprotectedRootAction的类通常需要提供以下方法:

  • getIconFileName():返回用于在Jenkins UI上显示的图标文件名,如果返回null,则不在UI上显示。
  • getDisplayName():返回动作的显示名称,如果返回null,则不在UI上显示。
  • getUrlName():返回动作的URL路径。这是动作可通过HTTP访问的入口点。

重点关注getUrlName(),这段代码表明如果CLI没有被禁用,可以直接通过访问<Jenkins服务器地址>/cli来与Jenkins的CLI功能交互。
image.png

StaplerProxy接口

StaplerProxy是Stapler框架中的一个接口,当一个对象实现了StaplerProxy接口,Stapler会调用该对象的getTarget()方法来获取实际处理请求的对象。
以下是hudson.cli.CLIAction#getTarget,92行判断当请求的路径是/cli,且使用的是POST方法时候,会进入94行的CliEndpointResponse内部类中
image.png

CliEndpointResponse内部类

CliEndpointResponse类继承了HttpResponseException,通过覆写的generateResponse方法来实现了自定义响应逻辑。当 CLI 请求通过 HTTP 到达 Jenkins 时,CliEndpointResponse 类中的 generateResponse 方法将响应这个请求
image.png
CliEndpointResponse 类的 generateResponse 方法实现了几个关键的逻辑点,主要用于处理Jenkins CLI通过HTTP方式的连接请求。这些关键逻辑包括:

  1. 会话标识处理:
  • UUID.fromString(req.getHeader("Session")) 从请求头中获取会话标识(Session ID),将其转换为 UUID 对象。这个UUID值在之后的逻辑中,用于区分不同的会话通道。

image.png

  1. 设置响应头:
  • rsp.setHeader("Hudson-Duplex", "") 设置响应头,告知客户端这是一个双向通信(full-duplex)通道。这个头部信息让客户端知道它可以通过这个通道进行双向通信。

image.png

  1. 通道管理:
  • 根据请求头中的 "Side" 值(download或upload)来区分是 download 还是 upload 操作。根据http头部中session里面的uuid的值来区分不同的会话通道。image.png

以下为download操作逻辑,会创建一个新的 FullDuplexHttpChannel 实例并将其存储在 duplexChannels 映射中,关联之前请求中提取的UUID。
image.png
而对于upload 上传请求,从 duplexChannels 中直接获取对应的通道实例并处理上传数据。
image.png

download操作逻辑

跟进download操作,在hudson.model.FullDuplexHttpChannel#download中,方法的整个逻辑大致如下:

  1. 设置响应状态和chunked 响应头:
  • 将HTTP响应状态设置为 200 OK。
  • 添加 Transfer-Encoding: chunked 响应头,启用HTTP分块传输编码,允许服务器发送一个尚未确定总大小的响应,通过将数据分为一系列的块(chunk)来传输。

image.png

  1. 发送初始数据:
  • 向客户端发送一些初始数据("Starting HTTP duplex channel"),表示HTTP全双工通道的建立过程已经开始

image.png

  1. 等待upload上传通道建立:
  • 进入循环,等待另一个通道(即上传通道)建立。如果在指定的超时时间内上传通道仍未建立,则抛出一个异常。

image.png

  1. 建立双向通道:
  • 一旦上传通道建立,就创建一个 Channel 实例,代表两个Java虚拟机之间的双向通信通道。upload参数就是客户端通过HTTP请求以upload为标记传入的数据流

image.png
首先跟入new Channel到hudson.remoting.Channel#Channel(hudson.remoting.ChannelBuilder, java.io.InputStream, java.io.OutputStream)中,调用构造函数,其中传入了settings.negotiate(is, os),输入流(is)就是客户端通过HTTP请求以upload为标记传入的数据流
image.png
跟入hudson.remoting.ChannelBuilder#negotiate的while逻辑,用于处理双向通信通道(Channel)的初始化过程,以下判断了前导码(preamble),通常以<=[JENKINS REMOTING CAPACITY]=>为开头
image.png
case 1中调用了makeTransport,用于协商传输机制
image.png
以下是makeTransport代码,通过cap确定是否支持分块传输(cap.supportsChunking()),返回ChunkedCommandTransport,或者ClassicCommandTransport对象image.png
回到之前的Channel对象,继续跟入直到hudson.remoting.Channel#Channel(hudson.remoting.ChannelBuilder, hudson.remoting.CommandTransport)
方法参数中transport的值为之前hudson.remoting.ChannelBuilder#makeTransport中返回的ChunkedCommandTransport或者ClassicCommandTransport对象
image.png
第520行的处理接收到的命令逻辑,调用transport.setup,传入了一个CommandReceiver对象
image.png
关于transport.setup,有两种处理方式

ChunkedCommandTransport#setup

首先来看ChunkedCommandTransport#setup的逻辑ChunkedCommandTransport的setup方法使用的是其父类hudson.remoting.SynchronousCommandTransport#setup,其中第39行调用了ReaderThread()
image.png
ReaderThread类为一个内部类,继承自Thread,启动线程后会执行run方法中的逻辑,在其59行又调用了read方法
image.png
ChunkedCommandTransport中的read方法使用的是其父类的hudson.remoting.AbstractSynchronousByteArrayCommandTransport#read
image.png
跟入Command.readFrom,看到了反序列化操作
image.png

ClassicCommandTransport#setup

跟入ClassicCommandTransport#setup中,ClassicCommandTransport#setup方法调用的也是其父类SynchronousCommandTransport的setup
image.png
和之前ChunkedCommandTransport中setup逻辑一样,都用的同一个父类的setup,启动线程后会执行run方法中的逻辑,在其59行又调用了read方法,image.png
这时候就是ClassicCommandTransport中的read方法了,以下为ClassicCommandTransport#read
image.png
跟入Command.readFrom(channel, ois),同样可以看到readObject反序列化操作
image.png

漏洞利用:

两种方式,利用分块传输,或者不分块传输都可以触发反序列化操作
这个漏洞也是基于上次补丁中黑名单的绕过,采用java.security.SignedObject类来二次反序列化,绕过黑名单中的CC链来触发漏洞
POC链接:https://github.com/vulhub/CVE-2017-1000353

标签:remoting,HTTP,setup,hudson,1000353,Jenkins,2017,CVE,通道
From: https://www.cnblogs.com/yyhuni/p/18044335

相关文章

  • [THUSCH2017] 大魔法师
    THUSCH2017]大魔法师题目描述大魔法师小L制作了$n$个魔力水晶球,每个水晶球有水、火、土三个属性的能量值。小L把这$n$个水晶球在地上从前向后排成一行,然后开始今天的魔法表演。我们用$A_i,B_i,C_i$分别表示从前向后第$i$个水晶球(下标从$1$开始)的水、火、土的能......
  • 简单看下最近的Spring Secrurity、Spring漏洞(CVE-2024-22234、CVE-2024-22243)
    最近的这两个cve我看国内很多情报将其评为高危,所以想着去看看原理,看完发现都比较简单,利用要求的场景也相对有限(特别是第一个),所以就随便看下就行了SpringSecurity用户认证绕过(CVE-2024-22234)先看下官网的公告(https://spring.io/security/cve-2024-22234)InSpringSecurit......
  • P3706 「SDOI2017」硬币游戏 解题报告
    oj:https://gxyzoj.com/d/hzoj/p/P451概率与期望+hash+高斯消元声明一些东西,pre(S,l)表示串S的长度为l的前缀,lst(S,l)表示串S的长度为l的后缀一.对于所有串建立字典树,像「HNOI2013」游走一样高斯消元,时间复杂度\(O(n^3m^3)\),预计50/70pts二.正解:显然,n项中,出现一个长度......
  • Ncast盈可视高清智能录播系统RCE漏洞(CVE-2024-0305)复现
    0x00漏洞简介Ncast盈可视高清智能录播系统是广东盈科电子公司的一款产品。该系统2017及之前版本/classes/common/busiFacade.php接口存在RCE漏洞。0x01资产测绘:zoomeye-query:title:"高清智能录播系统"fofa-query:app="Ncast-产品"&&title=="高清智能录播系统"0x02漏......
  • #分块,二分#洛谷 5356 [Ynoi2017] 由乃打扑克
    题目支持区间加和区间查询第\(k\)小分析分块之后给每个整块排序,这样修改的时候整块打标记,散块直接分开把需要加的部分暴力加之后归并,就是\(O(\sqrt{n})\)的查询的话,如果只有散块直接归并出结果,否则二分答案,加上小块合并成的整块,相当于是整体二分,就是\(O(\sqrt{n}\log{a_......
  • 2017年全年回顾
    本文理论上讲应当在2018年Q1的时候发出来,结果出于各种原因,推迟到了现在。个人收获基于SpringBoot、SpringCloud交付了多个项目,加深了对新技术的理解。上手大数据平台,在交付项目的过程中,学习HBase、Kafka、SparkSQL的调优方法,积累了一定的运维经验。学习架构设计的理论,在项目......
  • Jenkins CLI 任意文件读取漏洞(CVE-2024-23897)复现
    0x00漏洞简介Jenkins是一款基于JAVA开发的开源自动化服务器。Jenkins使用args4j来解析命令行输入,并支持通过HTTP、WebSocket等协议远程传入命令行参数。在args4j中,用户可以通过@字符来加载任意文件。这一特性存在安全风险,攻击者可以利用它来读取服务器上的任意文件。0x01影响......
  • weblogic CVE-2024-20931分析
    weblogic12.2.1.4.0安装我的环境:ubuntu22.04+weblogic12.2.1.4.0+jdk8(注:weblogic不支持OpenJDK)jdk下载安装:https://www.oracle.com/cn/java/technologies/downloads/archive/weblogic下载安装:https://www.oracle.com/middleware/technologies/weblogic-server-install......
  • 【CVE-2024-21626】容器逃逸漏洞修复
    哈喽大家好,我是咸鱼。好久不见,最近有一个很火的CVE——runc容器逃逸漏洞。年前的时候我们已经在测试环境进行了相关操作打算年后线上进行修复。因为今天咸鱼才开工,所以文章也就拖到了现在......
  • Weblogic XMLDecoder反序列化漏洞(CVE-2017-10271)复现
    0x00漏洞简介OracleFusionMiddleware(Oracle融合中间件)是美国甲骨文(Oracle)公司的一套面向企业和云环境的业务创新平台。该平台提供了中间件、软件集合等功能。OracleWebLogicServer是其中的一个适用于云环境和传统环境的应用服务器组件。OracleFusionMiddleware中的Oracle......