CVE-2020-7799 FusionAuth远程代码执行漏洞复现
从零开始搭建环境,需要mysql和elasticsearch 支持
Part 1 环境搭建
环境介绍
此处搭建的环境由于一些其他原因需要全部开机自启
- centos7
- mysql5.7
- fusionauth 1.10.0
mysql 安装
- 下载MySQL源安装包
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
- 安装MySQL源
yum localinstall mysql57-community-release-el7-8.noarch.rpm
- 检查源是否安装成功
yum repolist enabled | grep "mysql.*-community.*"
- 安装MySQL
yum install mysql-community-server
- 启动MySQL
systemctl start mysqld
- 设置开机自启
sudo systemctl enable mysqld
sudo systemctl daemon-reload
- 修改/etc/my.cnf文件并重启
validate_password = off
— 如果不需要密码策略,添加my.cnf文件中添加此配置禁用即可systemctl restart mysqld
— 重启服务
- 修改密码
grep 'temporary password' /var/log/mysqld.log
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
— 修改密码,方便测试
elasticsearch安装
下载地址:
<https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.1-linux-x86_64.tar.gz>
解压文件到/usrlocal/目录下,并在解压后的elasticsearch目录下创建数据data目录
tar -avxf elasticsearch-7.1.1-linux-x86_64.tar.gz -C /usr/local/
cd /usr/local/elasticsearch-7.1.1
mkdir data
修改配置文件 ./config/elasticsearch.yml
- 修改完毕后保存退出
根据自己服务器的配置修改内存,默认是1G
elasticsearch不可使用root账户直接启动,创建es账户
adduser es
- 设置密码
passwd es
修改改es所在目录的所属用户
chown es /usr/local/elasticsearch-7.1.1/ -R
- 注:这里不修改,后面会出现权限问题
vim 编辑 /etc/security/limits.conf,在末尾加上
vim 编辑 vim /etc/security/limits.d/20-nproc.conf,将* 改为用户名(es)
vim 编辑 /etc/sysctl.conf,在末尾加上
执行
sysctl -p
此时切换到新建的用户,执行bin目录下的elasticsearch脚本即可成功,访问如图
设置开机启动
此处使用chkconfig方式
在 /etc/init.d 目录下,创建脚本文件 elasticsearch
vim /etc/init.d/elasticsearch
将以下代码插入脚本中,其中es目录和java环境以及新建的用户名自行修改,java环境请使用jdk1.8.0_171
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39!/bin/sh
chkconfig: 2345 80 05
description: elasticsearch
export JAVA_HOME=/usr/local/java/jdk1.8.0_171
export JAVA_BIN=/usr/local/java/jdk1.8.0_171/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
case "$1" in
start)
su - es<<!
cd /usr/local/elasticsearch-7.1.1
./bin/elasticsearch -d
!
echo "elasticsearch startup"
;;
stop)
es_pid=`ps aux|grep elasticsearch | grep -v 'grep elasticsearch' | awk '{print $2}'`
kill -9 $es_pid
echo "elasticsearch stopped"
;;
restart)
es_pid=`ps aux|grep elasticsearch | grep -v 'grep elasticsearch' | awk '{print $2}'`
kill -9 $es_pid
echo "elasticsearch stopped"
su - es<<!
cd /usr/local/elasticsearch-7.1.1
./bin/elasticsearch -d
!
echo "elasticsearch startup"
;;
*)
echo "start|stop|restart"
;;
esac
exit $?保存退出后,赋予执行权限
chmod +x elasticsearch
添加到开机启动任务
chkconfig --add elasticsearch
fusionauth安装
1.10.0下载地址:
https://storage.googleapis.com/inversoft_products_j098230498/products/fusionauth/1.10.0/fusionauth-app-1.10.0.zip
解压完成后可直接,执行./bin下的startup.sh配置安装,此处如果java没加入环境变量,会自动下载配置,版本和elasticsearch一致
配置开机自启,由于是sh脚本,在/etc/rc.d/rc.local添加如下
确保rc.local具有执行权限
chmod +x rc.local
查看端口情况
环境配置
配置正确的话elasticsearch会自动检测
配置用户
成功登录
Part 2 漏洞复现
在Settings->Email Templates->…
- 点击Preview抓包
- 替换payload
- 将emailTemplate.defaultHtmlTemplate的value修成如下
${"freemarker.template.utility.Execute"?new()("whoami")}
Part 3 centos下反弹shell
经过测试,在传参位置,&无法使用;并且<>被编码,如下
linux一般存在curl,查找一下
可使用curl下载写好的centos计划任务文件,或者直接下载木马反弹,试了下计划任务可以
本地启个服务
执行下载命令
修改权限
移动到/var/spool/cron目录下
成功弹回shell
后记
主要还是环境的搭建,三种问题
- 权限问题
- elasticsearch的启动用户问题
- 数据库及es的运行内存问题