udf提权
0x00前言:
udf提权是通过数据库来实现获取目标的管理员的shell,来达到从低权限提权到高权限
0x01什么是udf:
udf(Userdefined function)是用户自定义函数
在mysql中函数是什么,比如mysql中常见的sleep(),sum(),ascii()等都是函数
udf就是为了让我们开发者能够自己写方便自己函数,它有3种返回值,这三种分别是STRING,INTEGER,REAL
STRING 字符型
INTEGER 整型
REAL 实数型
定义格式
#创建自定义函数
CREATE [AGGREGATE] FUNCTION function_name RETURNS {STRING|INTEGER|REAL} SONAME '文件名'
[AGGREATE]是聚集函数的表示,系统定义的聚集函数比如有COUNT()、AVE()、MN()、MAX()、SUM()
SONAME 'file'表示这个函数从哪个文件里面引入,而这个文件一般是动态链接库,windows下是dll,linux是so,并且这个文件要在mysql的plugin目录下 #删除自定义函数
DROP FUNCTION function_name
特别注意mysql版本如果是在5.1以下udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录
如果颜删除函数,必须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 ..\..\udf\mysql\linux\64\lib_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
udf提权的更多相关文章
- udf提权方法和出现问题汇总
一.适用条件 1.目标系统是Windows(Win2000,XP,Win2003): 2.你已经拥有MYSQL的某个用户账号,此账号必须有对mysql的insert和delete权限以创建和抛弃函数( ...
- udf提权原理详解
0x00-前言 这个udf提权复现搞了三天,终于搞出来了.网上的教程对于初学者不太友好,以至于我一直迷迷糊糊的,走了不少弯路.下面就来总结一下我的理解. 想要知道udf提权是怎么回事,首先要先知道ud ...
- SQLMAP UDF提权
SQLMAP UDF提权 1.连接mysql数据打开一个交互shell: sqlmap.py -d mysql://root:root@127.0.0.1:3306/test --sql-s ...
- [视频]K8飞刀 mysql注入点拿shell & UDF提权教程
[视频]K8飞刀 mysql注入点拿shell & UDF提权教程 链接: https://pan.baidu.com/s/1a7u_uJNF6SReDbfVtAotIw 提取码: ka5m
- MySQL的system命令在渗透测试中的使用以及UDF提权
声明:下面引用关于SYSTEM的东西是自己之前的内容,是自己没有研究透导致的错误结论:有了错就要改,做技术的不能弄虚作假,时时刻刻要求自己要谨慎,虽然我的博客没人看,但是也要向所有已经看到的人道歉,错 ...
- 疑难杂症----udf提权无法导出.dll
昨天进行测试一个网站,进行udf提权时候,没办法导出.dll, 起初以为是这个马的问题,后来用专用马,一样不行,但是有报错了,有上网找了半天,终于被我找到了. Mysql数据库从文件导入或导出到文件, ...
- mysql udf提权实战测试
根据前天对大牛们的资料学习,进行一次mysql udf提权测试. 测试环境: 受害者系统:centos 7.7 ,docker部署mysql5.6.46, IP:192.168.226.128 攻击者 ...
- [提权]mysql中的UDF提权
由于udf提权是需要构造UDF函数文件的,涉及到了写文件.所以本次实验已经将mysql的配置做了改动:–secure-file-priv=''. 剧情须知: secure_file_priv 为 NU ...
- mysql UDF提权问题
测试UDF提权,时候遇到问题,创建函数shell提示存在 当执行操作的时候又提示,shell函数不存在. FUNCTION mysql.shell does not exist 如果在测试环境下,一般 ...
随机推荐
- Logstash替换字符串,解析json数据,修改数据类型,获取日志时间
在某些情况下,有些日志文本文件类json,但它的是单引号,具体格式如下,我们需要根据下列日志数据,获取正确的字段和字段类型 {'usdCnyRate': '6.728', 'futureIndex': ...
- JavaScript中大数相加的解法
一.两个大正整数字符串相加 在JavaScript中,数值类型满足不了大数据容量计算,可以用字符串进行操作 function add(strNum1, strNum2) { // 将传进来的数字/数字 ...
- Entity Framework入门教程(12)--- EF进行批量添加/删除
EF6添加了批量添加/删除实体集合的方法,我们可以使用DbSet.AddRange()方法将实体集合添加到上下文,同时实体集合中的每一个实体的状态都标记为Added,在执行SaveChange()方法 ...
- velocity 新手用小常识--开源,简单易上手
项目中经常用到的 .vm 后缀文件是什么? 基于 java 的 velocity 模版引擎的一种页面控制文件,是一些类似 html 语句和一种叫 VLT 的语句构成 velocity --美 [v ...
- windows服务器基本管理及服务搭建
windows服务器基本管理及服务搭建 ****windows服务器系统版本:2000 2003 2008 2012 1.用户与组管理 用户:账户=账号/用户名+密码 每个账户有自己唯一的SID 账户 ...
- Java中谈尾递归--尾递归和垃圾回收的比较
一.首先我们讲讲递归 1.递归的本质是,某个方法中调用了自身,本质还是调用了一个方法,只是这个方法正好是自身而已 2.递归因为是在自身中调用自身,所以会带来以下三个显著特点: 1.调用的是同一个 ...
- ERROR [main] master.HMasterCommandLine Master exiting
2018-05-18 07:07:26,257 INFO [main-SendThread(localhost:2181)] zookeeper.ClientCnxn: Opening socket ...
- JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)
相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技术 ...
- NB卡开卡注意事项【转】
转自:https://blog.csdn.net/cheng401733277/article/details/83276436 版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...
- css :root 选择器
:root css 伪类匹配文档的根元素. 对于 HTML 来说, :root 表示<html>元素,除了优先级更高之外,与 html 选择器相同. 在声明全局 css 变量时 :root ...