CVE-2016-6662分析

针对MySQL Code Execution Privilege Escalation进行漏洞复现并分析。
success.png

漏洞简述

在MySQL / MariaDB / PerconaDB 5.5.52 / 5.6.33 / 5.7.15等版本中,默认安装MySQL使用自带mysqld_safe脚本启动mysql服务进程,在启动mysql server之前预加载共享库文件,共享库文件可被添加至my.cnf。

漏洞分析

复现过程

下载cve-2016-6662_MySQL_RCE_exploit.py和mysql_hookandroot_lib.c,并放同一目录下(.so文件运行py时会自动生成)。
download.png
修改mysql_hookandroot_lib.c第63行(攻击服务器IP)、64行(监听端口)、65行(my.cnf路径)。
1.png
运行py脚本。

1
python cve-2016-6662_MySQL_RCE_exploit.py -dbuser root -dbpass '' -dbname pocdb -dbhost 127.0.0.1 -mycnf /etc/mysql/my.cnf

2.png
这时候,查看/etc/mysql/my.cnf文件,发现共享库已经成功添加。
3.png
重启mysql服务,成功反弹shell。
3.png

原理分析

默认安装MySQL会自带mysql_safe脚本,启动MySQL之前加载共享库,共享库可以添加至my.cnf。
跟进/usr/bin/mysqld_safe,在第331行看到–malloc-lib=LIB 选项可以加载一个so文件。
safe mysql.png
在424行,可以看到mysqld_safe从mysql的data目录下载入配置文件my.cnf。
my.cnf.png
使用ps aux | grep mysql,查看MySQL的进程信息,发现mysqld_safe是root权限执行的,mysqld是mysql用户执行的。
ps aux.png
在my.cnf中写入malloc_lib加载so文件的路径。
malloc.png
使用gcc命令将.c(shell)编译成so,并将so放置到/var/lib/mysql/目录下。
gcc.png
配置文件和so文件冲准备就绪,重启MySQL,root运行mysqld_safe,mysqld_safe加载so文件,则触发代码执行。

复现注意事项

  1. /etc/mysql/my.cnf权限设置:1-1.png
    1
    2
    chown mysql:root /etc/mysql/my.cnf
    chmod 600 /etc/mysql/my.cnf
  2. 攻击会在攻击database新建一个表,表名为:poctable,如果攻击失败,重新攻击需将poctable删除。2-2.png
    1
    2
    3
    mysql -uroot -p;
    use pocdb;(攻击database的数据库名字)
    drop table poctable;
  3. py脚本会自动运行nc,因此攻击服务器需要安装nc。
  4. 如果攻击端口不为3306,可以在cve-2016-6662_MySQL_RCE_exploit.py第74行增加自定义端口代码。增加完成之后,即可使用-dbport自定义端口。在第83行,增加代码将其使用。3-3.png4-4.png
    1
    2
    parser.add_argument('-dbport', dest='TARGET_PORT', required=True, help='MySQL port') # 74行
    dbconn = mysql.connector.connect(user=args.TARGET_USER, password =args.TARGET_PASS, database=args.TARGET_DB, host=args.TARGET_HOST, port=args.TARGET_PORT) # 83行

修复建议

升级MySQL。