udf提权
0x00前言: udf提权是通过数据库来实现获取目标的管理员的shell,来达到从低权限提权到高权限 ? 0x01什么是udf: udf(Userdefined function)是用户自定义函数 在mysql中函数是什么,比如mysql中常见的sleep(),sum(),ascii()等都是函数 udf就是为了让我们开发者能够自己写方便自己函数,它有3种返回值,这三种分别是STRING,INTEGER,REAL STRING 字符型
INTEGER 整型
REAL 实数型
? 定义格式 #创建自定义函数 SONAME ‘file‘表示这个函数从哪个文件里面引入,而这个文件一般是动态链接库,windows下是dll,linux是so,并且这个文件要在mysql的plugin目录下 特别注意mysql版本如果是在5.1以下udf.dll文件在windows server 2003下放置于c:windowssystem32目录,在windows server 2000下放置在c:winntsystem32目录 如果颜删除函数,必须udf文件还存在plugin目录下 举个例子,mysql加载了udf.so文件中的某个函数,然后在没有删除这个函数前,把plugin目录下导入的这个udf.so文件利用rm命令删除了,那么这个导入mysql的函数就无法被删除,没有找到解决办法,如果后面新创的函数名字和该函数相冲突,mysql还不允许创建,所以请注意一下。(我被坑了,重装了mysql才终于把那个自定义导入的函数删掉了) ? 0x02一道CTF题目: 首先看一道jarvis OJ的一道web题目RE?,来明确如何使用用户自定义函数 https://dn.jarvisoj.com/challengefiles/udf.so.02f8981200697e5eeb661e64797fc172 题目下载下来的是一个so文件,那么明显就是针对linux系统,首先可用linux进mysql看看自己的plugin文件夹在哪 这里我ubuntu虚拟机是在/usr/lib/mysql/plugin/下,把下载的文件拖进虚拟机并copy过去 但是有个问题,我们不知道这个so文件有哪些函数怎么办(虽然题目提示有个help_me),这里可以用ida逆向工具打开这个so文件 可以看到这里面有函数的名字,于是在linux下的mysql里面先加载help_me看看效果 那么继续加载getflag这个函数(请忽略输入错误的语句.....),最终获取了flag 那么要删除这2个函数也很简单实用drop function语句即可 ? 0x03UDF利用: 回归正题,那么这几个udf提权文件从哪里来,msf和sqlmap下都有 metasploit下的动态链接库 sqlmap下的动态链接库 我在这里把metasploit下的4个文件copy出来,sqlmap下的4个udf文件是经过编码的,如果直接丢在mysql的plugin目录下是无法加载的,需要用sqlmap/extra/cloak/cloak.py进行解码 在sqlmap/extra/cloak/目录下使用以下命令,生成的udf文件就会出现在当前文件夹中 python .cloak.py -d -i ....udfmysqllinux64lib_mysqludf_sys.so_ -o linux_udf_64.so
首先可以向上面做题的时候瞧瞧这个so文件里面的函数 ?那么将文件丢到刚刚的ubuntu下,并添加udf是成功的,但是一运行的时候会断开连接 ? 我又用msf的作用于windows的udf.dll文件上,在win7的虚拟机运行,也是断开连接 最先我在思考是为什么会出现这种情况,最先怀疑udf文件能加载那么可能是mysql版本的问题,但是最后看国外的一篇udf提权的文章,最后仅简单的提了一句msf的udf文件原C++函数没有写异常处理,那么mysql加载的时候会使mysql出错导致断开连接。 然后我比较了下msf和sqlmap的udf文件,发现其实2个文件是一模一样的,也就是如果单独拿出来会在有些环境下(比如我自己的ubuntu16.04 mysql5.7和win7 phpstudy mysql5.5)的环境下会出现无法运行。 最后在解决这个问题上是,借助大马的udf提权模块能够获取windows的32位和64位的udf文件,并且能够成功运行。(大马是具体是哪个这里就不透露了,有兴趣可以去github翻翻,或者网上查查) 这个大马的udf.dll文件是20k,而msf的udf文件普遍只有7~8k,估计里面写了很多操作(可能有后门,不是很安全,所以我就不在这透露了) 至于linux如何解决,目前我还没有找到现场能直接用的文件,如果可以那么就自己写C++吧。 ? 0x04关于mysql写文件的注意: mysql有个配置是叫secure_file_priv,该参数来觉得mysql可以对哪个目录进行可写操作,在刚装的mysql上该参数是没有写的(不是为空是没有写,也就是被注释掉的) 在mysql5.5之前 secure_file_priv默认是空,这个情况下可以向任意绝对路径写文件 在mysql5.5之后 secure_file_priv默认是NULL,这个情况下不可以写文件 但是如果mysql的配置文件中添加,那么就和mysql5.5之前一样,为空,可以为任意目录写文件 而在mysql5.7后 secure_file_priv会默认一个目录,当然这个不是web的目录..... 所以现在通过mysql来写webshell是越来越困难了,但是不排除一些配置错误导致的我们“有机可乘” ? 0xff结语: 这次udf提权的学习,也让我理清一条攻击思路,如果挖到sql注入, 查数据库密码和账号,看看是不是能远程连接 mysql5.7版本之后有个system可以直接执行命令 可以通过union select 来利用load_file或者dumpfile或者outfile向绝对路径目录写webshell 拿到webshell可以连接数据库,能够写文件的话,利用udf提权 ? 参考: https://www.jianshu.com/p/5b34c1b6dee7 http://www.360doc.com/content/18/0228/22/31784658_733287732.shtml https://www.cnblogs.com/ghc666/p/8609067.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- angular – 从setTimeout Observable方法访问值
- angularjs – Angular Bootstrap Ui-select
- 在Ubuntu 16.10上安装docker
- angularjs – 如何使用Angular Js声明一个全局变量?
- 使用$on和$broadcast with angular 2
- bash,dash以及执行shell脚本的方法
- unix – 什么时候可以或应该在文件或目录上使用chmod?
- springcloud-config client配置文件为什么要用bootstrap命名
- WebService wsdl没有types的问题
- Docker Compose 原理