
UFD提权
一、什么是udf
udf 全称为:user defined function,意为用户自定义函数;用户可以添加自定义的新函数到Mysql中,以达到功能的扩充,调用方式与一般系统自带的函数相同,例如 contact(),user(),version()等函数。
udf 文件后缀一般为 dll,由C、C++编写
二、udf在渗透中的作用
在一般渗透过程中,拿下一台windows服务器的webshell时,由于webshell权限较低,有些操作无法进行,而此时本地恰好存在mysql数据库,那么udf可能就派上用场了;由于windows安装的mysql进程一般都拥有管理员权限,这就意味着用户自定义的函数也拥有管理员权限,我们也就拥有了执行管理员命令的权限,这时新建管理员用户等操作也就轻而易举了,大多数人称为这一操作为udf提权,其实表达不够准确,应该称为通过mysql获得管理员权限。
三、利用条件
利用udf的条件其实还是挺苛刻的
mysql用户权限问题
获得一个数据库账号,拥有对MySQL的insert和delete权限。以root为佳。
拥有将udf.dll写入相应目录的权限。
四、数据库版本问题
udf利用的其中一步,是要将我们的xxx.dll文件上传到mysql检索目录中,mysql各版本的检索目录有所不同:
版本 路径
MySQL < 5.0 导出路径随意;
5.0 <= MySQL< 5.1 需要导出至目标服务器的系统目录(如:c:/windows/system32/)
5.1 < MySQL 必须导出到MySQL安装目录下的lib\plugin文件夹下
五、本地利用过程
1、获取Mysql安装路径
2、select @basedir
查看可操作路径
show global variables like “%secure%”
secure_file_priv值为null,表示mysql不允许导入导出,此时我们只能通过别的方法将udf.dll写入安装路径
3、查看plugin目录路径
select @@plugin_dir
4、将dll上传方式推荐几种
将dll上传到安装路径的方式:
通过webshell上传
以hex方式直接上传
sqlmap中现有的udf文件,分为32位和64位,一定要选择对版本,获取sqlmap的udf方式
5、sqlmap中udf获取方式
自动化注入工具Sqlmap已经集成了此功能。
在 \sqlmap\data\udf\mysql\windows\64目录下存放着lib_mysqludf_sys.dll_
可以利用sqlmap 自带的解码工具cloak.py,在sqlmap\extra\cloak中打开命令行,来对lib_mysqludf_sys.dll_进行解码在,然后在直接利用,输入下面的
cloak.py -d -i C:\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_
接着就会在\sqlmap\data\udf\mysql\windows\64目录下生成一个dll的文件lib_mysqludf_sys.dll,这个我们就可以直接拿来利用
攻击者可以利用lib_mysqludf_sys提供的函数执行系统命令。
函数:
sys_eval,执行任意命令,并将输出返回。
sys_exec,执行任意命令,并将退出码返回。
sys_get,获取一个环境变量。
sys_set,创建或修改一个环境变量。
以我windows系统为例,mysql版本为MySQL5.7.26
注意:攻击过程中,首先需要将lib_mysqludf_sys ( 目标为windows时,lib_mysqludf_sys.dll;linux时,lib_mysqludf_sys.so)上传到数据库能访问的路径下。
这里我改了个名字
打开mysql执行以下语句:
create function sys_eval returns string soname 'udf.dll'
执行成功,现在执行语句可查看ip
select sys_eval('ipconfig')
六、实战情况
为了将这个转换为十六进制,可以借助mysql中的hex函数,先将udf.dll移动到C盘中,这样路径也清晰一些,然后执行下面命令
select hex(load_file('C:/udf.dll')) into dumpfile 'c:/udf.txt'
成功生成了十六进制形式流!
后面还有很多好玩的内容,大家可以自行去琢磨研究,感谢大家!
- 本文标题:UDF提权
- 创建时间:2023-08-21 09:07:35
- 本文链接:2023/08/21/UDF提权/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!