CVE-2016-6662分析
针对MySQL Code Execution Privilege Escalation进行漏洞复现并分析。
漏洞简述
在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时会自动生成)。
修改mysql_hookandroot_lib.c第63行(攻击服务器IP)、64行(监听端口)、65行(my.cnf路径)。
运行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 |
这时候,查看/etc/mysql/my.cnf文件,发现共享库已经成功添加。
重启mysql服务,成功反弹shell。
原理分析
默认安装MySQL会自带mysql_safe脚本,启动MySQL之前加载共享库,共享库可以添加至my.cnf。
跟进/usr/bin/mysqld_safe,在第331行看到–malloc-lib=LIB 选项可以加载一个so文件。
在424行,可以看到mysqld_safe从mysql的data目录下载入配置文件my.cnf。
使用ps aux | grep mysql,查看MySQL的进程信息,发现mysqld_safe是root权限执行的,mysqld是mysql用户执行的。
在my.cnf中写入malloc_lib加载so文件的路径。
使用gcc命令将.c(shell)编译成so,并将so放置到/var/lib/mysql/目录下。
配置文件和so文件冲准备就绪,重启MySQL,root运行mysqld_safe,mysqld_safe加载so文件,则触发代码执行。
复现注意事项
- /etc/mysql/my.cnf权限设置:
1
2chown mysql:root /etc/mysql/my.cnf
chmod 600 /etc/mysql/my.cnf - 攻击会在攻击database新建一个表,表名为:poctable,如果攻击失败,重新攻击需将poctable删除。
1
2
3mysql -uroot -p;
use pocdb;(攻击database的数据库名字)
drop table poctable; - py脚本会自动运行nc,因此攻击服务器需要安装nc。
- 如果攻击端口不为3306,可以在cve-2016-6662_MySQL_RCE_exploit.py第74行增加自定义端口代码。增加完成之后,即可使用-dbport自定义端口。在第83行,增加代码将其使用。
1
2parser.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。